カラー画像から白黒画像へ変換したいときがありますよね。しかも、複数のカラー画像を一枚一枚白黒画像へと変換するのは面倒… そこでこの記事では、Pythonを使って複数のカラー画像を白黒画像に変換する方法を具体的に解説していきます。
macOS Big Sur(11.4), python3.7.10, Jupyter Notebook
*本記事では、Pythonを実行する環境としてJupyter Notebookを用いています。Jupyter Notebookのインストールがお済み出ない方は、こちらの記事を参考にインストールをお願いします。インストールは5分程度で完了します。
【Python】Jupyter Notebookのメリット、インストール方法、使い方
複数のカラー画像を白黒画像に変換する方法
画像ファイルを用意しよう
今回はサンプルとして猫の写真を3枚用意しました。
猫の画像にはそれぞれ、cat.jpeg、cat2.jpeg、cat3.jpegと名前がついています。今回、画像ファイルの拡張子は「.jpeg」を用いていますが、「.png」や「.gif」といった他の画像ファイルの拡張子でも構いません。画像ファイルはJupyter Notebookと同じ階層フォルダの中に格納してください。
プログラムを実行する
OpenCVのインストール(事前準備)
今回、「OpenCV」というPythonのライブラリを使用します。しかし、初期環境でのJupyter NotebookではOpenCVが入っておらず、自分自身でインストールする必要があります。Anaconda Navigator上でOpenCVをインストールしていきましょう。
これで、OpenCVライブラリのインストールは完了です!
1枚のカラー画像を白黒画像に変換するためのコードを書いてみよう(サンプルコードあり)
1枚のカラー画像を白黒画像に変換するコードは次のようになります。「cat.jpeg」のところに、ご自身が用意した画像ファイル名を書きます。
import cv2
# カラー画像の読み込み + 白黒化
grayscale_image = cv2.imread('cat.jpeg', cv2.IMREAD_GRAYSCALE)
# 白黒画像の保存
cv2.imwrite('cat_gray.jpeg', grayscale_image)
このコードを実行すると、フォルダ内に白黒画像に変換された画像(ファイル名:cat_gray.jpeg)が保存されます。
コードを実行する前の画像と、実行した後の画像を見比べてみましょう。
きちんと白黒画像になっています!
複数のカラー画像を白黒画像に変換するためのコードを書いてみよう(サンプルコードあり)
いよいよ複数枚のカラー画像を白黒画像に変換していきます。とはいっても、1枚のカラー画像を白黒画像にすることができたなら、複数枚のカラー画像を変換することは簡単です。
複数のカラー画像を白黒画像にするためのコードは以下になります。
import cv2
import os
# 白黒画像の保存先
new_dir_path = './images'
if not os.path.exists(new_dir_path):
# 保存先がなければ作成する
os.mkdir(new_dir_path)
# 画像の名前のリスト
cat_image_names = ["cat", "cat2", "cat3"]
image_type = ".jpeg"
for cat_image_name in cat_image_names:
grayscale_image = cv2.imread(cat_image_name+image_type, cv2.IMREAD_GRAYSCALE)
cv2.imwrite(os.path.join(new_dir_path, cat_image_name+"_grayscale"+image_type), grayscale_image)
出力結果
コードによって生成されたimagesフォルダの中に、3枚の猫の白黒画像(cat_grayscale.jpeg
、cat2_grayscale.jpeg
、cat3_grayscale.jpeg
)が生成されていれば、正常にプログラムが実行されています。
コードの解説
import cv2
import os
cv2とosライブラリを呼び出すコードになっています。osとは主にファイルやディレクトリ操作が可能で、ファイルの一覧やpathを取得できたり、新規にファイル・ディレクトリを作成することができるモジュールです。
os.mkdir(new_dir_path)
新しいフォルダを作るコードです。new_dir_path
に格納された「images」フォルダを作ります。
if not os.path.exists(new_dir_path):
os.mkdir(new_dir_path)
ここでは、imagesフォルダが存在するかどうかの条件分岐を書いています。os.path.exists
はフォルダが存在するかどうかを確かめるコードです。今回は、imagesフォルダがあるかどうかを確かめています。二行目のos.mkdir
はフォルダを作成するコードです。今回は、もしimageフォルダが存在しない場合は、imageフォルダを作成するというコードを書いています。
cat_image_names = ["cat", "cat2", "cat3"]
こちらはcat_image_names
という配列に、複数枚の画像を格納しています。こちらの配列に対し、
for cat_image_name in cat_image_names:
for
は特定の処理を繰り返すコードです。こちらのコードで、cat_image_names
の中の要素に対して特定の処理を繰り返します。今回は「画像を白黒にする」処理を繰り返させます。
grayscale_image = cv2.imread(cat_image_name+image_type, cv2.IMREAD_GRAYSCALE)
残りのコードは、カラー画像を白黒画像にするコードになります。cv2.imread
は第一引数に指定した画像を第二引数で指定した処理を行います。ここでは、第一引数に指定した画像はcat_image_name+image_type
で、第二引数で指定した処理はcv2.IMREAD_GRAYSCALE
のことで、画像を白黒で読み込むOpenCVの機能となります。
cv2.imwrite(os.path.join(new_dir_path, cat_image_name+"_grayscale"+image_type), grayscale_image)
cv2.imwrite
は画像を書き出す機能となっております。第二引数で指定した画像を、第一引数の画像名で保存します。
os.path.join
はパスを結合させるコードです。つまりnew_dir_path, cat_image_name+"_grayscale"+image_type
は./image/cat_grayscale.jpeg
というパスになります。
このように、複数枚を白黒画像にしたかったら、それらを配列にして、白黒化するコードで処理する。この一連の流れを繰り返すことで、複数のカラー画像をいっぺんに白黒画像にすることができます。