Python版OpenCVでLoGフィルタを実装し、ノイズを抑えて画像の輪郭を検出する方法をソースコード付きで解説します。
LoGフィルタとは
LoGフィルタとは、ラプラシアンフィルタ(Laplacian filter)とガウシアンフィルタ(Laplacian filter)を組み合わせたものです。
■ラプラシアンフィルタ(左)とLoGフィルタ(右)
ラプラシアンフィルタには、一次微分を利用するフィルタ(ソーベルフィルタなど)よりも細かい輪郭を検出でき、計算量が少ないという利点がある反面、2階微分を行うためノイズも強調しやすく、ノイズの影響を受けやすいという欠点があります。
そこで、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フィルタを実装したサンプルコードです。
実行結果
サンプルプログラムの実行結果です。
■入力画像(左)と出力画像(右)
関連ページ

コメント