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

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

DoMフィルタとは

DoM(Difference of Mean)は、DoG(Difference of Gaussian)のガウシアンフィルタを平均値フィルタ(Mean filter)に置き換えたものです。つまり、異なるカーネルサイズの平均値フィルタを2つ用意し、平滑化された2つの画像の差分を取ることで輪郭画像を作成します。DoMを用いる利点としては、平均値フィルタは畳み込み演算の過程で「注目画素とその近傍の画素の総和」を求めるため、「積分画像を用いた高速化」が可能となる点です。

DoMの原理・計算式・高速化
この記事では、DoM(Difference of Mean)の基本原理や計算式・特徴・例題についてまとめました。

Python版OpenCVを用いてDoMフィルタを実装し、画像の輪郭検出を行う方法を解説します。

サンプルコード① シンプルにDoMフィルタを実装

以下は、「cv.blur」を用いてシンプルにDoMフィルタを実装した例です。


実行結果

サンプルプログラムの実行結果です。
処理時間は約2.67ミリ秒です。輪郭は強調されていますが、ノイズも多めです。

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

サンプルコード② ノイズ除去のために細線化処理を追加

以下は、ノイズ除去のためにサンプルコード①に細線化処理を追加したものです。


実行結果

サンプルプログラムの実行結果です。
処理時間は約6.5ミリ秒です。サンプルコード①よりもノイズを低減できていることがわかります。

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

コード解説

追加された細線化処理は以下で実装しています。

    # カーネルの定義
    kernel = np.ones((ksize3, ksize3), np.uint8)

    # 収縮処理(細線化)
    erode = cv.erode(binary , kernel)

「cv2.erode」の使い方は以下ページで別途解説しています。

【Python/OpenCV】cv2.dilateとcv2.erodeで膨張・収縮処理してノイズを除去
Python版OpenCV(cv2.dilate, cv2.erode)もしくはNumPyで膨張・収縮フィルタ処理を実装する方法をソースコード付きで解説します。

関連ページ

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

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

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

コメント