用途:
优点:它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。
缺点:它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。
代码如下:
此时用的是opencv中的函数,查找表方法还待进一步学习,详见:http://blog.csdn.net/sunny2038/article/details/9403059
''' 1.均衡化前的直方图和累计直方图 2.均衡化后的直方图和累计直方图 均衡化的函数用的是opencv中的equalizaHist 计算直方图的函数用的是opencv中的calcHist ''' import cv2 import numpy as np def drawHist(hist): img = np.zeros((256,256),np.uint8) r = max(hist)/255 for i in range (0,256): hist[i] = hist[i]/r cv2.line(img,(i,255),(i,255-hist[i]),255) return img img = cv2.imread("dark.jpg", 0) hist1= cv2.calcHist([img], #计算图像的直方图 [0], #使用的通道 None, #没有使用mask [256], #it is a 1D histogram [0.0,255.0]) hist11 = hist1.cumsum()#累计直方图,求累计值不会改变原数组的值 hist111 = hist11.reshape(hist1.shape)#reshape也不会改变原数组的值 #hist1是二维(ndim),hist11是一维 ############均衡化后的投影值和累计值####### equ = cv2.equalizeHist (img)#均衡化 hist2= cv2.calcHist([equ], #计算图像的直方图 [0], #使用的通道 None, #没有使用mask [256], #it is a 1D histogram [0.0,255.0]) hist22 = hist2.cumsum()#累计直方图,求累计值不会改变原数组的值 hist222 = hist22.reshape(hist2.shape)#reshape也不会改变原数组的值 a = drawHist(hist1) a1 = drawHist(hist111) cv2.imshow("均衡化前的直方图",a) cv2.imshow("均衡化前的累计直方图",a1) print b = drawHist(hist2) b1 = drawHist(hist222) cv2.imshow("均衡化后的直方图",b) cv2.imshow("均衡化后的累计直方图",b1) cv2.waitKey() cv2.destroyAllWindows()