詳解OpenCV中直方圖,掩膜和直方圖均衡化的實(shí)現(xiàn)
一、圖像直方圖
1.1 定義
圖像直方圖是圖像的基本屬性之一,也是反映圖像像素?cái)?shù)據(jù)分布的統(tǒng)計(jì)學(xué)特征,其橫坐標(biāo)代表了圖像像素點(diǎn)在[0,255]范圍中,縱坐標(biāo)代表圖像像素點(diǎn)出現(xiàn)的個(gè)數(shù)或百分比。如圖:


1.2 函數(shù):cv2.calcHist([img1],[channels],mask,histSize,ranges)
img:輸入圖像
channels:通道,如果輸入的是灰度圖,則此參數(shù)為[0],如果是彩色圖,傳入?yún)?shù)為[0]或[1]或[2]分別對(duì)應(yīng)BGR。
mask:掩膜統(tǒng)計(jì)整幅圖的直方圖就是None。如果畫(huà)某一部分直方圖,需要制作一個(gè)掩模圖像并使用。掩模大小和img一樣的np數(shù)組,需要的部分為255,不需要的部分為0.
histSize:直方圖bin的數(shù)目,[0,256]所以就是256。
ranges:像素范圍[0,256]顧頭不顧尾啦。
1.3 代碼實(shí)現(xiàn):
(1)準(zhǔn)備工作加灰度圖顯示:
import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#顯示圖像
def cv_show(name,img):
cv2.imshow(name,img)
cv2.cv2.waitKey(0)
cv2.destroyAllWindows()
#導(dǎo)入圖像
img1=cv2.imread("C:/Users/bwy/Desktop/lena.bmp",0)
hist=cv2.calcHist([img1],[0],None,[256],[0,256])
print(hist.shape)
plt.hist(img.ravel(),256)
plt.show()結(jié)果如圖(灰度圖):

(2)彩色圖三個(gè)不同的通道:
img=cv2.imread("C:/Users/bwy/Desktop/7.png")
cv_show('img',img)
color=('b','g','r')
for i,col in enumerate(color):
histr=cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color=col)
plt.xlim([0,256])結(jié)果如圖:

從上面兩個(gè)圖我們就可發(fā)現(xiàn)直方圖很不均勻,可以比喻成不是矮胖的,所以我們接下來(lái)進(jìn)行圖像直方圖均衡化。但是,在此之前我們?cè)趯W(xué)習(xí)一下掩膜。
二、掩膜(mask)
2.1掩模mask思想:
掩模的大小和原圖像大小一致。掩模中只有兩部分,0和255,掩模中白色部分覆蓋到的區(qū)域保留原圖,黑色部分覆蓋到的區(qū)域置為0。如果我們讀入彩圖,在構(gòu)建np數(shù)組時(shí),需要舍棄第三個(gè)維度,即通道。保留前兩個(gè)維度img.shape[:2],掩模的size和原圖像相同。由于mask是一個(gè)數(shù)組,可以使用切片方法將保留的位置變成白色255。
2.2代碼:
img.shape[:2]#(420, 607)
#創(chuàng)建mast
mask=np.zeros(img.shape[:2],np.uint8)
mask[100:300,200:400]=255
cv_show('mask',mask)結(jié)果如圖:

masked_img=cv2.bitwise_and(img1,img1,mask=mask)
cv_show('masked_img',masked_img)結(jié)果如圖:

2.3掩膜過(guò)程對(duì)比
plt.subplot(221),plt.imshow(img1) plt.subplot(222),plt.imshow(mask) plt.subplot(223),plt.imshow(masked_img) plt.subplot(224),plt.plot(hist_full),plt.plot(hist_mask) plt.xlim([0,256]) plt.show()
結(jié)果如圖:

