hsv 直方图均衡化_Opencv从零开始 - 「启蒙篇」- 直方图、直方图均衡和反向投射...
本文主要介紹一些opencv關(guān)于直方圖的一些知識運(yùn)用,直方圖是非常常用的圖像處理方法,有時候在很多圖像預(yù)處理中能起到特別好的效果,大家可以一起來學(xué)習(xí)探討~
目錄
- 直方圖
- 計算直方圖
- 直方圖均衡化
- CLAHE 自適應(yīng)均衡化
- 2D直方圖
- 直方圖反射投影
直方圖
?? 問:什么是直方圖?
? 答:直方圖是可以對整幅圖的灰度分布進(jìn)行整體了解的圖示,通過直方圖我們可以對圖像的對比度、亮度和灰度分布等有一個直觀了解。
計算直方圖
- 使用opencv的函數(shù)cv2.calcHist(images, channels, mask, histSize, ranges):
- 參數(shù)1:要計算的原圖,以方括號的傳入,如:[img]。
- 參數(shù)2:類似前面提到的dims,灰度圖寫[0]就行,彩色圖B/G/R分別傳入[0]/[1]/[2]。
- 參數(shù)3:要計算的區(qū)域ROI,計算整幅圖的話,寫None。
- 參數(shù)4:也叫bins,子區(qū)段數(shù)目,如果我們統(tǒng)計0-255每個像素值,bins=256;如果劃分區(qū)間,比如0-15, 16-31…240-255這樣16個區(qū)間,bins=16。
- 參數(shù)5:range,要計算的像素值范圍,一般為[0,256)。
- 使用numpy的函數(shù) np.bincount():
- 用Numpy的函數(shù)計算,其中ravel()函數(shù)將二維矩陣展平變成一維數(shù)組.
- 繪制直方圖使用Matplotlib自帶的繪制工具plt.hist()繪制。
?? 當(dāng)然,也可以用前面計算出來的結(jié)果繪制:
plt.plot(hist)?? 當(dāng)然,也可以繪制出r,g,b不同通道的直方圖
import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('../data/home.jpg')color = ('b','g','r')for i,col in enumerate(color): histr = cv.calcHist([img],[i],None,[256],[0,256]) plt.plot(histr,color = col) plt.xlim([0,256])plt.show()r,g,b通道的直方圖
?? 當(dāng)然,也可以繪制出ROI的直方圖
import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('../data/home.jpg',0)mask = np.zeros(img.shape[:2], np.uint8)mask[100:300, 100:400] = 255mask_img = cv.bitwise_and(img, img , mask = mask)hist_full = cv.calcHist([img],[0],None,[256],[0,256])hist_mask = cv.calcHist([img],[0],mask,[256],[0,256])cv.imshow('fd', mask_img)cv.waitKey(0)plt.subplot(221), plt.imshow(img, 'gray')plt.subplot(222), plt.imshow(mask,'gray')plt.subplot(223), plt.imshow(mask_img, 'gray')plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)plt.xlim([0,256])plt.show()ROI的直方圖
直方圖均衡化
?? 一副效果好的圖像通常在直方圖上的分布比較均勻,直方圖均衡化就是用來改善圖像的全局亮度和對比度。
直方圖均衡化
OpenCV中用cv2.equalizeHist() 實現(xiàn)均衡化:
1?? 灰度圖均衡,直接使用cv2.equalizeHist(gray)
2?? 彩色圖均衡,分別在不同的通道均衡后合并
import cv2import numpy as npimg = cv2.imread("girl.jpg", 1)gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 灰度圖均衡化equ = cv2.equalizeHist(gray)# 水平拼接原圖和均衡圖result1 = np.hstack((gray, equ))# 彩色圖像均衡化,需要分解通道 對每一個通道均衡化(b, g, r) = cv2.split(img)bH = cv2.equalizeHist(b)gH = cv2.equalizeHist(g)rH = cv2.equalizeHist(r)# 合并每一個通道equ2 = cv2.merge((bH, gH, rH))# 水平拼接原圖和均衡圖result2 = np.hstack((img,equ2))灰度均衡化
彩色均衡化
CLAHE 自適應(yīng)均衡化
2D直方圖
?? 2D直方圖通常需要考慮每個顏色(Hue)和飽和度(Saturation)。
?? 同樣適用cv2.calcHist()函數(shù)計算直方圖
?? 參數(shù)修改:
- channels=[0,1] 因為我們需要同時處理 H 和 S 兩個通道。
- bins=[180,256] H通道為180,S通道為256。
- range=[0,180,0,256] H 的取值范圍在0到180, S的取值范圍在0到256。
2D直方圖
直方圖反射投影
- 反向投影可以用來做圖像分割,尋找感興趣區(qū)間。它會輸出與輸入圖像大小相同的圖像,每一個像素值代表了輸入圖像上對應(yīng)點(diǎn)屬于目標(biāo)對象的概率,簡言之,輸出圖像中像素值越高的點(diǎn)越可能代表想要查找的目標(biāo)。
- 直方圖投影經(jīng)常與camshift(追蹤算法)算法一起使用。
- 過程:首先要為包含我們感興趣區(qū)域的圖像建立直方圖。被查找的對象最好是占據(jù)整個圖像(圖像里全是對象),最好使用顏色直方圖,物體的顏色信息比灰度圖像更容易被分割和識別。再將顏色直方圖投影到輸入圖像查找目標(biāo),也就是找到輸入圖像中每一個像素點(diǎn)的像素值在直方圖中對應(yīng)的概率,這樣就得到一個概率圖像,最后設(shè)置適當(dāng)?shù)拈撝祵Ω怕蕡D像進(jìn)行二值化。
?? Opencv函數(shù) cv2.calcBackProject()直接實現(xiàn)反向投影,參數(shù)與cv2.calcHist() 基本一致。其中一個參數(shù)是要查找的目標(biāo)的直方圖。在使用目標(biāo)直方圖反向投影前應(yīng)該進(jìn)行歸一化處理。返回結(jié)果是一個概率圖像,然后進(jìn)行圓盤形狀卷積操作,再二值化。
import cv2import numpy as np# 想要尋找的roi圖片roi = cv2.imread('roi.png')hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)# 目標(biāo)搜索圖片target = cv2.imread('football.png')hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)# 計算roi直方圖roihist = cv2.calcHist([hsvt], [0, 1], None, [180, 256], [0, 180, 0, 256])# 歸一化,參數(shù)為原圖像和輸出圖像,歸一化后值全部在0到255范圍# cv2.NORM_MINMAX 對數(shù)組的所有值進(jìn)行轉(zhuǎn)化,使它們線性映射到最小值和最大值之 間cv2.normalize(roihist, roihist, 0, 255, cv2.NORM_MINMAX)dst = cv2.calcBackProject([hsvt], [0,1],roihist, [0, 180, 0, 256], 1)# 此處卷積可以把分散的點(diǎn)連在一起disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))dst = cv2.filter2D(dst, -1, disc)ret, thresh = cv2.threshold(dst, 50, 255, 0)#使用merge變成通道圖像thresh = cv2.merge((thresh,thresh,thresh))# 按位操作res = cv2.bitwise_and(target, thresh)res = np.hstack((target, thresh, res))cv2.imwrite('res.jpg', res)# 顯示圖像cv2.imshow('1', res)cv2.waitKey(0)cv2.destroyAllWindows()roi圖片
目標(biāo)圖
查詢結(jié)果
未完待續(xù)~
------------------------------------可愛の分割線------------------------------------
更多Opencv教程將后續(xù)發(fā)布,歡迎關(guān)注喲~??????
總結(jié)
以上是生活随笔為你收集整理的hsv 直方图均衡化_Opencv从零开始 - 「启蒙篇」- 直方图、直方图均衡和反向投射...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: keil 查看 stm32 io波形_你
- 下一篇: java 加密 数字_java 加密数字