【Python/OpenCV】画像のヒストグラム平均化

この記事では、Python版OpenCV(cv2.equalizeHist)、もしくはNumPyで画像のヒストグラム平均化する方法をソースコード付きで解説します。

ヒストグラム平均化

ヒストグラムが全体的に平均化されるよう画像の画素値を変換してやると、人が見やすい画像なります。
これをヒストグラム平均化(平坦化)といいます。
【詳細】ヒストグラム平均化の原理・計算式

今回は、Python言語を用いて画像のヒストグラムを平均化してみました。
ヒストグラムの計算部分は以下の2種類の方法を実装してみました。

方法①・・・NumPyで実装
方法②・・・OpenCVの「cv2.equalizeHist」を使用

書式

dst = cv2.equalizeHist(gray)
パラメータ名 説明
src 入力画像(1チャンネル)
dst ヒストグラム平均化された画像

ソースコード(Python3+OpenCV3)

サンプルプログラムのソースコードです。

方法①

#-*- coding:utf-8 -*-
import cv2
import numpy as np


def equalize_hist(src):
    # 画像の高さ・幅を取得
    h, w = src.shape[0], src.shape[1]
    
    # 全画素数
    s = w * h
    
    # 画素値の最大値
    imax = src.max()
    
    # ヒストグラムの算出
    hist, bins = np.histogram(src.ravel(),256,[0,256])

    # 出力画像用の配列(要素は全て0)
    dst = np.empty((h,w))

    for y in range(0, h):
        for x in range(0, w):
            # ヒストグラム平均化の計算式
            dst[y][x] = np.sum(hist[0: src[y][x]]) * (imax / s)

    return dst


def main():
    # 入力画像を読み込み
    img = cv2.imread("input.jpg")

    # グレースケール変換
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

    # 方法1(NumPyで実装)
    dst1 = equalize_hist(gray)
    
    # 結果の出力
    cv2.imwrite("output1.jpg", dst1)


if __name__ == "__main__":
    main()

方法②

#-*- coding:utf-8 -*-
import cv2
import numpy as np

def main():
    # 入力画像を読み込み
    img = cv2.imread("input.jpg")

    # グレースケール変換
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

    # 方法2(OpenCVで実装)
    dst2 = cv2.equalizeHist(gray)
    
    # 結果の出力
    cv2.imwrite("output2.jpg", dst2)


if __name__ == "__main__":
    main()

※動作には、OpenCVライブラリのインストールが必要です。

実行結果

サンプルプログラムの実行結果です。

■入力画像(右)、出力画像(右)

【おすすめ記事】
PythonでOpenCV入門 サンプル集
【Python】画像処理プログラミング入門
【画像処理入門】アルゴリズム&プログラミング

シェア&フォローお願いします!