【Python/OpenCV】ロバーツフィルタで斜め方向の輪郭検出

Python版OpenCVでロバーツフィルタ(Roberts filter)を実装し、画像の斜め方向の輪郭を検出する方法をソースコード付きで解説します。

ロバーツフィルタとは

ロバーツフィルタ(Roberts filter)は、画像の輪郭検出に用いられる空間フィルタの1つです。一次微分フィルタの1種ですが、斜め方向の微分を求めますのが特徴的です。つまり、斜めの輪郭を検出することができます。仕組みについては以下ページで別途解説しています。

ロバーツフィルタの原理・特徴・計算式
画像処理におけるロバーツフィルタ(Roberts filter)の原理や計算式についてまとめました。

今回は、Python版OpenCVを用いてロバーツフィルタを実装し、画像の斜め方向の輪郭検出を行う方法を解説します。

サンプルコード① cv2.filter2dで実装

OpenCVのcv2.filter2dで簡単に実装した例です。


実行結果

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

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

コード解説

  • 以下で斜方向の輪郭を検出するためのロバーツフィルタのカーネルを定義しています。kernel_xは水平方向(正確には斜め右方向)、kernel_yは垂直方向(正確には斜め左方向)の輪郭を検出します。
    kernel_x = np.array([[0, 0, 0],
                         [0, 1, 0],
                         [0, 0, -1]])

    kernel_y = np.array([[0, 0, 0],
                         [0, 1, 0],
                         [0, 0, -1]])
  • OpenCVのfilter2Dを用いて、定義したカーネルを用いてグレースケール画像に畳み込み演算を行います。これにより、斜め右方向と斜め左方向の輪郭画像が出力されます。
gray_x = cv.filter2D(gray, cv.CV_64F, kernel_x)
gray_y = cv.filter2D(gray, cv.CV_64F, kernel_y)
  • 2つの輪郭画像の二乗和平方根を計算し、最終的な輪郭画像を生成します。これで、斜め右方向と左方向の輪郭を抽出した画像が得られます。
dst = np.sqrt(gray_x ** 2 + gray_y ** 2)

サンプルコード② 自分でアルゴリズムを実装

自分でアルゴリズムを実装した例です。


filter2d関数は、入力画像srcに対してカーネルkernelを使用して空間フィルタリングを行います。詳細は以下ページで解説しています。

【Python/OpenCV】空間フィルタリング・畳み込み演算(cv2.filter2d)
PythonとOpenCVを用いて空間フィルタリング処理する方法をソースコード付きで解説します。

実行結果

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

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

注意点(負の値の処理)

サンプルコード①②の出力画像は正の勾配(黒→白)のみ白色になっています。
負の勾配(白→黒)も白色に塗って出力する方法は下記ページで紹介しています。

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

関連ページ

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

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

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

コメント