目录

参考资料:

代码

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相关推荐

  1. [Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  2. 【python图像处理】图像灰度化处理、图像灰度线性变换、图像灰度非线性变换

    一.图像灰度化处理 1.最大值灰度处理方法 2.平均灰度处理方法 3.加权平均灰度处理方法 二.图像灰度线性变换 1.图像灰度上移变换 2.图像对比度增强变换 3.图像对比度减弱变换 4.图像灰度反色 ...

  3. 8bit黑白图像的灰度值范围是_浅谈工业CT图像灰度值

    工业CT使用的X射线检测作为无损检测的主要方法之一,与其他方法相比具有直观.准确等优点.射线检测中垂直于射线透照方向的缺陷尺寸可精确测量,但平行于射线透照方向的缺陷尺寸无法直接测量得到,而未焊透.根部 ...

  4. 用python统计图片中的点_用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)...

    我就废话不多说了,大家还是直接看代码吧! import PIL.Image import numpy import os import shutil def sum_right(path): img ...

  5. 图像灰度值 灰度值与像素值的关系

    图像灰度值的概念是什么?灰度也可以认为是亮度,简单说就是色彩的深浅程度. 实际上在我们的日常生活中,通过三原色色彩深浅的组合,可以组成各种不同的颜色.产品能够展现的灰度数量越多,也就意味着这款产品的色 ...

  6. 图像灰度值和像素值的关系

    图像灰度值的概念是什么?灰度也可以认为是亮度,简单说就是色彩的深浅程度. 实际上在我们的日常生活中,通过三原色色彩深浅的组合,可以组成各种不同的颜色.产品能够展现的灰度数量越多,也就意味着这款产品的色 ...

  7. MATLAB--数字图像处理 绘画出图像灰度值的三维图像

    绘画出图像灰度值的三维图像 方法一: i=imread('a1.jpg');if(size(i,3)>1)i=rgb2gray(i);endi=double(i); mesh(i); figur ...

  8. python图像处理:图像灰度非线性变换

    图像灰度的非线性变换 平方变换 对数变换 伽马变换 样例 代码 平方变换 将灰度进行平方再除以255,用于 降低图像亮度 增强亮部对比度 减缓暗部对比度 对比度可以看作灰度的斜率 对数变换 将灰度取对 ...

  9. C++计算图像灰度值实现PhotoShop对比度100极限调整

    很久以前做的一个WOW钓鱼程序,最近在怀旧服使用过程中,发现受天气影响,机器人不能很好的查找到鱼漂,对比实际环境,感觉是鱼漂查找代码有缺陷.对游戏图像抓图后,使用PS通过调整对比度极限化,也就是对比度 ...

最新文章

  1. ISME: 北大吴晓磊组发现囊泡为细菌利用环境血红素提供全新途径
  2. ABAP Debugging Script(调试器脚本)使用的一些实际例子
  3. MFC获取文件夹下的所有文件名
  4. 设计模式:001面向对象设计原则
  5. 内存管理器剖析:ptmalloc,windows,macOS
  6. arcgis地理配准_【更新70篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
  7. 寻找春天amp;nbsp;九宫格日记-2014.04.26
  8. 基于SSM框架CRM客户管理系统
  9. 机械工程学专业词汇英语翻译
  10. Flutter在Android平台实现消息推送
  11. linux千兆网卡接百兆交换机,千兆交换机可以接百兆网线吗?
  12. python爬虫之爱思助手音乐爬取
  13. linux C 基于事件回调的epoll反应堆模型
  14. 基于神经网络的文本分类算法
  15. XSLT基础 XSL 与 XSLT
  16. php仿果壳网,模仿,令我们更亲近
  17. 一文读懂shell命令
  18. 3个月ESET全系列产品试用用户名和密码
  19. 计算机工程博士学校,计算机工程博士
  20. 互联时代,直播,短视频成为知识付费成长的良好土壤

热门文章

  1. IE11怎么调取摄像头并拍照
  2. java 中0x的数值表示方式 本质上是什么意思?
  3. 2004年10月高等教育国际金融全国统一命题考试
  4. DNA序列 UVa1368
  5. python软件设计数据分析统计服_学习笔记(一)-python制作数据分析工具
  6. 七月算法机器学习笔记4 凸优化
  7. java角谷_Java:利用递归方法实现角谷定理
  8. 安防监控显示服务器内部错误,监控摄像常见故障和处理方法
  9. 面对电磁辐射干扰,如何轻松进行电子线路设计布局?
  10. 几个常用的js 函数汇总大全