色空間の変換
色空間の概要
色空間(color space)は立法的に記述される色の空間であり、RGB(Red Green Blue)やHSVなどがよく用いられます。HSVは色相(Hue)、彩度(Saturation)、明度(Value)の略です。
OpenCVにおける画像の読み込みと色空間の変換
下記のようなスクリプトを実行することでOpenCVを用いて画像の読み込みを行うことができます。
import cv2
image = cv2.imread('images/sample1.png')
print(type(image))
・実行結果
<class 'numpy.ndarray'>
上記より、cv2.imread
メソッドを用いて画像の読み込みを行う場合、読み込んだ結果がNumPy
形式で保存されることが確認できます。この読み込んだ画像はBGR形式で表されますが、下記のようなコードを実行することでHSV形式に変換することができます。
image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
print(type(image_hsv))
・実行結果
<class 'numpy.ndarray'>
大元の色空間がBGRであるので上記ではcv2.cvtColor(image, cv2.COLOR_BGR2HSV)
のように指定することで色空間の変換を行います。HSVを用いる利点についてはたとえば下記のように明度のヒストグラム平坦化を行うことによって明度に偏りのある画像を見やすくすることが可能です。
import cv2
from matplotlib import pyplot as plt
image = cv2.imread('images/sample1.png')
image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
equ = cv2.equalizeHist(image_hsv[:, :, 2])
new_hsv = cv2.merge((image_hsv[:, :, 0], image_hsv[:, :, 1], equ))
new_image = cv2.cvtColor(new_hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite("results/output1.png", new_image)
明度のヒストグラム平坦化による値の変化については下記のコードを実行することでヒストグラムに基づいて確認できます。
import cv2
from matplotlib import pyplot as plt
image = cv2.imread('images/sample2.png')
image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
equ = cv2.equalizeHist(image_hsv[:, :, 2])
new_hsv = cv2.merge((image_hsv[:, :, 0], image_hsv[:, :, 1], equ))
new_image = cv2.cvtColor(new_hsv, cv2.COLOR_HSV2RGB)
fig, ax= plt.subplots(1, 2)
ax[0].hist(image_hsv[:,:,2])
ax[1].hist(new_hsv[:,:,2])
plt.savefig("results_hist.png")
・実行結果(左がヒストグラム平坦化前、右がヒストグラム平坦化後)
実行結果より、ヒストグラム平坦化によって明度のヒストグラムが一様分布に近づいていることが確認できます。同様に標準偏差は下記のように計算できます。
import numpy as np
print(np.mean(image_hsv[:,:,2]), np.std(image_hsv[:,:,2]))
print(np.mean(new_hsv[:,:,2]), np.std(new_hsv[:,:,2]))
・実行結果
54.65961077064878 53.95692110666106
129.39104111111894 72.44996902502072
計算結果より、ヒストグラム平坦化後の方が標準偏差が大きくなっていることが確認できます。