【Python】画像データからヒストグラムを描画・均一化|OpenCVによる画像処理入門

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ
  • Pythonによる画像処理に興味がある。
  • 画像データからヒストグラムを描画する方法が知りたい。
目次

OpenCVとは

OpenCV(Open Source Computer Vision Library)とは、画像処理やコンピュータビジョンの分野で広く活用されているオープンソースライブラリです。画像データの数値処理に強いのが特徴であり、高度な統計アルゴリズムも多数含まれていることから、近年機械学習の分野でも広く利用されています。

本記事では、画像変換処理として代表的な「ヒストグラムの描画」および「ヒストグラム均一化」の方法について解説します。

【Python】OpenCV|画像データからヒストグラムを描画

PythonのOpenCVライブラリを用いて、画像データからヒストブラムを描画する方法について解説します。

グレースケールのヒストグラム描画

画像内に含まれる特定の色を指定し、ヒストグラムとして描画する方法を示します。

例としてグレーを指定してヒストグラムを描画する場合のコードを記述します。

import cv2 
import matplotlib.pyplot as plt
# %matplotlib inline

# 画像読込
img = cv2.imread("image_data.jpg")

# ヒストグラム
hist = cv2.calcHist(images   = [img],   # 画像データを指定
                     channels = [0],    # ヒストグラムを計算する画像のチャンネルのインデックス(グレースケールの場合「0」を指定)
                     mask     = None,   # マスク画像|全画素のヒストグラムを計算する場合 “None” を指定
                     histSize = [256],  # ビン数
                     ranges   = [0,256] # ヒストグラムの範囲
                    )
# 可視化
plt.plot(hist, color="gray")

複数カラーを指定してヒストグラム描画

複数のカラーを柔軟に指定し、ヒストグラムを描画したい場合、以下を実行してみましょう。

import cv2 
import matplotlib.pyplot as plt
# %matplotlib inline

# 画像読込
img = cv2.imread("image_data.jpg")

#カラーリスト
colorList = ["blue","green","red"]

for i,j in enumerate(colorList):
    # ヒストグラム
    hist = cv2.calcHist(images   = [img],    # 画像データを指定
                        channels = [i],      # ヒストグラムを計算する画像のチャンネルのインデックス
                        mask     = None,     # マスク画像|全画素のヒストグラムを計算する場合 “None” を指定
                        histSize = [256],    # ビン数
                        ranges   = [0,256]   # ヒストグラムの範囲
                       )
    # 可視化
    plt.plot(hist, color=j)

【Python】OpenCV|ヒストグラム均一化

ヒストグラム均一化とは、ヒストグラムの累積度数のグラフの傾きが一定になるよう変換する処理を指します。ヒストグラム均一化処理を施すことで、全体のコントラストや輝き度の偏りの改善が可能です。

ヒストグラム均一化処理を行うと、全体的に強度が満遍なく分布するようになります。さらに、暗い部分はより暗く、明るい部分はより明るくなるように変換されるのが特徴的です。

ヒストグラム均一化処理後の画像比較

ヒストグラム均一化処理を施した画像を出力する場合、次のように実行してみましょう。

import cv2 

# 画像読込
img = cv2.imread("image_data.jpg", 0)

# ヒストグラム均一化した画像
img_hist = cv2.equalizeHist(img)

# 画像比較
cv2.imshow("img_gray",img)
cv2.imshow("img_hist",img_hist)
cv2.waitKey(0)
cv2.destroyAllWindows()

ヒストグラムの描画

ヒストグラム均一化処理した画像からヒストグラムを描画する場合、次のように実行します。

import cv2 
import matplotlib.pyplot as plt
# %matplotlib inline

# 画像読込
img = cv2.imread("image_data.jpg", 0)

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

# ヒストグラム
hist = cv2.calcHist(images   = [img],     # 画像データを指定
                    channels = [0],       # ヒストグラムを計算する画像のチャンネル(グレースケールを指定)
                    mask     = None,      # マスク画像|全画素のヒストグラムを計算する場合 “None” を指定
                    histSize = [256],     # ビン数
                    ranges   = [0,256]    # ヒストグラムの範囲
                   )
# 可視化
plt.plot(hist)

【参考】Python・OpenCVを用いた画像処理

当サイトでは、PythonのOpenCVライブラリを用いた画像処理ノウハウを多数公開しています。

用途【Python×OpenCV】記事名
画像変換画像のリサイズ・拡大・縮小
画像変換画像の回転・反転・平行移動|アフィン変換
画像変換画像の明るさ調節|ガンマ補正
画像変換グレースケール・HSV・L*a*b|色空間の変換
画像変換モノクロ(白黒)画像変換|2値化処理
画像変換ヒストグラムの描画・ヒストグラム均一化処理
画像変換画像上にテキスト・図形(直線・長方形・円)を描画
画像変換画像の透視変換・遠近法
画像変換画像のノイズ除去・平滑化
画像変換画像の畳み込み(空間フィルタリング)
特徴抽出エッジの検出方法

画像認識や物体検出を学ぶ上でおすすめの教材はこちらをご参考ください。

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次