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

作者:菜菜Chicken 时间:2023-09-10 11:22:34 

定位色块常用到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实现图片阈值编辑器/寻色块阈值利器

来源:https://blog.csdn.net/qq_37957854/article/details/109609260

标签:pyQt5,图片,阈值
0
投稿

猜你喜欢

  • 微信小程序radio组件使用详解

    2024-04-19 10:41:44
  • Python数据分析与处理(二)——处理中国地区信息

    2021-04-04 17:12:26
  • Docker容器启动时初始化Mysql数据库的方法

    2024-01-19 12:16:36
  • JavaScript实现动态生成表格

    2024-04-10 10:54:05
  • 详解VScode自动补全CSS3前缀插件以及配置无效的解决办法

    2023-01-05 06:49:40
  • python将字符串转换成数组的方法

    2021-03-04 20:09:54
  • 关于jquery css的使用介绍

    2024-04-22 22:21:45
  • Pycharm学习教程(4) Python解释器的相关配置

    2023-12-01 10:11:32
  • Python实现http接口自动化测试的示例代码

    2023-05-01 07:14:45
  • 解决MySql版本问题sql_mode=only_full_group_by

    2024-01-14 00:23:17
  • 调试一段PHP程序时遇到的三个问题

    2023-06-22 11:39:22
  • 详解Python中pyautogui库的最全使用方法

    2022-11-17 17:07:14
  • linux安装Python3.4.2的操作方法

    2022-06-17 19:19:15
  • Flask模板继承深入理解与应用

    2021-01-24 12:31:40
  • Python异步爬取知乎热榜实例分享

    2022-02-26 04:48:47
  • 给你一面国旗 教你用python画中国国旗

    2023-06-25 15:10:36
  • JS与Ajax Get和Post在使用上的区别实例详解

    2024-04-23 09:07:40
  • Ubuntu 设置开放 MySQL 服务远程访问教程

    2024-01-29 07:45:39
  • Anaconda2下实现Python2.7和Python3.5的共存方法

    2022-06-30 12:43:30
  • python错误处理详解

    2023-04-24 11:10:30
  • asp之家 网络编程 m.aspxhome.com