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

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

LoGフィルタとは

LoGフィルタとは、ラプラシアンフィルタ(Laplacian filter)とガウシアンフィルタ(Laplacian filter)を組み合わせたものです。それぞれの実装方法は以下ページで別途解説しています。

【Python/OpenCV】ラプラシアンフィルタで輪郭検出(cv2.Laplacian)
Python版OpenCVでラプラシアンフィルタを実装し、画像の輪郭を検出する方法をソースコード付きで解説します。
【Python/OpenCV】ガウシアンフィルタで画像のノイズ除去(cv2.GaussianBlur)
Python版OpenCVのcv2.GaussianBlur(ガウシアンフィルタ)で画像をぼかし(平滑化して)、ノイズを除去する方法をソースコード付きで解説します。

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

サンプルコード


実行結果

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

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

コード解説

このコードの各部分について詳しく解説します。
LoG関数は、グレースケール画像 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 に対して輪郭部分が白色、それ以外が黒色の二値化処理を行います。

ノイズ除去: 二値化によって微小なノイズが除去され、対象物の輪郭が明確になります。これにより、ノイズの影響を最小限に抑えることができます。

_, binary = cv.threshold(log, threshold, 255, cv.THRESH_BINARY)
  • thresholdは二値化の閾値
  • 255は白色の値です。
  • 二値化によって微小なノイズが除去され、対象物の輪郭がより鮮明になります。

関連ページ

上の出力画像は正の勾配(黒→白)のみ白色になっています。
負の勾配(白→黒)も白色に塗って出力する方法は以下ページで解説しています。

【Python/OpenCV】微分フィルタの注意点(負の値の処理)
Python版OpenCVの微分フィルタ(Sobelなど)を利用する時の注意点についてソースコード付きで解説します。

関連ページ

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

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

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

コメント