Python で画像をグレースケールに変換する
-
Python で画像をグレースケールに変換する
pillowライブラリのimage.convert()メソッドを使用する -
Python で
scikit-imageモジュールのcolor.rgb2gray()メソッドを用いて画像をグレースケールに変換する -
OpenCVライブラリのcv2.imread()メソッドを用いた Python で画像をグレースケールに変換する -
変換式と
Matplotlibライブラリを用いた Python で画像をグレースケールに変換する
このチュートリアルでは、Python で画像をグレースケールに変換する様々な方法を説明します。グレースケール画像とは、1つのピクセルが光の量を表していたり、光の強さの情報だけを含んでいる画像のことです。単次元の画像であり、濃淡の異なるグレーカラーのみを持っています。
グレースケール画像は単次元であるため、様々な問題や Canny エッジ検出のようなアルゴリズムにおいて、モデルの学習の複雑さを減らすために使用されています。
この記事では、Python のモジュールの様々な方法を使って、Python で画像をグレースケールに変換したり、画像をグレースケールとして読み込んだりする方法を見ていきたいと思います。
Python で画像をグレースケールに変換する pillow ライブラリの image.convert() メソッドを使用する
image.convert(mode, ..) メソッドは画像を入力として受け取り、それを mode 引数で指定した画像タイプに変換します。モードには、1 ビットおよび 8 ビットピクセルの白黒画像、RGB 画像、HSV 画像、BGR 画像、LAB 画像などがあります。
画像をグレースケールに変換したいので、モード引数に 1 を渡すと 1 ビット白黒モード、L を渡すと 8 ビット白黒モード、LA を渡すとアルファモードになります。以下の例では、pillow ライブラリの image.convert() メソッドを用いて Python で画像をグレースケールに変換する方法を示します。
from PIL import Image
img = Image.open("test.jpg")
imgGray = img.convert("L")
imgGray.save("test_gray.jpg")
元の画像

コンバートされたグレースケール画像。

Python で scikit-image モジュールの color.rgb2gray() メソッドを用いて画像をグレースケールに変換する
color.rgb2gray() は RGB 形式の画像を入力として受け取り、入力画像のグレースケールコピーを返します。以下のコード例は、scikit-image モジュールの color.rgb2gray() メソッドを用いて Python でグレースケール画像を取得する方法を示しています。
from skimage import color
from skimage import io
img = io.imread("test.jpg")
imgGray = color.rgb2gray(img)
OpenCV ライブラリの cv2.imread() メソッドを用いた Python で画像をグレースケールに変換する
画像をグレースケールで取得するもう一つの方法として、画像を直接グレースケールで読み込む方法がありますが、OpenCV ライブラリの cv2.imread(path, flag) メソッドを利用することで、画像をグレースケールで読み込むことができます。
この場合、cv2.imread() メソッドの flag の値が 1 に等しいとすると、アルファチャンネルを除いた画像を読み込み、0 の場合はグレースケールとして読み込み、-1 の場合はアルファチャンネルの情報を含む画像を読み込みます。
したがって、flag の引数に 1 を渡すことで imread() メソッドを用いて指定したパスから画像をグレースケールとして読み込むことができます。
以下のコード例は、cv2.imread() メソッドを用いて Python で画像をグレースケールで読み込む方法を示しています。
import cv2
imgGray = cv2.imread("test.jpg", 0)
変換式と Matplotlib ライブラリを用いた Python で画像をグレースケールに変換する
また、標準的な RGB からグレースケールへの変換式である imgGray = 0.2989 * R + 0.5870 * G + 0.1140 * B を用いて画像をグレースケールに変換することもできます。
このメソッドは Python の Matplotlib ライブラリを使って実装できます。まず、mpimg.imread() メソッドを使って画像を読み込み、RGB 画像の赤、青、緑の次元行列を取得します。グレースケール画像を得るためには、完全な行列に数式で与えられた値を乗算する必要があります。
以下のコード例は、Matplotlib ライブラリを使って Python で RGB からグレースケールへの変換式を実装する方法を示しています。
from matplotlib import pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread("test.jpg")
R, G, B = img[:, :, 0], img[:, :, 1], img[:, :, 2]
imgGray = 0.2989 * R + 0.5870 * G + 0.1140 * B
plt.imshow(imgGray, cmap="gray")
plt.show()