PyQt5+OpenCV制作一个实时二值化图像的小工具

写在前面

过完春节,整个人慵懒不少,不得不感叹,年纪越大,越不愿意思考,已经有两个月没有更新博客了。
其实近期工作中遇到了不少技术问题,尤其是在图像处理方面,读研究生的时候接触过opencv一些浅显的知识,不过是C++写的,很多东西都一知半解,时隔多年,又需要用到,买了本opencv的参考书,写了个简单的功能,记录一下:
编译环境:

  • python3.7
  • pycharm2020
  • cv2版本4.4.0.46

需求及实现

功能需求

项目需求对图像进行各种处理,我这里只记录一项,就是图像的二值化处理。
图像的二值化是将灰度图像转为黑白两色图像,灰度化阈值很关键,我们在进行二值化处理过程中,并不清楚这个阈值该如何设置,因此,我需要动态调整,并随时获取二值化阈值。

安装opencv库

python环境下的opencv库与其他库有点不一样,import的包是cv2,博主一度以为pip cv2就行了,后来发现不是这样子的,在cmd窗口下输入以下命令:

pip install opencv-python

如果安装比较慢,可以使用镜像安装,我常用的是豆瓣的pip源,如下

pip install opencv-python -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

界面展示

在这里插入图片描述
界面功能很简单,一个图片展示区域,一个滑动条,通过滑动滑条来改变图像的二值化结果,滑动条上面是二值化阈值。

主体代码

博主不再介绍如何布局,如何设置控件,只提供核心代码

        self.lb1 = QLabel()
        self.lb1.setPixmap(QPixmap('01.jpg'))
        layout.addWidget(self.lb1)

        self.sl = QSlider(Qt.Horizontal)
        self.sl.setMinimum(0)
        self.sl.setMaximum(255)
        self.sl.setSingleStep(5)
        self.sl.setValue(50)
        self.sl.setTickPosition(QSlider.TicksBelow)
        self.sl.setTickInterval(5)
        self.l1 = QLabel()
        self.l1.setText('拖动滑条调整二值化阈值')
        self.l1.setFont(QFont("Arial", 10))
        self.l1.setAlignment(Qt.AlignCenter)
        layout.addWidget(self.l1)
        layout.addWidget(self.sl)
        self.sl.valueChanged.connect(self.valuechange)
        self.setLayout(layout)

前面3行设置QLabel来显示图像
sl为滑条,设置滑条的最小值最大值分别为0和255,滑动步长为5,初始值为50
l1为文本标签,用来显示当前二值化值,将sl的值变化链接到valuechange槽函数。

阈值调整槽函数

槽函数如下:

    def valuechange(self):
        print('current slider value=%s' % self.sl.value())
        size = self.sl.value()
        self.l1.setText('当前二值化阈值为' + str(size))
        self.l1.setFont(QFont("Arial", 10))
        img = cv2.imread('01.jpg')
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        ret, thresh = cv2.threshold(gray, size, 255, 0, gray)
        cv2.imwrite('bw.png', thresh)
        self.lb1.setPixmap(QPixmap('bw.png'))

第一行可有可无,是在控制台显示滑条当前值

img = cv2.imread('01.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, size, 255, 0, gray)

这三行代为是关键,第一行读取图片,第二行灰度化图像,第三行根据当前滑条的阈值来二值化图像,最后两行是将图像写入bw.png,并让lb1来显示二值化后的图像。
看看动态结果:
上传不了视频,为了展示下,还得上传至B站,忒费劲了

2021-03-12-16-30-44


好了,今天的博客就到这了,希望能帮到大家。

猜你喜欢

转载自blog.csdn.net/u012848304/article/details/114698715
今日推荐