介紹
在第一節(jié)里患雇,我們計(jì)算和繪制了一維的histogram购披,它被叫做一維histogram是因?yàn)槲覀冎荒昧艘粋€(gè)屬性出來(lái)听哭,像素的灰度強(qiáng)度值。而如果是二維histogram伸头,你就要考慮兩個(gè)屬性了匾效。一般來(lái)說(shuō)對(duì)于彩色histogram兩個(gè)屬性是色調(diào)和飽和度的值。
OpenCV里的2D histogram
用cv2.calcHist()很簡(jiǎn)單恤磷,對(duì)于彩色histogram我們需要把圖像從BGR轉(zhuǎn)換成HSV面哼。(記住,對(duì)于1維histogram扫步,我們從BGR轉(zhuǎn)成灰度)魔策,對(duì)于二維histogram,參數(shù)修改如下:
channels = [0, 1]河胎,因?yàn)槲覀冃枰幚鞨和S
bins=[180,256] 180是H 256是S
range=[0,180,0,256] 色調(diào)區(qū)間是0到180闯袒, 飽和度是0.256。
import cv2
import numpy as npimg = cv2.imread('home.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)hist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
Numpy里的2D histogram
Numpy也提供了函數(shù)np.histogram2d()游岳。(記住政敢,對(duì)于1維的是np.histogram())
import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread('home.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)hist, xbins, ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])
第一個(gè)參數(shù)是H,第二個(gè)是S吭历,第三個(gè)是bins的數(shù)量第四個(gè)是他們的范圍
繪制2D histogram
方法1.使用cv2.imshow()
我們得到的結(jié)果是一個(gè)二維數(shù)組堕仔,大小是180x256擂橘,所以我們可以用普通的顯示方法晌区,cv2.imshow()。這會(huì)畫(huà)出一個(gè)灰度圖通贞,當(dāng)然不會(huì)告訴你顏色信息朗若,除非你知道不同顏色的色調(diào)值。
方法2.使用Matplotlib
我們可以使用matplotlib.pyplot.imshow()函數(shù)來(lái)畫(huà)2D Histogram昌罩。它可以更好的表達(dá)不同像素強(qiáng)度哭懈。但是還是不會(huì)直觀的表達(dá)顏色。不過(guò)我還是推薦這種方法茎用,更簡(jiǎn)單直觀遣总。
import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread('home.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
hist = cv2.calcHist( [hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] )plt.imshow(hist,interpolation = 'nearest')
plt.show()
下面是輸入圖像和它的顏色histogram圖,X坐標(biāo)是S值轨功,Y坐標(biāo)是色調(diào)值旭斥。
在這個(gè)histogram里你可以看到最高值是在H=100,S=200附近古涧,對(duì)應(yīng)著藍(lán)天垂券。另一個(gè)高峰時(shí)在H=25和S=100.對(duì)應(yīng)著黃色的宮殿
方法3.OpenCV
#!/usr/bin/env python
'''
Video histogram sample to show live histogram of videoKeys:
ESC? ? - exit
'''import numpy as np
import cv2# built-in modules
import sys# local modules
import videoif __name__ == '__main__':
? ? hsv_map = np.zeros((180, 256, 3), np.uint8)
? ? h, s = np.indices(hsv_map.shape[:2])
? ? hsv_map[:,:,0] = h
? ? hsv_map[:,:,1] = s
? ? hsv_map[:,:,2] = 255
? ? hsv_map = cv2.cvtColor(hsv_map, cv2.COLOR_HSV2BGR)
? ? cv2.imshow('hsv_map', hsv_map)? ? cv2.namedWindow('hist', 0)
? ? hist_scale = 10
? ? def set_scale(val):
? ? ? ? global hist_scale
? ? ? ? hist_scale = val? ? cv2.createTrackbar('scale', 'hist', hist_scale, 32, set_scale)
? ? try:
? ? ? ? fn = sys.argv[1]
? ? except:
? ? ? ? fn = 0
? ? cam = video.create_capture(fn, fallback='synth:bg=../data/baboon.jpg:class=chess:noise=0.05')? ? while True:
? ? ? ? flag, frame = cam.read()
? ? ? ? cv2.imshow('camera', frame)
? ? ? ? small = cv2.pyrDown(frame)
? ? ? ? hsv = cv2.cvtColor(small, cv2.COLOR_BGR2HSV)
? ? ? ? dark = hsv[...,2] < 32
? ? ? ? hsv[dark] = 0
? ? ? ? h = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
? ? ? ? h = np.clip(h*0.005*hist_scale, 0, 1)
? ? ? ? vis = hsv_map*h[:,:,np.newaxis] / 255.0
? ? ? ? cv2.imshow('hist', vis)? ? ? ? ch = 0xFF & cv2.waitKey(1)
? ? ? ? if ch == 27:
? ? ? ? ? ? break? ? cv2.destroyAllWindows()
用這個(gè)方法你可以看到histogram顯示了相應(yīng)的顏色∠刍或者輸出有顏色的histogram菇爪。結(jié)果非常好
在代碼里算芯,創(chuàng)建了HSV里的顏色表,然后轉(zhuǎn)換到BGR凳宙,結(jié)果histogram圖像和這個(gè)顏色表相乘熙揍。然后移除一些孤立像素。
你可以明顯的看到在histogram里顯示了什么顏色氏涩,有藍(lán)色诈嘿,有黃色,還要一些因?yàn)槠灞P(pán)而顯示的白色削葱。