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 相关文章推荐
Python3读取UTF-8文件及统计文件行数的方法
May 22 Python
使用Python的Bottle框架写一个简单的服务接口的示例
Aug 25 Python
python实现简单点对点(p2p)聊天
Sep 13 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
Nov 15 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
Jul 06 Python
Python代码打开本地.mp4格式文件的方法
Jan 03 Python
wxPython实现绘图小例子
Nov 19 Python
python创建n行m列数组示例
Dec 02 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
Jan 19 Python
用python画城市轮播地图
May 28 Python
基于Python和openCV实现图像的全景拼接详细步骤
Oct 05 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
php 字符过滤类,用于过滤各类用户输入的数据
2009/05/27 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
Extjs入门之动态加载树代码
2010/04/09 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
js日期联动示例
2014/05/02 Javascript
常用的JS验证和函数汇总
2014/12/23 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
2015/09/09 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
JavaScript运动框架 链式运动到完美运动(五)
2017/05/18 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
[01:30]2016国际邀请赛中国区预选赛神秘商店火爆开启
2016/06/26 DOTA
python使用点操作符访问字典(dict)数据的方法
2015/03/16 Python
python机器学习实战之树回归详解
2017/12/20 Python
python 实现对文件夹内的文件排序编号
2018/04/12 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
2019/03/13 Python
python实现大量图片重命名
2020/03/23 Python
Python同时处理多个异常的方法
2020/07/28 Python
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
进程的查看和调度分别使用什么命令
2013/12/14 面试题
英语国培研修感言
2014/02/13 职场文书
就业意向书
2014/07/29 职场文书
信访维稳工作汇报
2014/10/27 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
沈阳故宫导游词
2015/01/31 职场文书
行政经理岗位职责
2015/04/15 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL