【火爐煉AI】機(jī)器學(xué)習(xí)047-圖像的直方圖均衡化操作
(本文所使用的Python庫和版本號(hào): Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
圖像的直方圖是指圖像中每一像素范圍內(nèi)像素頻率的統(tǒng)計(jì)關(guān)系圖乐纸,直方圖能夠給出圖像灰度范圍,每個(gè)灰度的頻度和灰度的分布摇予,整幅圖的平均明暗汽绢,對(duì)比度等概貌性描述〔啻鳎灰度直方圖是灰度級(jí)的函數(shù)宁昭,反映的是圖像中具有該灰度級(jí)像素的個(gè)數(shù)。如果大部分像素都集中在低灰度區(qū)域酗宋,圖像會(huì)呈現(xiàn)暗的特性积仗,反之,如果大部分圖像都集中在高灰度區(qū)域本缠,圖像呈現(xiàn)出亮的特性斥扛。
直方圖均衡化是指入问,將隨機(jī)分布的圖像直方圖修改成均勻分布的直方圖丹锹,基本思想是對(duì)原始圖像的像素灰度做某種映射變換,使得變換后的圖像灰度的概率密度呈均勻分布芬失,這就意味著圖像灰度的動(dòng)態(tài)范圍得到擴(kuò)大楣黍,提高了圖像的對(duì)比度。
1. 獲取圖像直方圖
圖像直方圖有灰度直方圖和彩色直方圖的區(qū)別棱烂,如果輸入圖像是灰度圖租漂,則得到灰度直方圖,如果輸入圖像是BGR圖像,得到的則是某個(gè)顏色通道的直方圖哩治。
# 獲取灰度直方圖
gray_hist=cv2.calcHist([gray], [0], None, [256], [0, 256])
plt.plot(gray_hist)
取得圖像的灰度直方圖秃踩,只需要調(diào)用cv2.calcHist()函數(shù)即可,這個(gè)函數(shù)的參數(shù)為:
第一個(gè)參數(shù)為輸入的圖像业筏,可以是灰度圖也可以是彩色圖憔杨。
第二個(gè)參數(shù)是用于計(jì)算直方圖的通道,這里使用灰度圖計(jì)算直方圖蒜胖,所以就直接使用第一個(gè)通道消别;
第三個(gè)參數(shù)是Mask,這里沒有使用台谢,所以用None寻狂。
第四個(gè)參數(shù)是histSize,表示這個(gè)直方圖分成多少份(即多少個(gè)直方柱)朋沮。
第五個(gè)參數(shù)是表示直方圖中各個(gè)像素的值蛇券,[0.0, 256.0]表示直方圖能表示像素值從0.0到256的像素。
最后是兩個(gè)可選參數(shù)朽们,由于直方圖作為函數(shù)結(jié)果返回怀读,所以第六個(gè)hist就沒有意義了(待確定)
最后一個(gè)accumulate是一個(gè)布爾值,用來表示直方圖是否疊加骑脱。
# 獲取彩色圖的各個(gè)通道直方圖
hist_B=cv2.calcHist([img],[0],None,[256],[0,256])
plt.plot(hist_B,'b',label='B') # Blue color
hist_G=cv2.calcHist([img],[1],None,[256],[0,256])
plt.plot(hist_G,'g',label='G') # green color
hist_R=cv2.calcHist([img],[2],None,[256],[0,256])
plt.plot(hist_R,'r',label='R')# red color
plt.title('histogram of Color Chanel')
plt.legend()
2. 直方圖均衡化
2.1 灰度圖的直方圖均衡化
為了方便對(duì)比菜枷,我將直方圖均衡化前后的圖像都繪制到同一個(gè)圖片中。如下:
# 灰度圖的直方圖均衡化:
# 先顯示均衡化前后的圖像
plt.figure(12,figsize=(15,30))
plt.subplot(121)
plt.imshow(gray,cmap='gray')
plt.title('GrayImg before Equalization')
equalize = cv2.equalizeHist(gray)
plt.subplot(122)
plt.imshow(equalize,cmap='gray')
plt.title('GrayImg after Equalization')
plt.plot(gray_hist,c='b',label='raw_Hist')
gray_equalized_hist=cv2.calcHist([equalize], [0], None, [256], [0, 256])
plt.plot(gray_equalized_hist,c='r',label='Equalized')
plt.legend()
plt.title('Histogram comparison')
話說叁丧,經(jīng)過直方圖均衡化之后的直方圖怎么長(zhǎng)的這么丑啤誊?
直方圖均衡化只需要一個(gè)函數(shù)cv2.equalizeHist()即可,但是需要注意:cv2.equalizeHist()只提供灰度值圖片的處理拥娄,當(dāng)把上面的圖片換成RGB圖片時(shí)蚊锹,就會(huì)報(bào)錯(cuò)了。
2.2 彩色圖的直方圖均衡化
彩色圖的直方圖均衡化需要借助YUV空間稚瘾,如下代碼:
# 彩色直方圖均衡化需要借助YUV空間
img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0])
img_histeq = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)
# 顯示均衡化前后的圖像
plt.figure(12,figsize=(15,30))
plt.subplot(121)
img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.title('ColorImg before Equalization')
plt.subplot(122)
img_hist_rgb=cv2.cvtColor(img_histeq,cv2.COLOR_BGR2RGB)
plt.imshow(img_hist_rgb)
plt.title('ColorImg after Equalization')
# 顯示均衡化前后的直方圖情況
plt.figure(12)
plt.subplot(121)
hist_B=cv2.calcHist([img],[0],None,[256],[0,256])
plt.plot(hist_B,'b',label='B') # Blue color
hist_G=cv2.calcHist([img],[1],None,[256],[0,256])
plt.plot(hist_G,'g',label='G') # green color
hist_R=cv2.calcHist([img],[2],None,[256],[0,256])
plt.plot(hist_R,'r',label='R')# red color
plt.title('Color Histogram before Equalization')
plt.legend()
plt.subplot(122)
hist_B=cv2.calcHist([img_histeq],[0],None,[256],[0,256])
plt.plot(hist_B,'b',label='B') # Blue color
hist_G=cv2.calcHist([img_histeq],[1],None,[256],[0,256])
plt.plot(hist_G,'g',label='G') # green color
hist_R=cv2.calcHist([img_histeq],[2],None,[256],[0,256])
plt.plot(hist_R,'r',label='R')# red color
plt.title('Color Histogram after Equalization')
plt.legend()
同樣的牡昆,經(jīng)過對(duì)比可以看出,經(jīng)過直方圖均衡化之后的圖像直方圖都比較丑摊欠。丢烘。。些椒。
########################小**********結(jié)###############################
1播瞳,對(duì)于圖像直方圖進(jìn)行操作可以比較明顯的改變圖像的對(duì)比度和明暗度。
2免糕,使用cv2.equalizeHist函數(shù)可以直接改變灰度圖的直方圖赢乓,但是卻不能直接改變彩色圖的直方圖忧侧,對(duì)于彩色圖如果想要均衡化,需要先轉(zhuǎn)變到Y(jié)UV空間再進(jìn)行轉(zhuǎn)換牌芋。
#################################################################
注:本部分代碼已經(jīng)全部上傳到(我的github)上蚓炬,歡迎下載。
參考資料:
1, Python機(jī)器學(xué)習(xí)經(jīng)典實(shí)例躺屁,Prateek Joshi著试吁,陶俊杰,陳小莉譯