简体   繁体   中英

Image enhancement with python and OpenCV

I am trying to enhance my image by first converting RGB color space to YUV color space and do histogram equalization to Y value. However, the output image does not look good.

For histogram equalization, I use the method found on Wikipedia .

Here is the input image: 在此处输入图片说明

Here is the output image: 在此处输入图片说明

I really don't know where the problem is, can anyone help me or give me some hint?

Below is my code,

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)

For OpenCV in C++ the + and - operators are overloaded and they automatically prevent overflows. However, this is not the case when using Python. For this reason you should use cv2.add() and cv2.subtract() when doing math to get the same results that you would get using C++.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM