見出し画像

Pythonで写真を見やすくする方法を確認してみた

やってみようと思ったきっかけ

 Pythonの画像処理ライブラリであるOpenCVを活用すると様々な画像処理ができるのですが、γ変換で画像の明るさを調整したり、ヒストグラム平坦化で画像のコントラストをはっきりさせる方法を再確認したいと思ったので。自分で撮影した画像やテスト画像をいろいろ加工してみたいと思います。

γ (ガンマ)補正

 画像の明るさを変更する方法です。細かい数式は省略しますが、γが
1より大きくなると明るくなり、1を下回ると暗くなります。ちょっとやってみましょう。

補正前(airplane.jpg)
#ライブラリのインポート
import cv2
import numpy as np

#γ変換のγ値
gamma = 2.0
#画像を読み込む
img = cv2.imread("airplane.jpg")

#ガンマ補正の計算式をgamma_cvtに代入
gamma_cvt = np.zeros((256, 1), dtype = 'uint8') 
for i in range(256):
    gamma_cvt[i][0] = 255 * (float(i) / 255) ** (1.0 / gamma)

#γ変換を行う
img_gamma = cv2.LUT(img, gamma_cvt)

#変換後の画像を表示する。
cv2.imshow("gamma", img_gamma)
cv2.waitKey(0)
cv2.destroyAllWindows()
補正後

 全体的に明るくなりました。途中の計算式はやや難しいですが、LUT (ルックアップテーブル )へガンマ補正の計算式を渡すところがポイントですね→cv2.LUT(img, gamma_cvt)

ヒストグラム平坦化

 次はヒストグラム平坦化(均一化)です。これはコントラストを調整ことで画像を見やすくする方法です。実際はグレースケールの画像で用いるため、日常はあまり使わないかもしれませんが、濃淡をはっきり出したいときなどは便利です。

ヒストグラムを描画する

#ライブラリのインポート
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use("ggplot")

#画像の読み込み。第二引数を0に指定することでグレースケールに画像を変換する。
img = cv2.imread("Lena.jpg",0)

#ヒストグラムを表示
hist = cv2.calcHist([img],[0],None,[256],[0,256])
plt.plot(hist)
変更前画像のヒストグラム

ヒストグラム平坦化を実行

#equalizeHistでヒストグラム平坦化を実行
img_equal = cv2.equalizeHist(img)
hist_equal = cv2.calcHist([img_equal],[0],None,[256],[0,256])
plt.plot(hist_equal)
平坦後のヒストグラム

実際に比較

#オリジナルの画像
cv2.imshow("img", img)

#ヒストグラム均一化後の画像
cv2.imshow("equal_img", img_equal)
cv2.waitKey(0)
cv2.destroyAllWindows()

結果

右側が変換前、左側が変換後の画像

 濃淡が強調され、画像はっきり見えるようになりましたね。なお、今回は下記の本を拝見して勉強させてもらいました。これ以外にも様々な手法が掲載されており、とても分かりやすかったです。

Pythonで始めるOpenCV入門
https://amzn.to/3qwE57d

参考サイト(公式サイト)


この記事が気に入ったらサポートをしてみませんか?