我在Debian Linux上使用Python 2.7以及matplotlib,Numpy和Scipy以及PIL。 我能够使用上面提到的代码生成图像的H S和I参数的直方图。我打算在H S和I直方图上应用直方图均衡,然后将其转换回结果图像,以便我可以比较这些变化。有人可以帮助我使用直方图均衡的必要代码并将均衡的直方图转换回图像。
import scipy
from scipy import ndimage
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import numpy as np
from scipy import misc
import scipy.misc
img = scipy.misc.imread("/home/subhradeep/Desktop/testc.jpg")
array=np.asarray(img)
arr=(array.astype(float))/255.0
img_hsv = colors.rgb_to_hsv(arr[...,:3])
lu1=img_hsv[...,0].flatten()
plt.subplot(1,3,1)
plt.hist(lu1*360,bins=360,range=(0.0,360.0),histtype='stepfilled', color='r', label='Hue')
plt.title("Hue")
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.legend()
lu2=img_hsv[...,1].flatten()
plt.subplot(1,3,2)
plt.hist(lu2,bins=100,range=(0.0,1.0),histtype='stepfilled', color='g', label='Saturation')
plt.title("Saturation")
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.legend()
lu3=img_hsv[...,2].flatten()
plt.subplot(1,3,3)
plt.hist(lu3*255,bins=256,range=(0.0,255.0),histtype='stepfilled', color='b', label='Intesity')
plt.title("Intensity")
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.legend()
plt.show()
我需要在python中实现eq(4)
答案 0 :(得分:0)
据我所知,您只需要将直方图均衡应用于HSV变换的值分量以均衡图像:
def histeq(im,nbr_bins=256):
""" Histogram equalization of a grayscale image.
From http://programmingcomputervision.com/"""
# get image histogram
imhist,bins = np.histogram(im.flatten(),nbr_bins,normed=True)
cdf = imhist.cumsum() # cumulative distribution function
cdf = 1 * cdf / cdf[-1] # normalize (value component max is 1.0)
# use linear interpolation of cdf to find new pixel values
im2 = np.interp(im.flatten(),bins[:-1],cdf)
return im2.reshape(im.shape), cdf
#equalise the intensity component
img_hsv[:,:,2], cdf = histeq(img_hsv[:,:,2])
#then convert back to RGB space
img_eq = colors.hsv_to_rgb(img_hsv)
曝光不足的输入图像:
直方图均衡输出图像:
当然,如果您希望查看输出的外观,您可以将上述内容应用于HSV转换的每个通道。我不确定你会通过这样做达到什么目的。