三、直方圖均衡化
通過(guò)改變圖像的直方圖,來(lái)改變圖像中各像素的灰度,用于增強(qiáng)局部的對(duì)比度而不影響整體的對(duì)比度。這種方法對(duì)于背景和前景都太亮或者太暗的圖像非常有用。
3.1對(duì)圖像整體進(jìn)行均衡化:
(1)進(jìn)行均衡化后直方圖前后對(duì)比顯示:
img=cv2.imread("C:/Users/bwy/Desktop/lena.bmp",0)
plt.hist(img.ravel(),256)
plt.show()
equ=cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)
plt.show()結(jié)果對(duì)比圖:


(2)進(jìn)行均衡化后圖像前后對(duì)比顯示:
img=cv2.imread("C:/Users/bwy/Desktop/lena.bmp",0)
equ=cv2.equalizeHist(img)
res=np.hstack((img,equ))
cv_show('res',res)但是呢,這個(gè)方法也存在微瑕,那看一下如果我用下面這張圖你就會(huì)發(fā)現(xiàn)了:

我們會(huì)發(fā)現(xiàn)這個(gè)帥鍋的臉太亮了,我們觀察不到細(xì)節(jié)了,細(xì)節(jié)丟失了,所以這個(gè)問(wèn)題我們?nèi)绾谓鉀Q呢?
3.2 自適應(yīng)均衡化
1、定義:
整幅圖像會(huì)被分成很多小塊,然后再對(duì)每一個(gè)小塊分別進(jìn)行直方圖均衡化。缺點(diǎn)是:如果有噪聲的話,噪聲會(huì)被放大。為了避免這種情況的出現(xiàn)要使用對(duì)比度限制。
2、代碼:
img2=cv2.imread("C:/Users/bwy/Desktop/1.png",0)
img2.shape#(508, 672)
img3=cv2.resize(img2,(400,300))
equ1=cv2.equalizeHist(img3)
clahe=cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
res_clahe=clahe.apply(img3)
res=np.hstack((img3,equ1,res_clahe))
cv_show('res',res)結(jié)果如圖:

以上就是詳解OpenCV中直方圖,掩膜和直方圖均衡化的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于OpenCV直方圖 掩膜 直方圖均衡化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python飛機(jī)大戰(zhàn) pygame游戲創(chuàng)建快速入門(mén)詳解
這篇文章主要介紹了python飛機(jī)大戰(zhàn) pygame游戲創(chuàng)建,結(jié)合實(shí)例形式詳細(xì)分析了Python使用pygame創(chuàng)建飛機(jī)大戰(zhàn)游戲的具體步驟與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-12-12
Python 獲取命令行參數(shù)內(nèi)容及參數(shù)個(gè)數(shù)的實(shí)例
今天小編就為大家分享一篇Python 獲取命令行參數(shù)內(nèi)容及參數(shù)個(gè)數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
五個(gè)方便好用的Python自動(dòng)化辦公腳本的實(shí)現(xiàn)
在沒(méi)有人工干預(yù)的情況下,機(jī)器可以自己完成各項(xiàng)任務(wù),這大大提升了工作效率。Python因?yàn)檎Z(yǔ)法簡(jiǎn)潔易懂,而且有豐富的第三方工具庫(kù),所以非常適合編寫(xiě)自動(dòng)化腳本,本文就為大家?guī)?lái)了五個(gè)這樣的腳本,需要的可以參考一下2022-01-01
使用Python的datetime庫(kù)處理時(shí)間(RPA流程)
datetime 是 Python 處理日期和時(shí)間的標(biāo)準(zhǔn)庫(kù)。這篇文章主要介紹了使用Python的datetime庫(kù)處理時(shí)間(RPA流程),需要的朋友可以參考下2019-11-11
Python使用smtplib庫(kù)發(fā)送電子郵件
Python提供了smtplib庫(kù),用于發(fā)送電子郵件,本文將詳細(xì)介紹如何使用Python的smtplib庫(kù)來(lái)發(fā)送電子郵件,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11

