python用numpy和pil处理图像成灰度图_「火炉炼AI」机器学习047-图像的直方图均衡化操作...
【火爐煉AI】機器學習047-圖像的直方圖均衡化操作
【火爐煉AI】機器學習047-圖像的直方圖均衡化操作
(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
圖像的直方圖是指圖像中每一像素范圍內像素頻率的統計關系圖,直方圖能夠給出圖像灰度范圍,每個灰度的頻度和灰度的分布,整幅圖的平均明暗,對比度等概貌性描述。灰度直方圖是灰度級的函數,反映的是圖像中具有該灰度級像素的個數。如果大部分像素都集中在低灰度區域,圖像會呈現暗的特性,反之,如果大部分圖像都集中在高灰度區域,圖像呈現出亮的特性。
直方圖均衡化是指,將隨機分布的圖像直方圖修改成均勻分布的直方圖,基本思想是對原始圖像的像素灰度做某種映射變換,使得變換后的圖像灰度的概率密度呈均勻分布,這就意味著圖像灰度的動態范圍得到擴大,提高了圖像的對比度。
1. 獲取圖像直方圖
圖像直方圖有灰度直方圖和彩色直方圖的區別,如果輸入圖像是灰度圖,則得到灰度直方圖,如果輸入圖像是BGR圖像,得到的則是某個顏色通道的直方圖。
# 獲取灰度直方圖gray_hist=cv2.calcHist([gray], [0], None, [256], [0, 256])plt.plot(gray_hist)復制代碼取得圖像的灰度直方圖,只需要調用cv2.calcHist()函數即可,這個函數的參數為:
第一個參數為輸入的圖像,可以是灰度圖也可以是彩色圖。
第二個參數是用于計算直方圖的通道,這里使用灰度圖計算直方圖,所以就直接使用第一個通道;
第三個參數是Mask,這里沒有使用,所以用None。
第四個參數是histSize,表示這個直方圖分成多少份(即多少個直方柱)。
第五個參數是表示直方圖中各個像素的值,[0.0, 256.0]表示直方圖能表示像素值從0.0到256的像素。
最后是兩個可選參數,由于直方圖作為函數結果返回,所以第六個hist就沒有意義了(待確定)
最后一個accumulate是一個布爾值,用來表示直方圖是否疊加。
# 獲取彩色圖的各個通道直方圖hist_B=cv2.calcHist([img],[0],None,[256],[0,256])plt.plot(hist_B,'b',label='B') # Blue colorhist_G=cv2.calcHist([img],[1],None,[256],[0,256])plt.plot(hist_G,'g',label='G') # green colorhist_R=cv2.calcHist([img],[2],None,[256],[0,256])plt.plot(hist_R,'r',label='R')# red colorplt.title('histogram of Color Chanel')plt.legend()復制代碼2. 直方圖均衡化
2.1 灰度圖的直方圖均衡化
為了方便對比,我將直方圖均衡化前后的圖像都繪制到同一個圖片中。如下:
# 灰度圖的直方圖均衡化:# 先顯示均衡化前后的圖像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')復制代碼話說,經過直方圖均衡化之后的直方圖怎么長的這么丑?
直方圖均衡化只需要一個函數cv2.equalizeHist()即可,但是需要注意:cv2.equalizeHist()只提供灰度值圖片的處理,當把上面的圖片換成RGB圖片時,就會報錯了。
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 colorhist_G=cv2.calcHist([img],[1],None,[256],[0,256])plt.plot(hist_G,'g',label='G') # green colorhist_R=cv2.calcHist([img],[2],None,[256],[0,256])plt.plot(hist_R,'r',label='R')# red colorplt.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 colorhist_G=cv2.calcHist([img_histeq],[1],None,[256],[0,256])plt.plot(hist_G,'g',label='G') # green colorhist_R=cv2.calcHist([img_histeq],[2],None,[256],[0,256])plt.plot(hist_R,'r',label='R')# red colorplt.title('Color Histogram after Equalization')plt.legend()復制代碼同樣的,經過對比可以看出,經過直方圖均衡化之后的圖像直方圖都比較丑。。。。
########################小**********結###############################
1,對于圖像直方圖進行操作可以比較明顯的改變圖像的對比度和明暗度。
2,使用cv2.equalizeHist函數可以直接改變灰度圖的直方圖,但是卻不能直接改變彩色圖的直方圖,對于彩色圖如果想要均衡化,需要先轉變到YUV空間再進行轉換。
#################################################################
注:本部分代碼已經全部上傳到(我的github)上,歡迎下載。
參考資料:
1, Python機器學習經典實例,Prateek Joshi著,陶俊杰,陳小莉譯參考文獻:K碼農-http://kmanong.top/kmn/qxw/form/home?top_cate=28
總結
以上是生活随笔為你收集整理的python用numpy和pil处理图像成灰度图_「火炉炼AI」机器学习047-图像的直方图均衡化操作...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年部队转业养老保险从2021年开
- 下一篇: 卡写入速度_看清商家买相机送SD卡的套路