OpenCV-Python之影象直方圖的應用
阿新 • • 發佈:2018-11-10
1.直方圖均勻化
# 全域性
#直方圖的應用 直方圖均衡化(即調整影象的對比度) 直方圖即統計各畫素點的頻次
def eaualHist_demo(image):
gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) # opencv的直方圖均衡化要基於單通道灰度影象
dst = cv.equalizeHist(gray) # 自動調整影象對比度,把影象變得更清晰
cv.imshow("eaualHist_demo", dst)
#區域性直方圖均衡化
def clahe_demo(image):
gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
clahe = cv.createCLAHE(clipLimit=5, tileGridSize=(8, 8))
dst = clahe.apply(gray)
cv.imshow("clahe_demo", dst)
image = cv.imread('./data/histogram.png', 1)
cv.imshow('souce image', image)
eaualHist_demo(image)
clahe_demo(image)
cv.waitKey(0)
cv.destroyAllWindows( )
-
cv2.equalizeHist函式原型:equalizeHist(src[, dst]) 。函式equalizeHist的作用:直方圖均衡化,提高影象質量。
-
直方圖均衡化:如果一副影象的畫素佔有很多的灰度級而且分佈均勻,那麼這樣的影象往往有高對比度和多變的灰度色調。直方圖均衡化就是一種能僅靠輸入影象直方圖資訊自動達到這種效果的變換函式。它的基本思想是對影象中畫素個數多的灰度級進行展寬,而對影象中畫素個數少的灰度進行壓縮,從而擴充套件像元取值的動態範圍,提高了對比度和灰度色調的變化,使影象更加清晰。
-
全域性直方圖均衡化可能得到是一種全域性意義上的均衡化,但是有的時候這種操作並不是很好,會把某些不該調整的部分給調整了。Opencv中還有一種直方圖均衡化,它是一種區域性直方圖均衡化,也就是是說把整個影象分成許多小塊(比如按10*10作為一個小塊),那麼對每個小塊進行均衡化。
-
createCLAHE函式原型:createCLAHE([, clipLimit[, tileGridSize]])
clipLimit引數表示對比度的大小。
tileGridSize引數表示每次處理塊的大小 。 -
clahe = cv.createCLAHE(clipLimit=5, tileGridSize=(8, 8))
dst = clahe.apply(gray) 把clahe這種區域性直方圖均衡化應用到灰度圖gray
2.直方圖比較
# 直方圖比較
def creat_rgb_hist(image):
h, w, c = image.shape
rgbHist = np.zeros([16*16*16, 1], np.float32)
binsize = 256/16
for row in range(h):
for col in range(w):
b = image[row, col, 0]
g = image[row, col, 1]
r = image[row, col, 2]
index = np.int(b/binsize)*16*16 + np.int(g/binsize)*16 + np.int(r/binsize)
rgbHist[np.int(index), 0] = rgbHist[np.int(index), 0] +1
return rgbHist
def hist_compare(image1, image2):
hist1 = creat_rgb_hist(image1)
hist2 = creat_rgb_hist(image2)
match1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)
match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)
match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)
print("巴氏距離:{}\n 相關距離:{}\n 卡方距離:{}\n".format(match1, match2, match3))
image1 = cv.imread("./data/lena.jpg",1)
image2 = cv.imread("./data/starry_night.jpg",1)
cv.imshow("image1", image1)
cv.imshow("image2", image2)
hist_compare(image1=image1, image2=image2)
cv.waitKey(0)
cv.destroyAllWindows()
這兩幅圖差異很明顯
如若匯入相同圖片,則