用途:
- 通常用來增加許多圖像的全局對比度,尤其是當圖像的有用數據的對比度相當接近的時候。通過這種方法,亮度可以更好地在直方圖上分佈。這樣就可以用於增強局部的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴展常用的亮度來實現這種功能。
- 這種方法對於背景和前景都太亮或者太暗的圖像非常有用,這種方法尤其是可以帶來X光圖像中更好的骨骼結構顯示以及曝光過度或者曝光不足照片中更好的細節。
優點:它是一個相當直觀的技術並且是可逆操作,如果已知均衡化函數,那麼就可以恢復原始的直方圖,並且計算量也不大。
缺點:它對處理的數據不加選擇,它可能會增加背景噪聲的對比度並且降低有用信號的對比度。
代碼如下:
此時用的是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()