ここでは、OpenCV を使った画像処理「ヒストグラム均一化」についてまとめています。
参考
画像処理で使う基礎知識については、「画像処理の基礎知識」にまとめています。
ヒストグラムとは?
ヒストグラムとは、縦軸に度数、横軸に階級をとった統計グラフの一種です。
データの分布状況を視覚的に認識するため、主に統計学や数学、画像処理等で用いられます。
画像処理では、赤・緑・青色など、画素値の分布を視認するために利用されます。
OpenCV を使って、ヒストグラムを表示するプログラムを紹介します。
OpenCV と Matplotlib を使用します。
1 2 3 4 5 6 7 8 9 10 11 |
import cv2 import matplotlib.pyplot as plt %matplotlib inline img = cv2.imread("sample.jpg") color_list = ["blue", "green", "red"] for i, j in enumerate(color_list): hist = cv2.calcHist([img], [i], None, [256], [0, 256]) plt.plot(hist, color = j) |
- 1~3行目:必要なモジュールを読み込みます
- 5行目:ヒストグラムを描く元となる画像を読み込みます
- 6行目:RGBの各色に応じたヒストグラムを描くため、そのリストを準備しています
- 7~9行目:calcHist() を使ってヒストグラムを計算し、表示します
元画像
元画像に対するヒストグラム
ヒストグラムを見ると、RGB それぞれの階級が高く、差異が少ないことから、
白っぽい画像で、色鮮やかな画像であることが分かります。
グレースケールの画像に対してヒストグラムを出力するには、以下のようにプログラムを記述します。
1 2 3 4 |
img_gray = cv2.imread("sample.jpg", 0) hist2 = cv2.calcHist([img_gray], [0], None, [256], [0, 256]) plt.plot(hist2) |
- 1行目:imread() の第2引数に 0 を指定して、グレースケールで読み込んでいます
- 2~3行目:前述と同様にヒストグラムを計算し、表示します
ヒストグラム均一化
画像処理におけるヒストグラム均一化は、コントラストの低くかったり、明るさが偏っている画像に対し、
画素の色分布を均一化することで全体的なバランスを改善することができます。
それでは、早速プログラムを見ていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import cv2 import matplotlib.pyplot as plt %matplotlib inline img = cv2.imread("sample.jpg", 0) hist = cv2.calcHist([img], [0], None, [256], [0, 256]) plt.plot(hist) img_eq = cv2.equalizeHist(img) hist_e = cv2.calcHist([img_eq], [0], None, [256], [0, 256]) plt.plot(hist_e) cv2.imshow("img", img) cv2.imshow("eq", img_eq) cv2.waitKey(0) cv2.destroyAllWindows() |
- 1~7行目は、前述の内容と同じです
- 9行目:equalizeHist() API を使って、ヒストグラム均一化を行います
- 10~11行目:ヒストグラム均一化を行った後のヒストグラムを表示します
- 13~16行目:元の画像とヒストグラム均一化を行った後の画像を表示します
ヒストグラムが均一化され、暗い部分はより暗く、明るい部分はより明るくなっているのが分かります。
明暗がより鮮明に確認することができます。