opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器


Posted in Python onNovember 13, 2020

定位色块常用到hsv色彩空间下的颜色阈值,笔者曾经用openmv时,其IDE有自带一个阈值编辑器,使用起来非常方便,现在在linux上跑cv算法,需要类似的功能,因此自己写了一个阈值编辑器。 目前暂时只支持HSV色彩空间下的阈值编辑。

代码:

mian.py:

from threshold_ui import Ui_Widget
from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QImage,QPixmap,QFont
from PyQt5 import QtWidgets
import sys
import cv2
import numpy as np

class Threshold_Value_Edit(QtWidgets.QWidget,Ui_Widget):
  def __init__(self): #UI初始化
    super(Threshold_Value_Edit,self).__init__()
    self.setupUi(self)
    self.setWindowTitle("阈值编辑器")
    img_path = r'D:\Pictures\screenshot.png'
    ft=QFont()
    ft.setPointSize(12)

    self.horizontalSlider.setMaximum(255)
    self.horizontalSlider_2.setMaximum(255)
    self.horizontalSlider_3.setMaximum(255)
    self.horizontalSlider_4.setMaximum(255)
    self.horizontalSlider_5.setMaximum(255)
    self.horizontalSlider_6.setMaximum(255)

    self.horizontalSlider.setValue(255)
    self.horizontalSlider_3.setValue(255)
    self.horizontalSlider_5.setValue(255)
    self.label.setText("H最大值:"+str(self.horizontalSlider.value()))
    self.label_2.setText("H最小值:"+str(self.horizontalSlider_2.value()))
    self.label_3.setText("S最大值:"+str(self.horizontalSlider_3.value()))
    self.label_4.setText("S最小值:"+str(self.horizontalSlider_4.value()))
    self.label_5.setText("V最大值:"+str(self.horizontalSlider_5.value()))
    self.label_6.setText("V最小值:"+str(self.horizontalSlider_6.value()))
    self.label.setFont(ft)
    self.label_2.setFont(ft)
    self.label_3.setFont(ft)
    self.label_4.setFont(ft)
    self.label_5.setFont(ft)
    self.label_6.setFont(ft)
    self.lineEdit.setText("HSVmin: HSVmax:")
    self.lineEdit.setFont(ft)
    
    self.img = cv2.imread(img_path)
    self.label_image_show(self.img)

    self.horizontalSlider.valueChanged[int].connect(self.horizontalSlider1_changeValue)
    self.horizontalSlider_2.valueChanged[int].connect(self.horizontalSlider2_changeValue)
    self.horizontalSlider_3.valueChanged[int].connect(self.horizontalSlider3_changeValue)
    self.horizontalSlider_4.valueChanged[int].connect(self.horizontalSlider4_changeValue)
    self.horizontalSlider_5.valueChanged[int].connect(self.horizontalSlider5_changeValue)
    self.horizontalSlider_6.valueChanged[int].connect(self.horizontalSlider6_changeValue)

  def label_image_show(self,img):
    if(len(img.shape)==2):
      img = cv2.merge([img,img,img])

    height, width, bytesPerComponent = img.shape  #返回的是图像的行数,列数,色彩通道数
    bytesPerLine = 3 * width  #每行的字节数    
    cv2.cvtColor(img, cv2.COLOR_BGR2RGB, img)
    QImg = QImage(img.data, width, height, bytesPerLine, QImage.Format_RGB888)     
    pixmap = QPixmap.fromImage(QImg)
    self.label_7.setPixmap(pixmap)
    #print(img.shape[0],img.shape[1])
    self.label_7.update()




  def horizontalSlider1_changeValue(self): #更新画板和滑条前的label
    self.label.setText("H最大值:"+str(self.horizontalSlider.value()))
    self.change_lineedit_value()
    self.HSV_img_change()
  def horizontalSlider2_changeValue(self):
    self.label_2.setText("H最小值:"+str(self.horizontalSlider_2.value()))
    self.change_lineedit_value()
    self.HSV_img_change()
  def horizontalSlider3_changeValue(self):
    self.label_3.setText("S最大值:"+str(self.horizontalSlider_3.value()))
    self.change_lineedit_value()
    self.HSV_img_change()
  def horizontalSlider4_changeValue(self):
    self.label_4.setText("S最小值:"+str(self.horizontalSlider_4.value()))
    self.change_lineedit_value()
    self.HSV_img_change()
  def horizontalSlider5_changeValue(self):
    self.label_5.setText("V最大值:"+str(self.horizontalSlider_5.value()))
    self.change_lineedit_value()
    self.HSV_img_change()
  def horizontalSlider6_changeValue(self):
    self.label_6.setText("V最小值:"+str(self.horizontalSlider_6.value()))
    self.change_lineedit_value()
    self.HSV_img_change()


  def change_lineedit_value(self):
    self.lineEdit.setText("HSVmin:["+str(self.horizontalSlider_2.value())+","+str(self.horizontalSlider_4.value())+","+str(self.horizontalSlider_6.value())+"] HSVmax:["+str(self.horizontalSlider.value())+","+str(self.horizontalSlider_3.value())+","+str(int(self.horizontalSlider_5.value()))+"]")

  def HSV_img_change(self):
    
    hsv_min = np.array([self.horizontalSlider_2.value(),self.horizontalSlider_4.value(),self.horizontalSlider_6.value()])
    hsv_max = np.array([self.horizontalSlider.value(),self.horizontalSlider_3.value(),self.horizontalSlider_5.value()])
    hsv = cv2.cvtColor(self.img, cv2.COLOR_BGR2HSV)         # 转化成HSV图像
    erode_hsv = cv2.erode(hsv, None, iterations=8)          # 腐蚀 细的变粗
    inRange_hsv = cv2.inRange(erode_hsv,hsv_min,hsv_max)
    self.label_image_show(inRange_hsv)
    print("hsv_min:")
    print(hsv_min)
    print("hsv_max:")
    print(hsv_max)    
    


