前回のおさらいと今回のテーマ
こんにちは!前回は、画像のヒストグラムについて解説し、画像の明るさや色の分布を視覚化する方法を紹介しました。
今回は、画像処理の基本的な操作である画像の二値化について説明します。二値化は、画像を白と黒の二つの色で表現する手法であり、エッジ検出や物体認識、OCR(光学文字認識)など、さまざまな応用に用いられます。この記事では、二値化の基本的な概念と手法、OpenCVを使った実装方法について解説します。
画像の二値化とは?
1. 二値化の定義
二値化とは、画像の各ピクセルの値を白(255)または黒(0)のいずれかに変換する操作です。二値化を行うことで、画像内の対象物と背景を分離しやすくなり、形状の解析や領域の抽出が容易になります。
2. 二値化の目的
二値化は、画像中の特定の領域を強調したり、ノイズを除去したりするために行われます。以下のようなタスクでよく使用されます。
- エッジ検出:物体の輪郭をはっきりさせる。
- 物体認識:特定のパターンや形状を認識する。
- 文字認識(OCR):印刷された文字や手書き文字をデジタルテキストに変換する。
基本的な二値化の手法
1. 固定しきい値による二値化
固定しきい値による二値化は、指定されたしきい値を基準に、各ピクセルの値を白か黒に分類する最も基本的な手法です。
- しきい値より大きい場合:白(255)に設定
- しきい値以下の場合:黒(0)に設定
OpenCVでの実装
以下は、OpenCVを使用して固定しきい値による二値化を行う例です。
import cv2
# 画像の読み込み(グレースケール)
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 固定しきい値による二値化
_, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
# 結果の表示
cv2.imshow('Original Image', image)
cv2.imshow('Binary Image', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
このコードでは、cv2.threshold()
関数を使用して二値化を行っています。第2引数はしきい値(127)、第3引数は白(255)の値を指定します。
2. 大津の二値化(Otsu’s Binarization)
大津の二値化は、しきい値を自動的に決定する手法です。ヒストグラムの分布を分析し、クラス内の分散が最小になるような最適なしきい値を計算します。これにより、適切なしきい値を手動で選ぶ必要がなくなります。
OpenCVでの実装
大津の二値化を使用するには、cv2.THRESH_OTSU
オプションを指定します。
# 大津の二値化
_, otsu_binary_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 結果の表示
cv2.imshow('Original Image', image)
cv2.imshow('Otsu Binary Image', otsu_binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
ここでは、しきい値を0に設定し、cv2.THRESH_OTSU
を加えることで自動的に最適なしきい値を計算しています。
3. 適応的二値化(Adaptive Thresholding)
適応的二値化は、画像全体ではなく局所的な領域ごとに異なるしきい値を適用する手法です。これにより、照明の影響が大きい画像やコントラストのばらつきがある画像でも、適切に二値化が行えます。
OpenCVでの実装
以下は、適応的二値化の例です。
# 適応的二値化(平均値法)
adaptive_binary_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
# 適応的二値化(ガウシアン法)
adaptive_gaussian_binary_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
# 結果の表示
cv2.imshow('Original Image', image)
cv2.imshow('Adaptive Mean Binary Image', adaptive_binary_image)
cv2.imshow('Adaptive Gaussian Binary Image', adaptive_gaussian_binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
このコードでは、cv2.ADAPTIVE_THRESH_MEAN_C
とcv2.ADAPTIVE_THRESH_GAUSSIAN_C
の2種類の適応的二値化を行っています。ブロックサイズ(11)と補正値(2)を指定して、局所的なしきい値を計算します。
二値化の応用例
1. エッジ検出
二値化された画像は、エッジ検出において重要な役割を果たします。エッジを強調することで、画像中の物体や形状を特定しやすくなります。
2. OCR(光学文字認識)
OCRでは、文字を認識するためにまず画像を二値化することが一般的です。背景と文字のコントラストを明確にすることで、文字認識の精度を向上させます。
3. 医療画像解析
医療分野では、X線画像やCT画像などを二値化することで、病変部位の抽出や領域の識別を行います。
二値化の注意点と課題
1. 照明の影響
固定しきい値による二値化では、画像の照明条件によっては正確に二値化できない場合があります。この場合、適応的二値化や大津の二値化を用いることで対処できます。
2. ノイズの影響
画像にノイズが多いと、二値化の結果に影響を及ぼすことがあります。二値化の前にフィルタリング(例えばガウシアンフィルタ)を行ってノイズを軽減することが推奨されます。
3. パラメータの調整
適応的二値化や大津の二値化でも、ブロックサイズや補正値の選択によって結果が大きく変わることがあります。画像の特性に応じて、適切なパラメータを選ぶことが重要です。
まとめ
今回は、画像の二値化について解説しました。二値化は画像処理の基本的な操作であり、エッジ検出や物体認識、OCRなど幅広い分野で利用されています。固定しきい値による単純な二値化から、大津の二値化、適応的二値化など、さまざまな手法が存在し、それぞれの特性に応じて使い分けることが重要です。
次回予告
次回は、テンプレートマッチングについて解説します。特定のパターンを画像内から検出する方法を学びましょう。
注釈
- しきい値:二値化の際に、ピクセルの輝度を白と黒に分類するための基準値。
- 大津の二値化:しきい値を自動的に決定する手法で、ヒストグラムの分布を基に計算される。
- 適応的二値化:局所的な領域ごとにしきい値を設定することで、照明の影響を軽減する手法。
コメント