【CV作业02】图像灰度值变换+UI
目录
参考资料:
代码
1. 各种转换方法的实现
2. UI 设计(这里只展示功能实现部分,自动生成的代码已省去)
3. 启动程序
参考资料:
PyQT6的从零开始(一):在Anaconda下安装PyQT6+在Pycharm中如何配置与使用-CSDN博客
数字图像处理之点运算---分段线性变换_jxqbuct的博客-CSDN博客
第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波4 - 分段线性变换 - 对比度拉伸_分段线性变换python_jasneik的博客-CSDN博客
PyQt5实现按键显示文件夹中图片_pyqt显示图像_木南成长之路的博客-CSDN博客
代码
1. 各种转换方法的实现
"""
该文件实现了1个计算个灰度值的像素个数函数
实现了5个转换函数(均保存并返回目标图片)
为了实现后续展示图片,下面每个变换函数都会将目标图像保存为 img/dst_img.png
"""def histogram(img):"""计算各灰度值的像素个数:param img: 原始灰度图:return: n:各灰度值的像素个数"""H, W = img.shape[:2]n = np.zeros(256)# 循环遍历每个像素点for i in range(H):for j in range(W):n[img[i][j]] += 1return ndef histogram_equalization(img):"""直方图均衡化:param img: 原始灰度图:return: 直方图均衡化后的图"""H, W = img.shape[:2]# 计算直方图n = histogram(img)# 计算直方图频率p = n / (H*W)# 计算累计频率s = np.zeros(256)sum = 0for i in range(256):s[i] = p[i] + sumsum = s[i]# 计算输出灰度s = s * 255# 创建新图片dst_img = img.copy()for i in range(H):for j in range(W):dst_img[i, j] = s[img[i, j]]cv.imwrite('img/dst_img.png', dst_img)return dst_imgdef gray_reverse(img):"""灰度反转:param img: 原始灰度图:return: 灰度反转图"""dst_img = np.array(255-img) # 这里的 np.array 处理是为了防止 cv.imwrite 报错cv.imwrite('img/dst_img.png', dst_img)return dst_imgdef linear_transform(img, x1, x2, y1, y2):"""用 opencv 实现分段线性变换:return: 分段线性变换后的图"""lut = np.zeros(256)for i in range(256):if i < x1:lut[i] = (y1 / x1) * ielif i < x2:lut[i] = ((y2 - y1) / (x2 - x1)) * (i - x1) + y1else:lut[i] = ((y2 - 255.0) / (x2 - 255.0)) * (i - 255.0) + 255.0dst_img = cv.LUT(img, lut)dst_img = np.uint8(dst_img + 0.5) # +0.5有它自己的道理吧,但是效果看不出来cv.imwrite('img/dst_img.png', dst_img)return dst_imgdef log_transform(img, c=1):"""对数变换:param img: 原始灰度图:param c: 常数:return: 对数变换的图"""s = c * np.log(1+img)# 不知道为什么c的取值不会影响最终的图片效果,可能和下面的缩放处理有关# 缩放sm = s - s.min()dst_img = (sm / sm.max()) * 255dst_img = np.uint8(dst_img + 0.5)cv.imwrite('img/dst_img.png', dst_img)return dst_imgdef power_transform(img, c, gamma):"""伽马变换:param img: 原始灰度图:param c: 常数:param gamma:常数,次方:return:伽马变换后的图"""s = c * pow(img, gamma)# 缩放sm = s - s.min()dst_img = (sm / sm.max()) * 255dst_img = np.uint8(dst_img + 0.5)cv.imwrite('img/dst_img.png', dst_img)return dst_img# # 测试函数功能
# if __name__ == "__main__":
# # 读入灰度图
# org_img = cv.imread('img.png')
# print(org_img.shape)
# # 绘制直方图
# n = histogram(org_img)
# plt.bar(range(256), n)
# plt.show()
# # 灰度反转
# rvs_img = gray_reverse(org_img)
# # 直方图均衡化
# equ_img = histogram_equalization(org_img)
# histogram(equ_img)
# # 线性变换
# # 这里的参数可以调整,当前参数对课件上图片效果较好
# lin_img = linear_transform(org_img, 50, 200, 80, 230)
#
# log_img = log_transform(org_img)
#
# pow_img = power_transform(org_img, 1, 0.4)
# # 通过 imshow 显示图片
# cv.imshow("origin_img", org_img)
# cv.imshow("pow_img", pow_img)
# cv.imshow("rvs_img", rvs_img)
# cv.imshow("equ_img", equ_img)
# cv.waitKey(0)
2. UI 设计(这里只展示功能实现部分,自动生成的代码已省去)
"""
这里使用了PyQt6进行UI设计
使用了GTDesigner工具(可视化制作GUI)和pyUIC工具(将QTdesigner中生成的.ui文件转换为.py文件)
"""# 保存直方图
def save_histogram(img, name):n = histogram(img)plt.bar(range(256), n)# 为了方便,这里的 name 其实只有两种:原图直方图和转换后直方图img_path = './img/{}.png'.format(name)plt.savefig(img_path) # 保存直方图plt.cla() # 清除之前的plt,否则会一直保留之前生成过的直方图return img_path # 因为后面 QPixmap 需要用到图片地址class Ui_Dialog(object):def __init__(self):self.org_img = None # 保存选择的原始灰度图# 自动生成def setupUi(self, Dialog):# 省略# 设定按钮的功能self.button_connect()# 自动生成def retranslateUi(self, Dialog):# 省略# 给每个按钮加上点击功能def button_connect(self):self.pushButton.clicked.connect(self.open_img)self.pushButton_3.clicked.connect(lambda: self.show_dst_img(3))self.pushButton_4.clicked.connect(lambda: self.show_dst_img(4))self.pushButton_5.clicked.connect(lambda: self.show_dst_img(5))self.pushButton_6.clicked.connect(lambda: self.show_dst_img(6))self.pushButton_7.clicked.connect(lambda: self.show_dst_img(7))# 打开图片def open_img(self):imgName, imgType = QFileDialog.getOpenFileName(None, "打开图片", "lab02/img/", "*.png;;*.jpg;;All Files(*)")self.org_img = cv.imread(imgName)# 显示图片pix = QPixmap(imgName).scaled(self.label_5.width(), self.label_5.height())self.label_5.setPixmap(pix)# 显示直方图his_imgName = save_histogram(self.org_img, '原图直方图')pix = QPixmap(his_imgName).scaled(self.label_3.width(), self.label_3.height())self.label_3.setPixmap(pix)# 显示转换后的图片及直方图def show_dst_img(self, x):if x == 3:gray_reverse(self.org_img)elif x == 4:histogram_equalization(self.org_img)elif x == 5:# 由于 ui 没有设计可以传递参数的入口,这里使用固定参数linear_transform(self.org_img, 50, 200, 80, 230)elif x == 6:# 由于 ui 没有设计可以传递参数的入口,这里使用固定参数power_transform(self.org_img, 1, 0.4)elif x == 7:log_transform(self.org_img)dst_img = cv.imread('img/dst_img.png')# 显示图片pix = QPixmap('img/dst_img.png').scaled(self.label_6.width(), self.label_6.height())self.label_6.setPixmap(pix)# 显示直方图his_imgName = save_histogram(dst_img, '转换后直方图')pix = QPixmap(his_imgName).scaled(self.label_4.width(), self.label_4.height())self.label_4.setPixmap(pix)
3. 启动程序
if __name__ == '__main__':# 创建ui,引用 Ui_MainWindow类app = QApplication(sys.argv)mainWindow = QMainWindow()ui = ui_sys.Ui_Dialog()# 调用 setupUi,创建初始组件ui.setupUi(mainWindow)# 创建窗口mainWindow.show()# 进入程序的主循环,并通过exit函数确保主循环安全结束(该释放资源的一定要释放)sys.exit(app.exec())
注:
第一次接触pyqt,效果可能实现了但是代码质量不一定高
【CV作业02】图像灰度值变换+UI相关推荐
- [Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- 【python图像处理】图像灰度化处理、图像灰度线性变换、图像灰度非线性变换
一.图像灰度化处理 1.最大值灰度处理方法 2.平均灰度处理方法 3.加权平均灰度处理方法 二.图像灰度线性变换 1.图像灰度上移变换 2.图像对比度增强变换 3.图像对比度减弱变换 4.图像灰度反色 ...
- 8bit黑白图像的灰度值范围是_浅谈工业CT图像灰度值
工业CT使用的X射线检测作为无损检测的主要方法之一,与其他方法相比具有直观.准确等优点.射线检测中垂直于射线透照方向的缺陷尺寸可精确测量,但平行于射线透照方向的缺陷尺寸无法直接测量得到,而未焊透.根部 ...
- 用python统计图片中的点_用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)...
我就废话不多说了,大家还是直接看代码吧! import PIL.Image import numpy import os import shutil def sum_right(path): img ...
- 图像灰度值 灰度值与像素值的关系
图像灰度值的概念是什么?灰度也可以认为是亮度,简单说就是色彩的深浅程度. 实际上在我们的日常生活中,通过三原色色彩深浅的组合,可以组成各种不同的颜色.产品能够展现的灰度数量越多,也就意味着这款产品的色 ...
- 图像灰度值和像素值的关系
图像灰度值的概念是什么?灰度也可以认为是亮度,简单说就是色彩的深浅程度. 实际上在我们的日常生活中,通过三原色色彩深浅的组合,可以组成各种不同的颜色.产品能够展现的灰度数量越多,也就意味着这款产品的色 ...
- MATLAB--数字图像处理 绘画出图像灰度值的三维图像
绘画出图像灰度值的三维图像 方法一: i=imread('a1.jpg');if(size(i,3)>1)i=rgb2gray(i);endi=double(i); mesh(i); figur ...
- python图像处理:图像灰度非线性变换
图像灰度的非线性变换 平方变换 对数变换 伽马变换 样例 代码 平方变换 将灰度进行平方再除以255,用于 降低图像亮度 增强亮部对比度 减缓暗部对比度 对比度可以看作灰度的斜率 对数变换 将灰度取对 ...
- C++计算图像灰度值实现PhotoShop对比度100极限调整
很久以前做的一个WOW钓鱼程序,最近在怀旧服使用过程中,发现受天气影响,机器人不能很好的查找到鱼漂,对比实际环境,感觉是鱼漂查找代码有缺陷.对游戏图像抓图后,使用PS通过调整对比度极限化,也就是对比度 ...
最新文章
- ISME: 北大吴晓磊组发现囊泡为细菌利用环境血红素提供全新途径
- ABAP Debugging Script(调试器脚本)使用的一些实际例子
- MFC获取文件夹下的所有文件名
- 设计模式:001面向对象设计原则
- 内存管理器剖析:ptmalloc,windows,macOS
- arcgis地理配准_【更新70篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
- 寻找春天amp;nbsp;九宫格日记-2014.04.26
- 基于SSM框架CRM客户管理系统
- 机械工程学专业词汇英语翻译
- Flutter在Android平台实现消息推送
- linux千兆网卡接百兆交换机,千兆交换机可以接百兆网线吗?
- python爬虫之爱思助手音乐爬取
- linux C 基于事件回调的epoll反应堆模型
- 基于神经网络的文本分类算法
- XSLT基础 XSL 与 XSLT
- php仿果壳网,模仿,令我们更亲近
- 一文读懂shell命令
- 3个月ESET全系列产品试用用户名和密码
- 计算机工程博士学校,计算机工程博士
- 互联时代,直播,短视频成为知识付费成长的良好土壤