Python OpenCV3で均一化したヒストグラム出力

Python OpenCV3で度数分布を算出してヒストグラム出力 の続き。

前提

ディレクトリ構成などはこことかこことか。

元画像と元画像のヒストグラム

元画像(sora.jpg)をプログラム内でグレースケールし、ヒストグラムを作成する。

グレースケール後の画像
 
スクリーンショット 2015-07-01 21.27.16

 

ヒストグラム
スクリーンショット 2015-07-01 21.28.01

 

均一化したヒストグラムを出力

均一化には、equalizeHistメソッドを使う。
equalizeHistの使い方は次の通り。

[python title="equalizeHistメソッドの使い方"]
img_dst = cv2.equalizeHist(グレースケール化した画像)
[/python]

実際に均一化してヒストグラムを作成してみる。
sourceディレクトリにhistgram2.pyを作成する。

[python title="histgram2.pyの内容"]
# -*- coding: utf-8 -*-

import cv2
import numpy as np

if __name__ == '__main__’:

# 画像読み込み
img_src = cv2.imread("./image/sora.jpg", 1)

# グレースケール
img_gry = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)

# ヒストグラムの均一化
img_eqh = cv2.equalizeHist(img_gry)

# ヒストグラム表示用のイメージを作成
img_histgram = np.zeros([100, 256]).astype("uint8")
rows, cols = img_histgram.shape

# 度数分布を求める

# 次元ごとの度数分布のサイズ
hdims = [256]

# 各次元の度数分布の最小値と最大値
hranges = [0, 256]

histgram = cv2.calcHist([img_eqh], [0], None, hdims, hranges)

# 度数の最大値を取得
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(histgram)

for i in range(0, 255):

# 算出した度数分布の値を取得する
v = histgram[i]

# 描画する
cv2.line(img_histgram,
(i, rows),
(i, rows – rows * (v / max_val)),
(255, 255, 255))

# 表示

# グレースケール化した画像の表示
# cv2.imshow("Show GRAY Image", img_gry)

# 均一化した画像の表示
# cv2.imshow("Show EQUALIZE HISTGRAM Image", img_eqh)

# 均一化した画像のヒストグラムの表示
cv2.imshow("Show HISTGRAM Image", img_histgram)

cv2.waitKey(0)
cv2.destroyAllWindows()

[/python]

実行する。

[shell]
(opencv_python)$ python histgram2.py
[/shell]

均一化した画像は次の通り。

スクリーンショット 2015-07-01 21.29.18

 

均一化したあとのヒストグラムは次の通り。

スクリーンショット 2015-07-01 21.29.53