PyQt5滑块控制灰度图的二值化范围

根据大家的要求,添加一些解释。

首先,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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球