【OpenCV-Python】ヒストグラムの取得、表示

ここでは、ヒストグラムの取得方法と、取得したヒストグラムをmatplotlibで表示する方法を紹介したいと思います。

ヒストグラムの取得方法

OpenCVでヒストグラムを取得するには calcHist()関数を用います。

calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) ->hist
引数 説明
images 画像の配列を指定します。
cv2.split()関数でB, G, Rのカラープレーンに分離した3枚の画像なども指定できます。
channels ヒストグラムを取得する色のチャンネル(B, G, Rのどれか?)を指定します。
グレースケールの場合は [0]
B の場合は [0]
G の場合は [1]
R の場合は [2]
を指定します。
mask ヒストグラムを取得する領域のマスク画像を指定します。
画像全体のヒストグラムを取得する場合は None を指定します。
histSize ヒストグラムのビンの数を指定します。通常は[256]となります。
ranges ヒストグラムを取得する輝度値の範囲を指定します。 通常は[0, 256]です。
(戻り値)hist 指定したチャンネルのヒストグラムを取得します。

 

サンプルプログラム

import cv2

# 画像の読込
img = cv2.imread("Parrots.bmp",cv2.IMREAD_UNCHANGED)

if len(img.shape) == 3:
    # カラーのとき
    channels = 3
else:
    # モノクロのとき
    channels = 1

histogram = []
for ch in range(channels):
    # チャンネル(B, G, R)ごとのヒストグラム
    hist_ch = cv2.calcHist([img],[ch],None,[64],[0,256])
    histogram.append(hist_ch[:,0])# 次元を削除して追加

print("==== B ====")
print(histogram[0])
print("==== G ====")
print(histogram[1])
print("==== R ====")
print(histogram[2])

※今回は、ビンの数を64にしました。

 

実行結果

 

matplotlibでヒストグラムの表示

ヒストグラムの表示については、Pillowを使って、ヒストグラムの取得、表示する方法を行いました。

【Python/Pillow(PIL)】画像のヒストグラム取得、表示

Pillowでは色の順番がR, G, B の順ですが、 OpenCVは B, G, R の順なので、注意してください。

せっかくなので、ヒストグラムを取得する部分と、ヒストグラムを表示する部分は関数にしてみました。

 

import cv2
import matplotlib.pyplot as plt # ヒストグラム表示用

def get_histogram(img):
    '''ヒストグラムの取得'''
    if len(img.shape) == 3:
        # カラーのとき
        channels = 3
    else:
        # モノクロのとき
        channels = 1

    histogram = []
    for ch in range(channels):
        # チャンネル(B, G, R)ごとのヒストグラム
        hist_ch = cv2.calcHist([img],[ch],None,[256],[0,256])
        histogram.append(hist_ch[:,0])

    # チャンネルごとのヒストグラムを返す
    return histogram

def draw_histogram(hist):
    '''ヒストグラムをmatplotlibで表示'''
    # チャンネル数
    ch = len(hist)

    # グラフの表示色
    if (ch == 1):
        colors = ["black"]
        label = ["Gray"]
    else:
        colors = ["blue", "green", "red"]
        label = ["B", "G", "R"]

    # ヒストグラムをmatplotlibで表示
    x = range(256)
    for col in range(ch):
        y = hist[col]
        plt.plot(x, y, color = colors[col], label = label[col])

    # 凡例の表示
    plt.legend(loc=2)

    plt.show()

######################################################################

# 画像の読込
img = cv2.imread("Parrots.bmp",cv2.IMREAD_UNCHANGED)

# 画像の表示
cv2.imshow("Image", img)

# ヒストグラムの取得
hist = get_histogram(img)

# ヒストグラムの描画
draw_histogram(hist)

実行結果

関連記事

【Python/Pillow(PIL)】画像のヒストグラム取得、表示

【OpenCV/Python】画像ファイルの読み込み、表示

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください