Python で画像をグレースケールに変換する

Muhammad Waiz Khan 2023年1月30日
  1. Python で画像をグレースケールに変換する pillow ライブラリの image.convert() メソッドを使用する
  2. Python で scikit-image モジュールの color.rgb2gray() メソッドを用いて画像をグレースケールに変換する
  3. OpenCV ライブラリの cv2.imread() メソッドを用いた Python で画像をグレースケールに変換する
  4. 変換式と Matplotlib ライブラリを用いた Python で画像をグレースケールに変換する
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()

関連記事 - Python Image