詳解OpenCV中直方圖,掩膜和直方圖均衡化的實現(xiàn)
一、圖像直方圖
1.1 定義
圖像直方圖是圖像的基本屬性之一,也是反映圖像像素數(shù)據(jù)分布的統(tǒng)計學(xué)特征,其橫坐標代表了圖像像素點在[0,255]范圍中,縱坐標代表圖像像素點出現(xiàn)的個數(shù)或百分比。如圖:
1.2 函數(shù):cv2.calcHist([img1],[channels],mask,histSize,ranges)
img:輸入圖像
channels:通道,如果輸入的是灰度圖,則此參數(shù)為[0],如果是彩色圖,傳入?yún)?shù)為[0]或[1]或[2]分別對應(yīng)BGR。
mask:掩膜統(tǒng)計整幅圖的直方圖就是None。如果畫某一部分直方圖,需要制作一個掩模圖像并使用。掩模大小和img一樣的np數(shù)組,需要的部分為255,不需要的部分為0.
histSize:直方圖bin的數(shù)目,[0,256]所以就是256。
ranges:像素范圍[0,256]顧頭不顧尾啦。
1.3 代碼實現(xiàn):
(1)準備工作加灰度圖顯示:
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)彩色圖三個不同的通道:
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é)果如圖:
從上面兩個圖我們就可發(fā)現(xiàn)直方圖很不均勻,可以比喻成不是矮胖的,所以我們接下來進行圖像直方圖均衡化。但是,在此之前我們在學(xué)習(xí)一下掩膜。
二、掩膜(mask)
2.1掩模mask思想:
掩模的大小和原圖像大小一致。掩模中只有兩部分,0和255,掩模中白色部分覆蓋到的區(qū)域保留原圖,黑色部分覆蓋到的區(qū)域置為0。如果我們讀入彩圖,在構(gòu)建np數(shù)組時,需要舍棄第三個維度,即通道。保留前兩個維度img.shape[:2],掩模的size和原圖像相同。由于mask是一個數(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掩膜過程對比
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é)果如圖:
三、直方圖均衡化
通過改變圖像的直方圖,來改變圖像中各像素的灰度,用于增強局部的對比度而不影響整體的對比度。這種方法對于背景和前景都太亮或者太暗的圖像非常有用。
3.1對圖像整體進行均衡化:
(1)進行均衡化后直方圖前后對比顯示:
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é)果對比圖:
(2)進行均衡化后圖像前后對比顯示:
img=cv2.imread("C:/Users/bwy/Desktop/lena.bmp",0) equ=cv2.equalizeHist(img) res=np.hstack((img,equ)) cv_show('res',res)
但是呢,這個方法也存在微瑕,那看一下如果我用下面這張圖你就會發(fā)現(xiàn)了:
我們會發(fā)現(xiàn)這個帥鍋的臉太亮了,我們觀察不到細節(jié)了,細節(jié)丟失了,所以這個問題我們?nèi)绾谓鉀Q呢?
3.2 自適應(yīng)均衡化
1、定義:
整幅圖像會被分成很多小塊,然后再對每一個小塊分別進行直方圖均衡化。缺點是:如果有噪聲的話,噪聲會被放大。為了避免這種情況的出現(xiàn)要使用對比度限制。
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中直方圖,掩膜和直方圖均衡化的實現(xiàn)的詳細內(nèi)容,更多關(guān)于OpenCV直方圖 掩膜 直方圖均衡化的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
TensorFlow用expand_dim()來增加維度的方法
今天小編就為大家分享一篇TensorFlow用expand_dim()來增加維度的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Python基礎(chǔ)學(xué)習(xí)之反射機制詳解
在Python中,反射是指通過一組內(nèi)置的函數(shù)和語句,在運行時動態(tài)地訪問、檢查和修改對象的屬性、方法和類信息的機制。本文將通過簡單的示例和大家講講Python中的反射機制,希望對大家有所幫助2023-03-03在Python中使用swapCase()方法轉(zhuǎn)換大小寫的教程
這篇文章主要介紹了在Python中使用swapCase()方法轉(zhuǎn)換大小寫的教程,是Python入門中的基礎(chǔ)知識,需要的朋友可以參考下2015-05-05Python趣味挑戰(zhàn)之用pygame實現(xiàn)簡單的金幣旋轉(zhuǎn)效果
今天教大家怎么用pygame實現(xiàn)簡單的金幣旋轉(zhuǎn)效果,文中有非常詳細的代碼示例,對正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05python數(shù)據(jù)分析近年比特幣價格漲幅趨勢分布
這篇文章主要為大家介紹了python分析近年來比特幣價格漲幅趨勢的數(shù)據(jù)分布,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-11-11