OpenCVによる画像処理のヒストグラム【Python】

OpenCVによる画像処理のヒストグラム【Python】 プログラミング

OpenCVでは、画像のヒストグラムを簡単に表示できます。
そして、この記事ではOpenCVでヒストグラムを作成する方法を解説しています。

もし「画像処理のヒストグラム?」という場合でも、大丈夫です。
ヒストグラムの説明とその用途についても説明しています。

本記事の内容

  • 画像処理におけるヒストグラムとは?
  • 画像処理におけるヒストグラムをどう使うの?
  • OpenCVによるヒストグラム

それでは、上記に沿って解説していきましょう。

画像処理におけるヒストグラムとは?

画像は、「ピクセル」という画像を構成する点の集まりです。
ピクセルは、画素とも言われますね。

上の画像では、全部で5個のピクセルが黒色です。
このように各ピクセルは色を持つことができます。

そして、色には明るさがあります。
色の明るさを専門的に言うと、輝度値と言います。

上記より、各ピクセルごとに輝度値があることがわかります。
では、輝度値が何かと言うことになります。

輝度値は、普段からみなさんに馴染みのあるモノです。
次の「255」の部分です。

輝度値は、0~255で表します。
そして、255に近いほど明るいです。
逆に、0に近いほど暗いです。

白をRGBで表した場合、(255,255,255)になります。
黒は、その真逆の(0,0,0)ですよね。

ここまで理解できれば、もう画像のヒストグラムについても大丈夫でしょう。
ヒストグラムとは、画像上にどの輝度値がどれだけ出現するのか表したグラフと言えます。

そのグラフの構成は以下。

横軸輝度値
縦軸出現頻度

以上が、画像処理におけるヒストグラムの説明でした。
では、次にヒストグラムをどう使うのかを説明していきます。

画像処理におけるヒストグラムをどう使うの?

写真の明るさを補正する際に、ヒストグラムが参考になります。
その際に、補正する必要があるかどうかを判断する必要があります。

通常は、人の目によって判断するでしょう。
でも、それは主観によるモノに過ぎません。

それなら、それをデータで表現しましょうということです。
今回は、以下の二つのケースを見てみましょう。

  • 白飛び写真
  • 黒つぶれ写真

以下で説明します。

白飛び写真

全体的に輝度値が右側に偏っています。

この写真を見た際に、全体的に明るいという印象がありました。
そして、ヒストグラムを作成した結果、その印象はデータでも証明されました。

黒つぶれ写真

全体的に輝度値が左側に偏っています。

もともと暗いのでしかたがないと言えば仕方がありません。
ただ、そのことをデータで明確に物語っています。

まとめ

写真の明るさ補正に注目して、二つのケースを確認しました。
もちろん、これ以外にもヒストグラムを使うケースはあるでしょう。

例えば、画像の違法コピーの判定にも利用が可能です。
同じ発想で、画像の類似度も判定できそうですね。

最後に、OpenCVによるヒストグラムを説明します。

OpenCVによるヒストグラム

前提として、PythonからOpenCVを利用できるようにしておきます。
OpenCVのインストーに関しては、次の記事でまとめています。

以下は、OpenCVでヒストグラムを表示するサンプルコードです。

import cv2
from matplotlib import pyplot as plt

IMG_PATH = "inu.jpg"

img = cv2.imread(IMG_PATH, 0)
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
plt.plot(hist)
plt.savefig("hist.png")

上記を実行すると、次のヒストグラムが作成されます。

ポイントは、以下の部分です。

hist = cv2.calcHist([img], [0], None, [256], [0, 256])

cv2.calcHist()関数によって、ヒストグラムが計算されます。

なお、白飛び写真などの説明で用いたヒストグラムはMatplotlibだけで表示しています。
グラフの表示だけではなく、ヒストグラムの計算もMatplotlibで対応しているのです。

Matplotlibでヒストグラムを表示するコードは以下。

import cv2
from matplotlib import pyplot as plt

IMG_PATH = "inu.jpg"

img = cv2.imread(IMG_PATH, 0)
plt.hist(img.ravel(), 256, [0, 256])
plt.savefig("hist.png")

正直、この程度のヒストグラムなら、どっちを使ってもいいと思います。
ただ、もう少し複雑なヒストグラムなら、OpenCVの方がいいかもしれません。

また、別の記事でその複雑なヒストグラムについては説明する予定です。
今回は、これにて終了とします。

タイトルとURLをコピーしました