使用 python 和 OpenCV 进行图像增强

Image enhancement with python and OpenCV

我试图通过首先将 RGB 颜色 space 转换为 YUV 颜色 space 并将直方图均衡化为 Y 值来增强我的图像。但是,输出图像看起来不太好。

对于直方图均衡,我使用 Wikipedia 上找到的方法。

这是输入图像:

这是输出图像:

我真的不知道问题出在哪里,谁能帮助我或给我一些提示?

下面是我的代码,

import cv2
import numpy as np

img = cv2.imread('/Users/simon/Documents/DIP/Homework_3/input4.bmp')
shape = img.shape

Y_origin_hist = [0] * 256
U_origin = [[0 for i in range(0, shape[1])] for j in range(0, shape[0])] 
V_origin = [[0 for i in range(0, shape[1])] for j in range(0, shape[0])] 

Y_hist = [0] * 256

# Read RGB value and calculate YUV value
for i in range(0, shape[0]) :
    for j in range(0, shape[1]) :
        px = img[i,j]
        y = int(0.299 * px[2] + 0.587 * px[1] + 0.114 * px[0])
        u = int(-0.169 * px[2] - 0.331 * px[1] + 0.5 * px[0]) + 128
        v = int(0.5 * px[2] - 0.419 * px[1] - 0.081 * px[0]) + 128
        Y_origin_hist[y] = Y_origin_hist[y] + 1
        U_origin[i][j] = u
        V_origin[i][j] = v

# Histogram equalization
for i in range(0, 256) :
    Y_hist[i] = int(((sum(Y_origin_hist[0:i]) - min(Y_origin_hist) - 1) * 255) / ((shape[0] * shape[1]) - 1))

# Write back to RGB value
for i in range(0, shape[0]) :
    for j in range(0, shape[1]) :
        px = img[i,j]
        px[0] = int(Y_hist[px[0]] + 1.77216 * (U_origin[i][j] - 128) + 0.00099 * (V_origin[i][j] - 128))
        px[1] = int(Y_hist[px[1]] - 0.3437 * (U_origin[i][j] - 128) - 0.71417 * (V_origin[i][j] - 128))
        px[2] = int(Y_hist[px[2]] - 0.00093 * (U_origin[i][j] - 128) + 1.401687 * (V_origin[i][j] - 128))

cv2.imwrite('/Users/simon/Documents/DIP/Homework_3/output4.bmp', img)

对于 C++ 中的 OpenCV,+ 和 - 运算符被重载,它们会自动防止溢出。但是,使用 Python 时情况并非如此。出于这个原因,您应该在进行数学计算时使用 cv2.add()cv2.subtract() 以获得与使用 C++ 相同的结果。