根据大家的要求,添加一些解释。
首先,PyqT5中自带滑块配件,分为水平方向和竖直方向两种滑块。有时候也叫拖动条,不管怎么说,就是能够滑动的条状部件。滑块的基本属性包括4个,分别是滑块的最值、滑块的刻度、滑块的步长和滑块的变量value。
既然要控制图片的灰度值,那么最大的问题就是数字上的处理,既然图片能够看做矩阵,那只需要解决如何从滑块获取数字的问题。这不是个问题,因为直接调用滑块的方法”value()”就可以得到当前滑块所在位置表示的数字。
滑块的左右滑动代表着从最小到最大的数字,所以拿到手之后要改三个地方,最小值、最大值、步长值。灰度图片一般是二维8位或者二维16位或者其他的,我们这里使用的是二维8位的jpg灰度图。
首先要弄清楚图片的各种格式与各种类型,以及不同的库对应的各种不同的图片编码格式和图片绘制方法。最常见的是RGB格式或者BGR格式,最常见的编码类型是numpy.ndarray类型。对于读取、存储、处理和绘制图片的包,这里用的是PIL以及其中的PIL.pyplot、matplotlib(一般重命名为plt),numpy(一般重命名为np)和使用较多的OpenCv-Python中的cv2包。PIL使用Image.open()读取的图片是numpy.ndarray,可以用PIL自带的图片处理函数进行处理,处理之后可以使用matplotlib进行图片窗口的显示以及图像的绘制;cv2读取的是BGR格式的图片,一般需要转换成RGB进行处理,储存格式也是numpy.ndarray,可以自带函数绘制。
然后是图像阈值与图片的关系,在这里我们用的是,阈值定为一个int整数,图片矩阵numpy.nadarray中的数字,如果小于阈值这个数字,就要变成0,相应的在图片中就是此处的颜色变成了了黑色,所以,阈值越大,图片中的黑色越多,阈值越小,图片中的黑色越少。
最后是将图片输出,原本利用matplotlib进行mat图片的绘制即可,就是效果图那样,但是我给这个图片留了一个label,就是滑块上面的那个”hello”的位置,目的就是让Qt控件更加完整,这里涉及到QImage的转码问题,日后解决了再更新一波。
解决思路有四个,在这里给大家一个启发:
使用视频流的思路,将图片放进QLabel中更新,每次只需要更新放入QLabel的图片即可。
预设思路1:
1.cv读取图片格式为np.ndarray,BGR格式,将其转码为np.ndarray,RGB格式,
2.将np.ndarray矩阵元素与阈值进行比较,得到一个新的np.ndarray,这个矩阵储存着处理后的图片
3.将其转化为QImage格式,通过Qt.setPixmap()放在QLabel上
预设思路2:
1.PIL读取图片为image,将其转化为np.ndarray,RGB,并将矩阵元素与阈值进行比较,得到新的储存图片的矩阵
2.将其转化为QImage放在QLabel上
预设思路3:
cv读取图片,处理np.ndarray矩阵,转化为image,再转化为QImage最终显示
预设思路4:
PIL读取图片为image,转化为np.ndarray进行处理,再恢复为image,再转成QImage后显示在QLabel。
代码如下:
-*- coding: utf-8 -*-
"""
@author:xiaoyangchicao2020
@time:2022-99-99
"""
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import cv2
class Win(QWidget):
def __init__(self):
super().__init__()
#窗口部件区
self.setGeometry(400, 300, 450, 450)
self.setWindowTitle('灰度变换')#主窗口
self.lab1 = QLabel('Hello')#辅助显示窗口,后期可换为原图
self.lab2=QLabel()#self.value(),即滑块当前处于什么值
self.lab3=QLabel()#灰度图的输出位置
self.lab4=QLabel()
self.lab1.setAlignment(Qt.AlignCenter)
self.lab2.setAlignment(Qt.AlignCenter)
self.lab3.setAlignment(Qt.AlignCenter)
self.lab4.setAlignment(Qt.AlignCenter)
#滑块属性设置区
self.s = QSlider(Qt.Horizontal)#水平方向
self.s.setMinimum(0)#设置最小值
self.s.setMaximum(255)#设置最大值
self.s.setSingleStep(1)#设置步长值
self.s.setValue(self.s.value())#设置当前值
self.s.setTickPosition(QSlider.TicksBelow)#设置刻度位置,在下方
self.s.setTickInterval(1)#设置刻度间隔
self.s.valueChanged.connect(self.valueChange)
#变量区
self.v=self.s.value()
#self.im=self.getimg()
self.im=cv2.imread(r'C:\Users\MI\Desktop\tpt.jpg',0)
#部件排版区
layout = QVBoxLayout()
layout.addWidget(self.lab1)
layout.addWidget(self.s)
layout.addWidget(self.lab2)
self.setLayout(layout)
#函数区
#滑块移动事件 移动之后要对灰度图进行改变,所以涉及到灰度图片的输出
def valueChange(self):#在滑动滑块时
#rint("current slider value:"+str(self.s.value()))
#print(self.s.value())
#print(self.a+self.s.value())
self.im=cv2.imread(r'C:\Users\MI\Desktop\tpt.jpg',0)
self.lab2.setNum(self.v+self.s.value())
#self.v=self.s.value()
self.erzhihua()
#self.grayimg_show()
#self.showimg(Image.fromarray(self.im_gray1), True)
#size = self.s.value()
#self.lb1.setFont(QFont("Arial",size))
self.showimg(self.im)
def erzhihua(self):
self.im = np.where(self.im[..., :] < self.s.value(), 0, 255)
#灰度图像的显示
#获取图片
def getimg(self):
self.im=cv2.imread(r'C:\Users\MI\Desktop\tpt.jpg',0)
def showimg(self,img):
plt.close()
plt.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
form = Win()
form.show()
sys.exit(app.exec_())
Original: https://blog.csdn.net/qq_60947873/article/details/126082761
Author: ♡小羊不吃草
Title: PyQt5滑块控制灰度图的二值化范围
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/765895/
转载文章受原作者版权保护。转载请注明原作者出处!