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

Share on Facebook
Pocket
LINEで送る
Bookmark this on Google Bookmarks

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

前提

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

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

&nbsp

 

度数分布を算出

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

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

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

 

元画像

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

akai_tsuki

 

ヒストグラムを作成

実際にヒストグラムを作成してみる。
sourceディレクトリに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()

実行する。

(opencv_python)$ python histgram.py

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

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

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

sora

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

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

 

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です