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で画像処理プログラミングを行う方法を入門者向けにソースコード付きで解説するページです。
コメント