【第21節(jié)】2D直方圖
目標(biāo)
????????本節(jié)我們會(huì)學(xué)習(xí)如何繪制2D直方圖,我們會(huì)在下一節(jié)中使用它。
1、介紹
????????在前面的部分我們介紹了如何繪制一維直方圖,之所以稱為一維,是因?yàn)槲覀冎豢紤]了圖像的一個(gè)特征:灰度值。但是在2D直方圖中我們就要考慮兩個(gè)圖像特征。對(duì)于彩色圖像的直方圖通常情況下我們需要考慮每個(gè)的顏色( Hue )和飽和度( Saturation )。 根據(jù)這兩個(gè)特征繪制2D直方圖。
2、OpenCV中2D直方圖
????????使用函數(shù)CV2.calcHist(來(lái)計(jì)算直方圖既簡(jiǎn)單又方便。如果要繪制顏色直方圖的話,我們首先需要將圖像的顏色空間從BGR轉(zhuǎn)換到HSV。(記住,計(jì)算一維直方圖,要從BGR轉(zhuǎn)換到HSV )。計(jì)算2D直方圖,函數(shù)的參數(shù)要做如下修改:
channels=[0, 1] 因?yàn)槲覀冃枰瑫r(shí)處理H和S兩個(gè)通道。
bins=[180,256]H通道為180, S通道為256。
range=[0, 180,0, 256]H的取值范圍在0到180,S的取值范圍在0到256。
代碼如下:
這就搞定了,簡(jiǎn)單吧。
3、Numpy中2D直方圖
????????Numpy同樣提供了繪制2D直方圖的函數(shù):np.histogram2d()。前面繪制1D直方圖時(shí)我們使用的是?np.histogram()。
????????第一個(gè)參數(shù)是H通道,第二個(gè)參數(shù)是S通道,第三個(gè)參數(shù)是bins的數(shù)
目,第四個(gè)參數(shù)是數(shù)值范圍?,F(xiàn)在我們要看看如何繪制顏色直方圖。
4、繪制直方圖
????????方法1:使用CV2.imshow()我們得 到結(jié)果是一個(gè)180x256的兩維數(shù)組。所以我們可以使用函數(shù)CV2.imshow()來(lái)顯示它。但是這是一個(gè)灰度圖,除非我們知道不同顏色H通道的值,否則我們根本就不知道那到底代表什么顏色。
????????方法2 :使用Matplotlib()我們還可以使用函數(shù) matplotlib. pyplot.imshow()來(lái)繪制2D直方圖,再搭配上不同的顏色圖( color_ map )。這樣我們會(huì)對(duì)每個(gè)點(diǎn)所代表的數(shù)值大小有一個(gè)更直觀的認(rèn)識(shí)。但是跟前面的問(wèn)題一樣,你還是不知道那個(gè)數(shù)代表的顏色到底是什么。雖然如此,我還是更喜歡這個(gè)方法,它既簡(jiǎn)單又好用。
注意:在使用這個(gè)函數(shù)時(shí),要記住設(shè)置插值參數(shù)為?nearest。
代碼如下:
顯示如下,X 軸顯示 S 值,Y 軸顯示 H 值:

1)在直方圖中可以看到,在H=20,S=50附近有比較高的值,這部分與白云相對(duì)應(yīng);
2)在H=100,S=130附近有比較高的值,這部分與藍(lán)天對(duì)應(yīng)
3)在H=100,S=130附近有比較高的值,這部分與枯黃大地相對(duì)應(yīng)