最初のチュートリアルで1次元ヒストグラムの計算方法及び描画方法を学んだ.1つの特徴(グレースケール画像の画素値)しか見ていないために「1次元」と呼んでいる.2次元ヒストグラムを計算するためには2個の特徴について考えなければならない.そこで普通、画素のHueとSaturationという二つの特徴を考える.
pythonの公式サンプル にカラーヒストグラムの計算方法が含まれている.そのようなカラーヒストグラムを作成する方法を理解し,これ以降のトピックであるヒストグラムの逆投影法の理解にも役に立つことを学ぶ.
1次元ヒストグラムと同様 cv2.calcHist() 関数を使う.カラーヒストグラムを計算するために,カラー画像をBGRからHSVへと変換する必要がある(1次元ヒストグラムの計算をする時はBGRをグレースケールに変換した).2次元ヒストグラムを計算するために,パラメータを以下のように変更する.:
channels = [0,1]
HとSの二つの色成分を処理するためbins = [180,256]
H成分のために180,S成分のために256range = [0,180,0,256]
Hue値は0から180まで,Saturation値は0から256まで
コードは以下のようになる:(画像)%matplotlib inline
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('home.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
img = cv2.cvtColor(img,cv2.COLOR_RGB2BGR)
hist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
plt.figure(figsize=(12,8))
plt.subplot(1,2,1), plt.imshow(img)
plt.xticks([]),plt.yticks([]),plt.title('Image')
plt.subplot(1,2,2), plt.imshow(hist,interpolation = 'nearest')
plt.title('Histogram')
plt.show()
Numpyも2次元ヒストグラムの計算をするための関数を用意している : np.histogram2d(). (1次元ヒストグラムを計算する関数は np.histogram() である).(画像)
%matplotlib inline
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('home.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# print(hsv)
hist, xbins, ybins = np.histogram2d(hsv[:,:,0].ravel(),hsv[:,:,1].ravel(),[180,256],[[0,180],[0,256]])
img = cv2.cvtColor(img,cv2.COLOR_RGB2BGR)
plt.figure(figsize=(12,5))
plt.subplot(1,2,1), plt.imshow(img)
plt.xticks([]),plt.yticks([]),plt.title('Image')
plt.subplot(1,2,2), plt.imshow(hist,interpolation = 'nearest')
plt.title('Histogram')
plt.show()
関数np.histogram2d()
の第1引数はH成分,第2引数はS成分,第3引数は各成分のビンの数,第4引数は各成分の範囲を表す.
次に,計算したカラーヒストグラムの表示方法を確認しよう.
%matplotlib inline
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('home.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
img = cv2.cvtColor(img,cv2.COLOR_RGB2BGR)
hist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
plt.figure(figsize=(12,5))
plt.subplot(1,2,1), plt.imshow(img)
plt.xticks([]),plt.yticks([]),plt.title('Image')
plt.subplot(1,2,2), plt.imshow(hist,interpolation = 'nearest')
plt.title('Histogram')
plt.show()
入力画像とそのカラーヒストグラムが示された.ここで横軸がS成分,縦軸がH成分を表す.
ヒストグラムを見ると,H = 100,S = 200の辺りに高い値を示しているのが分かる.これは空の青色に対応している.もう一つのピークがH = 25,S = 100の辺りに見える.これは宮殿の黄色に対応している.GIMPなどの画像編集ソフトを使って確認できる.
OpenCV-Python2のサンプルコードの中に カラーヒストグラムを作成するサンプル が含まれている.コードを実行すると,ヒストグラムが対応する色も表示することが分かる.別の言い方をすると色でコード化されたヒストグラムと呼べるだろう.結果はとても素晴らしいい(ただし、数行のコードを追加する必要がある).
コード中で,作者はカラーマップをHSV空間で作成し,その後にBGR空間に変換している.結果として得られるヒストグラム画像は、カラーマップと掛け算される.また、作者は小さな孤立したピクセルを取り除くために前処理をいくつか行っており、結果としてとてもよいヒストグラムが得られている.
コードの実行,解析,改造は皆さんが行うこと.上記の画像に対してそのコードを実行した結果は次のようになる:
ヒストグラムにどんな色があるか、はっきりわかるだろう: 青や黄色、そしてチェスボードに由来する白色がみえるだろう.