Python版OpenCVでLoGフィルタを実装し、画像の輪郭を検出する方法をソースコード付きで解説します。
LoGフィルタとは
LoGフィルタとは、ラプラシアンフィルタ(Laplacian filter)とガウシアンフィルタ(Laplacian filter)を組み合わせたものです。それぞれの実装方法は以下ページで別途解説しています。


ラプラシアンフィルタには、一次微分を利用するフィルタ(ソーベルフィルタなど)よりも細かい輪郭を検出でき、計算量が少ないという利点がある反面、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
は白色の値です。- 二値化によって微小なノイズが除去され、対象物の輪郭がより鮮明になります。
関連ページ
上の出力画像は正の勾配(黒→白)のみ白色になっています。
負の勾配(白→黒)も白色に塗って出力する方法は以下ページで解説しています。

関連ページ

コメント