if __name__ == '__main__':
  app = QtWidgets.QApplication(sys.argv)
  w = Threshold_Value_Edit()
  w.__init__()
  w.show()
  sys.exit(app.exec_())

threshold_ui.py:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'widget.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Widget(object):
  def setupUi(self, Widget):
    Widget.setObjectName("Widget")
    Widget.resize(942, 247)
    self.horizontalLayout = QtWidgets.QHBoxLayout(Widget)
    self.horizontalLayout.setContentsMargins(11, 11, 11, 11)
    self.horizontalLayout.setSpacing(6)
    self.horizontalLayout.setObjectName("horizontalLayout")
    self.label_7 = QtWidgets.QLabel(Widget)
    self.label_7.setObjectName("label_7")
    self.horizontalLayout.addWidget(self.label_7)
    self.formLayout = QtWidgets.QFormLayout()
    self.formLayout.setSpacing(6)
    self.formLayout.setObjectName("formLayout")
    self.label = QtWidgets.QLabel(Widget)
    self.label.setObjectName("label")
    self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
    self.horizontalSlider = QtWidgets.QSlider(Widget)
    self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
    self.horizontalSlider.setObjectName("horizontalSlider")
    self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.horizontalSlider)
    self.label_2 = QtWidgets.QLabel(Widget)
    self.label_2.setObjectName("label_2")
    self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)
    self.horizontalSlider_2 = QtWidgets.QSlider(Widget)
    self.horizontalSlider_2.setOrientation(QtCore.Qt.Horizontal)
    self.horizontalSlider_2.setObjectName("horizontalSlider_2")
    self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.horizontalSlider_2)
    self.label_3 = QtWidgets.QLabel(Widget)
    self.label_3.setObjectName("label_3")
    self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_3)
    self.horizontalSlider_3 = QtWidgets.QSlider(Widget)
    self.horizontalSlider_3.setOrientation(QtCore.Qt.Horizontal)
    self.horizontalSlider_3.setObjectName("horizontalSlider_3")
    self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.horizontalSlider_3)
    self.label_4 = QtWidgets.QLabel(Widget)
    self.label_4.setObjectName("label_4")
    self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_4)
    self.horizontalSlider_4 = QtWidgets.QSlider(Widget)
    self.horizontalSlider_4.setOrientation(QtCore.Qt.Horizontal)
    self.horizontalSlider_4.setObjectName("horizontalSlider_4")
    self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.horizontalSlider_4)
    self.label_5 = QtWidgets.QLabel(Widget)
    self.label_5.setObjectName("label_5")
    self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_5)
    self.horizontalSlider_5 = QtWidgets.QSlider(Widget)
    self.horizontalSlider_5.setOrientation(QtCore.Qt.Horizontal)
    self.horizontalSlider_5.setObjectName("horizontalSlider_5")
    self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.horizontalSlider_5)
    self.label_6 = QtWidgets.QLabel(Widget)
    self.label_6.setObjectName("label_6")
    self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.label_6)
    self.horizontalSlider_6 = QtWidgets.QSlider(Widget)
    self.horizontalSlider_6.setOrientation(QtCore.Qt.Horizontal)
    self.horizontalSlider_6.setObjectName("horizontalSlider_6")
    self.formLayout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.horizontalSlider_6)
    self.lineEdit = QtWidgets.QLineEdit(Widget)
    self.lineEdit.setObjectName("lineEdit")
    self.formLayout.setWidget(6, QtWidgets.QFormLayout.SpanningRole, self.lineEdit)
    self.horizontalLayout.addLayout(self.formLayout)

    self.retranslateUi(Widget)
    QtCore.QMetaObject.connectSlotsByName(Widget)

  def retranslateUi(self, Widget):
    _translate = QtCore.QCoreApplication.translate
    Widget.setWindowTitle(_translate("Widget", "Widget"))
    self.label_7.setText(_translate("Widget", "TextLabel"))
    self.label.setText(_translate("Widget", "H最大值"))
    self.label_2.setText(_translate("Widget", "H最小值"))
    self.label_3.setText(_translate("Widget", "S最大值"))
    self.label_4.setText(_translate("Widget", "S最小值"))
    self.label_5.setText(_translate("Widget", "V最大值"))
    self.label_6.setText(_translate("Widget", "V最小值"))

