欢迎访问宙启技术站
智能推送

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类来实现图像的直方图均衡化和归一化。读者可以通过修改代码中的图像路径来测试不同的图像。