つれづれなる備忘録

日々の発見をあるがままに綴る

OpenCVの使い方30 ~ 適用的ヒストグラム平坦化

今回は前回の輝度ヒストグラム平坦化を改良した適用的ヒストグラム平坦化について紹介する。

atatat.hatenablog.com

1. 輝度分布が黒に偏った画像のヒストグラム平坦化

 前回は白(高い値)に輝度分布が偏った画像を使用したが、今回は輝度分布が黒に偏った画像を扱う。黒に偏った画像の例として、標準画像データベースのうちCoupleのモノクロ画像を用いる。

"輝度分布が黒に偏った画像(Couple)"
輝度分布が偏った画像(Couple)

輝度ヒストグラムは以下のように、黒(低い値)に偏っていることが確認できる。

"輝度ヒストグラム"
輝度ヒストグラム

元の画像と前回記事の手順でヒストグラム平坦化を適用した画像を比較してみる。

黒に偏った画像をヒストグラム平坦化

全体的に見やすくなったが、もともと明るい部分が若干見えにくくなっているように感じる。

2. 適用的ヒストグラム平坦化

 ヒストグラム平坦化equalizeは画像全体に輝度を等分配するため、黒い部分は見やすくなるが、同時に明るい部分はより明るくなるため見えにくくなってしまう。そこで画像を区分ごとに分割してヒストグラム平坦化する適用的ヒストグラム平坦化が有用になる。適用的ヒストグラム平坦化を利用するにはclahe=cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))としてオブジェクト生成して、cl1 = clahe.apply(gray)で画像に適用する。ここでtileGridSizeは分割する区分のサイズ、clipLimitは区分ごとの平坦化の際ノイズが目立たないようにコントラストを制限する。

equ = cv2.equalizeHist(gray)
gray_img= np.copy(gray)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(gray_img)
plt.figure(figsize=(15,30))
plt.subplot(1,3,1)
plt.imshow(gray,cmap='gray',vmin=0,vmax=255)
plt.title('Orignal')
plt.subplot(1,3,2)
plt.imshow(equ,cmap='gray',vmin=0,vmax=255)
plt.title('equalizeHist')
plt.subplot(1,3,3)
plt.imshow(cl1,cmap='gray',vmin=0,vmax=255)
plt.title('CLAHE')

適用的ヒストグラム平坦化した画像は、明るい部分の輝度が抑えられて、黒い部分が明るくなっているように見える。

"適用的ヒストグラム平坦化"
適用的ヒストグラム平坦化

輝度ヒストグラムを比較すると、適用的ヒストグラム平坦化は黒い部分(低い値)は頻度が下がり明るい部分(高い値)はあまり変化していない。 一方で単純なヒストグラム平坦化は、明るい部分に輝度が分布している。

"輝度ヒストグラム比較"
輝度ヒストグラム比較

3. 白みがかった画像

前回の白みがかった霧の画像でもヒストグラム平坦化を適用すると黒い部分が見にくくなっていた。適用的ヒストグラム平坦化で改善できるかどうか試してみた。

平坦化ヒストグラムでは全体的に暗くなって木や枝がくっきりしていたが、適用的ヒストグラム平坦化では、全体的な白みは変わらないが木や枝の黒い部分がはっきりする。コントラストを制限するclipLimitの値を大きくするとコントラストはよりはっきりするが、ノイズが増えている印象の画像になる。

適用的ヒストグラム平坦化した霧の画像
適用的ヒストグラム平坦化した霧の画像

4. まとめ

 今回は白い部分、黒い部分が見えにくくなる点を改善する適用的ヒストグラム平坦化について紹介した。