第二份代码保存为threshold_ui.py,第一份可保存为任意文件名.py,放到同一目录下,运行第一份代码即可,img_path需修改为目标图片的绝对路径。

程序界面截图:

opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器

阈值选取:

opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器

到此这篇关于opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器的文章就介绍到这了,更多相关pyQt5 图片阈值编辑器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python函数可变参数定义及其参数传递方式实例详解
May 25 Python
简单总结Python中序列与字典的相同和不同之处
Jan 19 Python
Python中工作日类库Busines Holiday的介绍与使用
Jul 06 Python
对Python3中dict.keys()转换成list类型的方法详解
Feb 03 Python
Python 中Django验证码功能的实现代码
Jun 20 Python
python基于FTP实现文件传输相关功能代码实例
Sep 28 Python
浅析Python3 pip换源问题
Jan 06 Python
python 爬取疫情数据的源码
Feb 09 Python
Python Django view 两种return的实现方式
Mar 16 Python
python 实现逻辑回归
Dec 30 Python
python数据抓取3种方法总结
Feb 07 Python
SpringBoot首页设置解析(推荐)
Feb 11 Python
Python图像识别+KNN求解数独的实现
Nov 13 #Python
Django正则URL匹配实现流程解析
Nov 13 #Python
Django框架请求生命周期实现原理
Nov 13 #Python
python在地图上画比例的实例详解
Nov 13 #Python
python语言实现贪吃蛇游戏
Nov 13 #Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 #Python
python切割图片的示例
Nov 12 #Python
You might like
mysql中存储过程、函数的一些问题
2007/02/14 PHP
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
浅析PHP编程中10个最常见的错误
2014/08/08 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
PHP简单获取多个checkbox值的方法
2016/06/13 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
Yii框架中使用PHPExcel的方法分析
2019/07/25 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
js客户端快捷键管理类的较完整实现和应用
2010/06/08 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
解析jquery获取父窗口的元素
2013/06/26 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
js实现基于正则表达式的轻量提示插件
2015/08/29 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
python Gunicorn服务器使用方法详解
2019/07/22 Python
Django的Modelforms用法简介
2019/07/27 Python
python中如何使用insert函数
2020/01/09 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
2021/01/05 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
软件工程专业推荐信
2013/10/28 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
篮球赛口号
2014/06/18 职场文书
119消防日活动总结
2014/08/29 职场文书
单位租房协议书范本
2014/12/04 职场文书
追悼会悼词大全
2015/06/23 职场文书