写在前面
过完春节,整个人慵懒不少,不得不感叹,年纪越大,越不愿意思考,已经有两个月没有更新博客了。
其实近期工作中遇到了不少技术问题,尤其是在图像处理方面,读研究生的时候接触过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
好了,今天的博客就到这了,希望能帮到大家。
完