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

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

画像の画素値の度数分布を算出してヒストグラムを作成。

前提

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

今回はグレースケールした画像のヒストグラムを作成する。

&nbsp

 

度数分布を算出

度数分布の算出にはcalcHistメソッドを使う。
calcHistの使い方は以下のとおり。

[shell] In [2]: cv2.calcHist??
Docstring: calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) -> hist
[/shell]

具体的な使い方は、後ほどソース内で。

 

元画像

アフィン変換の時と同じ、この画像(akai_tsuki.png)を使う。
以前の例だとsource/imageディレクトリ配下に設置する。

akai_tsuki

 

ヒストグラムを作成

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

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

import cv2
import numpy as np

if __name__ == ‘__main__’:

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

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

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

# 度数分布を求める

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

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

histgram = cv2.calcHist([img_gry], [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 HISTGRAM Image", img_histgram)
cv2.waitKey(0)
cv2.destroyAllWindows()

[/python]

実行する。

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

赤い月のヒストグラムは次の通り。

スクリーンショット 2015-06-26 19.07.33

暗い画像のため、0に近い左側の方に集中している。
比較するためにsource/imageディレクトリに以下の画像(sora.jpg)を配置してこちらのヒストグラムを出力してみる。

sora

スクリーンショット 2015-06-26 19.38.48

比較的明るい画像のため、右側の部分が多く出ている。

 

Related posts

コメントを残す