PyQt5.QtGui.QImage实现图像的直方图均衡化与归一化
发布时间:2024-01-13 06:28:04
PyQt5是一个用于创建GUI应用程序的Python工具包,它提供了丰富的GUI组件和功能。在PyQt5.QtGui模块中,QImage类代表了一张图像。
直方图均衡化(Histogram Equalization)是一种图像处理技术,可以增强图像的对比度。归一化(Normalization)是对图像的亮度值进行缩放,使其范围在0到255之间,方便后续处理。下面是一个使用PyQt5.QtGui.QImage类实现图像直方图均衡化和归一化的例子:
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget
from PyQt5.QtGui import QImage, QPixmap, QPainter, QColor
from PyQt5.QtCore import Qt
def histogram_equalization(image):
# 获取图像的宽度和高度
width, height = image.width(), image.height()
# 计算图像的直方图
hist = [0] * 256
for y in range(height):
for x in range(width):
pixel = image.pixel(x, y)
value = (QColor(pixel).red() + QColor(pixel).green() + QColor(pixel).blue()) // 3
hist[value] += 1
# 计算直方图的累积分布
cdf = [0] * 256
cdf[0] = hist[0]
for i in range(1, 256):
cdf[i] = cdf[i-1] + hist[i]
# 归一化累积分布
cdf_normalized = [0] * 256
for i in range(256):
cdf_normalized[i] = cdf[i] * 255 // cdf[255]
# 创建新的图像对象并进行直方图均衡化
equalized_image = QImage(width, height, QImage.Format_RGB32)
painter = QPainter(equalized_image)
for y in range(height):
for x in range(width):
pixel = image.pixel(x, y)
value = (QColor(pixel).red() + QColor(pixel).green() + QColor(pixel).blue()) // 3
color = QColor(cdf_normalized[value], cdf_normalized[value], cdf_normalized[value])
painter.setPen(color)
painter.drawPoint(x, y)
painter.end()
return equalized_image
def normalize_image(image):
# 获取图像的宽度和高度
width, height = image.width(), image.height()
# 找到图像的最小值和最大值
min_value = 255
max_value = 0
for y in range(height):
for x in range(width):
pixel = image.pixel(x, y)
value = (QColor(pixel).red() + QColor(pixel).green() + QColor(pixel).blue()) // 3
if value < min_value:
min_value = value
if value > max_value:
max_value = value
# 创建新的图像对象并进行归一化
normalized_image = QImage(width, height, QImage.Format_RGB32)
painter = QPainter(normalized_image)
for y in range(height):
for x in range(width):
pixel = image.pixel(x, y)
value = (QColor(pixel).red() + QColor(pixel).green() + QColor(pixel).blue()) // 3
normalized_value = (value - min_value) * 255 // (max_value - min_value)
color = QColor(normalized_value, normalized_value, normalized_value)
painter.setPen(color)
painter.drawPoint(x, y)
painter.end()
return normalized_image
if __name__ == '__main__':
app = QApplication(sys.argv)
# 加载图像并创建QImage对象
image = QImage("image.png")
# 进行直方图均衡化
equalized_image = histogram_equalization(image)
# 进行归一化
normalized_image = normalize_image(image)
# 创建窗口和布局
window = QWidget()
layout = QVBoxLayout()
window.setLayout(layout)
# 显示原始图像
original_label = QLabel()
original_pixmap = QPixmap.fromImage(image)
original_label.setPixmap(original_pixmap)
layout.addWidget(original_label)
# 显示直方图均衡化后的图像
equalized_label = QLabel()
equalized_pixmap = QPixmap.fromImage(equalized_image)
equalized_label.setPixmap(equalized_pixmap)
layout.addWidget(equalized_label)
# 显示归一化后的图像
normalized_label = QLabel()
normalized_pixmap = QPixmap.fromImage(normalized_image)
normalized_label.setPixmap(normalized_pixmap)
layout.addWidget(normalized_label)
# 显示窗口
window.show()
sys.exit(app.exec_())
上面的代码是一个完整的例子,首先加载图像并创建一个QImage对象。然后调用histogram_equalization()函数进行直方图均衡化,将返回的均衡化后的图像保存在equalized_image变量中。接下来调用normalize_image()函数进行归一化,将返回的归一化后的图像保存在normalized_image变量中。
然后,创建一个窗口并给窗口添加一个垂直布局。接着,创建三个QLabel控件分别用来显示原始图像、直方图均衡化后的图像和归一化后的图像。通过setPixmap()方法将相应的图片设置给QLabel控件。
最后,显示窗口并进入事件循环。
这个例子演示了如何使用PyQt5.QtGui.QImage类来实现图像的直方图均衡化和归一化。读者可以通过修改代码中的图像路径来测试不同的图像。
