スキルUPの道しるべ

本サイトはプロモーションを含みます
上に戻る

【Python&OpenCV】画像の二値化をする方法を例付きでわかりやすく解説!

画像処理において「二値化」とは、画像を白と黒の2色だけで表現する方法です。これにより、画像中の特定の特徴を強調し、簡単に解析できるようにします。 この二値化をPythonで行うためには、OpenCVというライブラリが非常に便利です。

以下で、そのOpenCVを使った画像の二値化の基本的な方法について見ていきましょう。

OpenCVPythonの環境構築

まずは、OpenCVを使用するためにPython環境を整えます。Pythonがインストールされていない場合は、公式サイトからダウンロードしインストールしてください。

次に、OpenCVをインストールします。以下のコマンドをターミナルまたはコマンドプロンプトに入力して実行します。

pip install opencv-python

これで、OpenCVPython環境にインストールされました。

続いて、実際に画像を二値化する方法を見ていきましょう。

OpenCVによる画像処理入門』で基礎の確認から応用した使い方まで学ぶことができます。本記事とあわせて、ぜひ、チェックしてください。

画像の読み込みと表示

最初に、OpenCVを使って画像を読み込み、表示する方法を紹介します。

以下のコード例では、"sample.png"という名前の画像を読み込みます。

import cv2

# 画像の読み込み
image = cv2.imread('sample.png')

# 画像の表示
cv2.imshow('Original Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

このコードを実行すると、読み込んだ画像が表示されます。

実行結果(元画像, sample.png):

cv2.imshowでウィンドウを表示し、cv2.waitKey(0)でキー入力を待つことで、表示されたウィンドウを閉じることができます。

画像のグレースケール変換

二値化を行う前に、カラー画像をグレースケールに変換する必要があります。

グレースケール画像は、各ピクセルが0から255の範囲で表現され、これにより二値化の処理が簡単になります。

# グレースケール画像に変換
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# グレースケール画像の表示
cv2.imshow('Grayscale Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

このコードで、カラー画像をグレースケールに変換し、結果を表示できます。

実行結果:

二値化の基本操作

OpenCVで二値化を行う方法はいくつかありますが、ここでは最も基本的な「固定閾値」を用いた方法を紹介します。

この方法では、ある一定の値を基準にして、それ以上の値を白、それ以下の値を黒にします。

# 固定閾値による二値化
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)

# 二値化画像の表示
cv2.imshow('Binary Image', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

上記のコードでは、cv2.thresholdを使用してグレースケール画像を二値化しています。

ここでは、閾値を127に設定し、255を白とするように指定しています。

実行結果:

適応的二値化

固定閾値を用いた二値化はシンプルで便利ですが、画像全体の輝度が均一でない場合にはうまく機能しないことがあります。

このような場合、適応的二値化を使用すると良いでしょう。

適応的二値化は、画像の小さな領域ごとに異なる閾値を計算して適用します。

# 適応的二値化
adaptive_binary_image = cv2.adaptiveThreshold(
    gray_image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

# 適応的二値化画像の表示
cv2.imshow('Adaptive Binary Image', adaptive_binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

このコードでは、cv2.adaptiveThresholdを使用して適応的二値化を行っています。

ここでは、ガウシアン分布に基づいた方法を用いています。

実行結果:

Otsuの二値化

画像における最適な閾値を自動で決定したい場合は、Otsuの二値化を使用するのが効果的です。

Otsuの方法では、画像のヒストグラムを解析し、クラス内の分散が最小となるように閾値を設定します。

# Otsuの二値化
_, otsu_binary_image = cv2.threshold(
    gray_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# Otsuの二値化画像の表示
cv2.imshow('Otsu Binary Image', otsu_binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Otsuの方法では、閾値として0を指定しますが、実際にはOpenCVが自動的に最適な閾値を計算します。

実行結果:

関連・おすすめ書籍

まとめ

この記事では、OpenCVを使用したPythonでの画像の二値化について、基本的な方法から応用的な手法まで解説しました。

二値化は画像処理において非常に重要なステップであり、さまざまな場面で活用できます。

▼必見(ChatGPTを活用!おすすめAI副業)▼

今なら5000円分の特典あり!! dodgsonblog.com