画像解析をしたいときに、画像を二値化して解析する人もいるのではないでしょうか。多くの人は、画像の二値化を画像解析ソフトを用いて行っていますが、実は、画像の二値化はPythonで数行コードを書くだけで簡単に出来てしまいます。そこで今回は、Pythonを用いて画像を二値化する方法について紹介します。
macOS Catalina(10.15.7), python3.7.10, Jupyter Notebook
*本記事では、Pythonを実行する環境としてJupyter Notebookを用いています。Jupyter Notebookのインストールがお済み出ない方は、こちらの記事を参考にインストールをお願いします。インストールは5分程度で完了します。
【Python】Jupyter Notebookのメリット、インストール方法、使い方
画像の二値化処理とは
画像の二値化とは、分析対象の画像を白と黒の2色のみに変換する画像処理です。以下にカラー画像を二値化した例を載せます。二値化処理は画像と背景の境界を明確にするため、物体の検出が用意になることやデータ容量が小さくして画像処理の高速化させられるなどの利点があります。
Pythonで画像を二値化する方法(サンプルコードあり)
画像を二値化には、PythonのライブラリであるOpenCVのを使うと簡単にできます。画像を二値化するには、以下のようなコードを書きます。
import cv2 #OpenCVのインポート
cat_image = "cat.jpeg" #二値化したい画像ファイル名
threshold = 127 #二値化したい閾値
cat_grayscale_img = cv2.imread(cat_image,cv2.IMREAD_GRAYSCALE) #カラー画像を白黒画像で読み出しオブジェクトcat_grayscale_imgに代入
ret, cat_threshold_image = cv2.threshold(cat_grayscale_img, threshold, 255, cv2.THRESH_BINARY) #オブジェクトcat_grayscale_imgを閾値threshold(127)で二値化しcat_threshold_imageに代入
cv2.imwrite("cat_threshold.jpeg", cat_threshold_image) #"cat_threshold.jpeg"として二値化された画像を保存
実際に画像を二値化するコードを実行してみよう
上で記述したコードはimage_threshold.ipynb
という名前のjupyter notebookファイルとして、Desktop/LabCode/Python
に保存します。
*コードを実行する前に
コードを実行する前に、お使いのJupyter notebook環境にOpenCVのインストールを行う必要があります。OpenCVのインストール方法については、こちらの記事に写真付きで詳しく解説してありますので、御覧ください。2分程度でOpenCVのインストールができると思います。
Pythonを使って複数のカラー画像を白黒画像に変換する(OpenCVインストール方法)
実行結果
今回はこちらの猫ちゃんのカラー画像(cat.jpeg
)を二値化していこうと思います。
cat.jpeg
をimage_threshold.ipynb
と同じ階層(以下の画像だと、Pythonフォルダの内)に保存しておきます。
上記のコードを実行すると、Desktop/LabCode/Python
のフォルダ内にcat_threshold.jpeg
が出来ていると思います。
コード実行結果
画像にきちんと二値化処理がかかっていますね!
コードの解説
import cv2
OpenCVを呼び出しています。Pythonでは、ライブラリ名を最初に記述することで使用可能になります。
cat_image = "cat.jpeg"
threshold = 127
二値化したい画像ファイル(cat.jpeg
)をオブジェクトcat_image
に代入しています。
閾値として使いたい値(127
)をオブジェクトthreshold
に代入しています。
cat_grayscale_img = cv2.imread(cat_image,cv2.IMREAD_GRAYSCALE)
cv2.imread
によってOpenCVのimreadメソッドを呼び出しています。imreadメソッドはファイルに存在する画像を読み出すメソッドで、画像を読み出す際に特定の処理を加えることが出来ます。今回はカラー画像を白黒画像にしています。cv2.imread
は第一引数に指定した画像を第二引数で指定した処理を行います。ここでは、第一引数に指定した画像はcat_image
で、第二引数で指定した処理はcv2.IMREAD_GRAYSCALE
のことで、画像を白黒で読み込むOpenCVの機能となります。読みだした画像をオブジェクトcat_grayscale_img
に代入します。
ret, cat_threshold_image = cv2.threshold(cat_grayscale_img, threshold, 255, cv2.THRESH_BINARY)
cv2.threshold
によってOpenCVのthresholdメソッドを呼び出しています。今回のthresholdメソッドの引数の解説は以下になります。
- cat_grayscale_img: 二値化したい画像
- threshold : 設定したい閾値。今回で言うと127になっている。数字で直接指定することも可能*
- 255: Maxの画素値
- cv2.THRESH_BINARY: thresholdTypeで2値化の方法の1つ
*各ピクセルの画素値を127という閾値でふるいにかけています。閾値より高い値は白(=255)になり、低い数値は黒(=0)になります。ピクセルの画素数や、画像データに関する基礎知識は、【Python】画像データを数値データとして扱うには?にて解説しておりますので、こちらもぜひご参照ください。
二値化処理した画像を、オブジェクトcat_threshold_image
に入れています。ret
は説明すると難しいですが、簡単に言うとメソッドで作成した閾値の設定が入っていると思ってください。ret
が閾値の設定を受け取って、cat_threshold_image
で画像データを受け取っています。なぜこのように分けて受け取る必要があるのかを説明すると長くなりますので、今回の記事での解説は割愛させていただきます。詳しく知りたい方は、こちらの記事にかかれている内容を参考にされてください。
画像のしきい値処理
cv2.imwrite("cat_threshold.jpeg", cat_threshold_image)
cv2.imwrite
は画像を書き出す機能となっております。第二引数で指定した画像を、第一引数の画像名で保存します。