根据大家的要求,添加一些解释。
首先,PyqT5中自带滑块配件,分为水平方向和竖直方向两种滑块。有时候也叫拖动条,不管怎么说,就是能够滑动的条状部件。滑块的基本属性包括4个,分别是滑块的最值、滑块的刻度、滑块的步长和滑块的变量value。
既然要控制图片的灰度值,那么最大的问题就是数字上的处理,既然图片能够看做矩阵,那只需要解决如何从滑块获取数字的问题。这不是个问题,因为直接调用滑块的方法“value()”就可以得到当前滑块所在位置表示的数字。
滑块的左右滑动代表着从最小到最大的数字,所以拿到手之后要改三个地方,最小值、最大值、步长值。灰度图片一般是二维8位或者二维16位或者其他的,我们这里使用的是二维8位的jpg灰度图。
首先要弄清楚图片的各种格式与各种类型,以及不同的库对应的各种不同的图片编码格式和图片绘制方法。最常见的是RGB格式或者BGR格式,最常见的编码类型是numpy.ndarray类型。对于读取、存储、处理和绘制图片的包,这里用的是PIL以及其中的PIL.pyplot、matplotlib(一般重命名为plt),numpy(一般重命名为np)和使用较多的OpenCv-Python中的cv2包。PIL使用Image.open()读取的图片是numpy.ndarray,可以用PIL自带的图片处理函数进行处理,处理之后可以使用matplotlib进行图片窗口的显示以及图像的绘制;cv2读取的是BGR格式的图片,一般需要转换成RGB进行处理,储存格式也是numpy.ndarray,可以自带函数绘制。
然后是图像阈值与图片的关系,在这里我们用的是,阈值定为一个int整数,图片矩阵numpy.nadarray中的数字,如果小于阈值这个数字,就要变成0,相应的在图片中就是此处的颜色变成了了黑色,所以,阈值越大,图片中的黑色越多,阈值越小,图片中的黑色越少。
最后是将图片输出,原本利用matplotlib进行mat图片的绘制即可,就是效果图那样,但是我给这个图片留了一个label,就是滑块上面的那个“hello”的位置,目的就是让Qt控件更加完整,这里涉及到QImage的转码问题,日后解决了再更新一波。
解决思路有四个,在这里给大家一个启发:
使用视频流的思路,将图片放进QLabel中更新,每次只需要更新放入QLabel的图片即可。
预设思路1:
1.cv读取图片格式为np.ndarray,BGR格式,将其转码为np.ndarray,RGB格式,
2.将np.ndarray矩阵元素与阈值进行比较,得到一个新的np.ndarray,这个矩阵储存着处理后的图片
3.将其转化为QImage格式,通过Qt.setPixmap()放在QLabel上
预设思路2:
1.PIL读取图片为image,将其转化为np.ndarray,RGB,并将矩阵元素与阈值进行比较,得到新的储存图片的矩阵
2.将其转化为QImage放在QLabel上
预设思路3:
>cv读取图片,处理np.ndarray矩阵,转化为image,再转化为QImage最终显示
预设思路4:
>PIL读取图片为image,转化为np.ndarray进行处理,再恢复为image,再转成QImage后显示在QLabel。
代码如下:
# -*- coding: utf-8 -*-
@author:xiaoyangchicao2020
@time:2022-99-99
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import cv2
class Win(QWidget):
def __init__(self):
super().__init__()
#窗口部件区
self.setGeometry(400, 300, 450, 450)
self.setWindowTitle('灰度变换')#主窗口
self.lab1 = QLabel('Hello')#辅助显示窗口,后期可换为原图
self.lab2=QLabel()#self.value(),即滑块当前处于什么值
self.lab3=QLabel()#灰度图的输出位置
self.lab4=QLabel()
self.lab1.setAlignment(Qt.AlignCenter)
self.lab2.setAlignment(Qt.AlignCenter)
self.lab3.setAlignment(Qt.AlignCenter)
self.lab4.setAlignment(Qt.AlignCenter)
#滑块属性设置区
self.s = QSlider(Qt.Horizontal)#水平方向
self.s.setMinimum(0)#设置最小值
self.s.setMaximum(255)#设置最大值
self.s.setSingleStep(1)#设置步长值
self.s.setValue(self.s.value())#设置当前值
self.s.setTickPosition(QSlider.TicksBelow)#设置刻度位置,在下方
self.s.setTickInterval(1)#设置刻度间隔
self.s.valueChanged.connect(self.valueChange)
self.v=self.s.value()
#self.im=self.getimg()
self.im=cv2.imread(r'C:\Users\MI\Desktop\tpt.jpg',0)
#部件排版区
layout = QVBoxLayout()
layout.addWidget(self.lab1)
layout.addWidget(self.s)
layout.addWidget(self.lab2)
self.setLayout(layout)
#滑块移动事件 移动之后要对灰度图进行改变,所以涉及到灰度图片的输出
def valueChange(self):#在滑动滑块时
#rint("current slider value:"+str(self.s.value()))
#print(self.s.value())
#print(self.a+self.s.value())
self.im=cv2.imread(r'C:\Users\MI\Desktop\tpt.jpg',0)
self.lab2.setNum(self.v+self.s.value())
#self.v=self.s.value()
self.erzhihua()
#self.grayimg_show()
#self.showimg(Image.fromarray(self.im_gray1), True)
#size = self.s.value()
#self.lb1.setFont(QFont("Arial",size))
self.showimg(self.im)
def erzhihua(self):
self.im = np.where(self.im[..., :] < self.s.value(), 0, 255)
#灰度图像的显示
#获取图片
def getimg(self):
self.im=cv2.imread(r'C:\Users\MI\Desktop\tpt.jpg',0)
def showimg(self,img):
plt.close()
plt.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
form = Win()
form.show()
sys.exit(app.exec_())
要实现QSlider和QSpinBox同步变化,只需要将两个控件的value相互connect就可以了。代码如下:
/* 设置灰度变换窗口 */
QSlider *slider = new QSlider(
Qt
::Horizon...
cv.namedWindow('image')
cv.createTrackbar('C1', 'image', 0, 255, nothing)
cv.createTrackbar('C2'
import sys
from
PyQt5
.
Qt
Widgets import QLabel,QSlider,QHBoxLayout,QWidget,QApplication,QMainWindow
from
PyQt5
.
Qt
Core import *
class QSliderDemo(QMainWindow):
def __init__(self):
super(QSliderDemo, self).__init__()
使用%
matplotlib
笔记本您可以使用笔记本电脑后端而不是嵌入式后端.这将允许按预期方式通过将代码作为脚本运行来调用fig.canvas.draw().将行%
matplotlib
内联替换为%
matplotlib
notebook并重新启动内核.使用显示器更改后,您可以显示新更改的图形.缺点是它将创建两次输出.一种解决方法是将交互放入新的单元格中并捕获第一个单元格的输出.%%capture%ma...
1、水平或者垂直的
滑动
控件,一般用来设置数字,快速
滑动
来调整数字2、用给定的parent构造一个垂直的
滑块
。用给定的parent构造一个
滑块
。方向参数确定
滑块
是水平的还是垂直的。有效值是Vertical和Horizon1、QSpinBox计数器控件同样有快速设置数字的用处,区分于
滑动
控件,它可以进行直接的输入填写2、构造一个旋转框,其最小值为0,最大值为99,步进值为1。该值初始设置为0。它是parent的父级。(2)常用函数。.........
过完春节,整个人慵懒不少,不得不感叹,年纪越大,越不愿意思考,已经有两个月没有更新博客了。
其实近期工作中遇到了不少技术问题,尤其是在图像处理方面,读研究生的时候接触过
opencv
一些浅显的知识,不过是C++写的,很多东西都一知半解,时隔多年,又需要用到,买了本
opencv
的参考书,写了个简单的功能,记录一下:
编译环境:
python
3.7
pycharm2020
cv2版本4.4.0.46
需求及实现
项目需求对图像进行各种处理,我这里只记录一项,就是图像的
二值化
处理。
本文在前面文章基础上介绍tkinter添加图片和文本,在这之前,我们需要安装一个图片库,叫Pillow,这个需要下载exe文件,根据下面图片下载和安装。下载完后直接双击安装exe,默认点击下一步,直到安装完成,会自动安装到
Python
3.6下的\lib\site-packages\PIL# tkinter实现菜单功能from tkinter import *from PIL import Imag...