1. 程式人生 > >直方圖均衡化(python實現)

直方圖均衡化(python實現)

用途

  • 通常用來增加許多影象的全域性對比度,尤其是當影象的有用資料的對比度相當接近的時候。通過這種方法,亮度可以更好地在直方圖上分佈。這樣就可以用於增強區域性的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴充套件常用的亮度來實現這種功能。
  • 這種方法對於背景和前景都太亮或者太暗的影象非常有用,這種方法尤其是可以帶來X光影象中更好的骨骼結構顯示以及曝光過度或者曝光不足照片中更好的細節。

優點它是一個相當直觀的技術並且是可逆操作,如果已知均衡化函式,那麼就可以恢復原始的直方圖,並且計算量也不大。

缺點:它對處理的資料不加選擇,它可能會增加背景噪聲的對比度並且降低有用訊號的對比度。

程式碼如下:

'''
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()