【Python/OpenCV】LoGフィルタで輪郭検出

Python版OpenCVでLoGフィルタを実装し、ノイズを抑えて画像の輪郭を検出する方法をソースコード付きで解説します。

LoGフィルタとは

LoGフィルタとは、ラプラシアンフィルタ(Laplacian filter)とガウシアンフィルタ(Laplacian filter)を組み合わせたものです。

■ラプラシアンフィルタ(左)とLoGフィルタ(右)

ラプラシアンフィルタには、一次微分を利用するフィルタ(ソーベルフィルタなど)よりも細かい輪郭を検出でき、計算量が少ないという利点がある反面、2階微分を行うためノイズも強調しやすく、ノイズの影響を受けやすいという欠点があります。
そこで、LoGフィルタでは入力画像をガウシアンフィルタで平滑化処理し、その後にラプラシアンフィルタを適用して輪郭を検出することで、ノイズの影響を軽減しながら輪郭検出を行います。

【画像処理】LoGフィルタの原理・特徴・計算式
画像処理におけるLoGフィルタの原理・特徴・計算方法についてまとめました。

サンプルコード①

以下は、Python版OpenCVの「cv2.GaussianBlur」と「cv.Laplacian」でLoGフィルタを実装したサンプルコードです。


実行結果

サンプルプログラムの実行結果です。

■入力画像(左)と出力画像(右)

以下の画像は、ラプラシアンフィルタを掛けた場合(左)とLoGフィルタを掛けた場合の輪郭画像の一部分を拡大して比較したものです。
LoGフィルタのほうがノイズの影響を抑えることができています。

■ラプラシアンフィルタ(左)とLoGフィルタ(右)

コード解説

サンプルコードのポイントを解説します。
LoG関数の内部は、以下の3段階で処理を行っています。

① グレースケール画像 gray に対して、ガウシアンフィルタ(カーネルサイズ ksize、標準偏差 sigma)で平滑化
② ラプラシアンフィルタで輪郭検出
③ 単純二値化処理(閾値 threshold)

以下の部分では、グレースケール画像 gray に対して、ガウシアンフィルタを適用し、画像のノイズを除去し、平滑化します。
これにより、ラプラシアンフィルタを掛けたときにノイズの影響を抑えることができます。

blurred = cv.GaussianBlur(gray, (ksize, ksize), sigma)
  • ksizeはカーネルサイズ
  • sigmaはガウシアン分布の標準偏差

以下の部分では、ガウシアンフィルタで平滑化処理された画像 blurred に対して、ラプラシアンフィルタを適用し、輪郭検出を行っています。

log = cv.Laplacian(blurred, cv.CV_64F)
  • cv.CV_64F は出力画像のデータ型を指定しています。

以下では、ラプラシアンフィルタ後の画像 log に対して二値化処理(閾値はthreshold)を行います。
二値化によって微小なノイズが除去され、対象物の輪郭が白黒と明確になります。

_, binary = cv.threshold(log, threshold, 255, cv.THRESH_BINARY)

サンプルコード②

以下は、Python版OpenCVの「cv2.filter2D」でLoGフィルタを実装したサンプルコードです。


実行結果

サンプルプログラムの実行結果です。

■入力画像(左)と出力画像(右)

関連ページ

【PythonとOpenCVで画像処理超入門】使い方とサンプルコードを解説
Python版OpenCVで画像処理プログラミングを行う方法を入門者向けにソースコード付きで解説するページです。
この記事を書いた人
西住技研

Python使用歴10年以上。研究、仕事、趣味でデータ分析や作業自動化などに活用してきたノウハウを情報発信しています。
詳しいプロフィールやお問合せはこちらのページまで。
YoutubeX(旧Twitter)でも情報発信中です!

西住技研をフォローする
OpenCV

コメント