本日はSobel(ソーベル)フィルタという画像のディジタルフィルタを紹介し、Sobelフィルタの効果であるエッジの抽出を行うプログラムを紹介してみたいと思います。
以前C++で実装する記事を投稿しましたが、本日はPythonで実装したプログラムを紹介します。C++の方が都合の良い方がいましたら、以下の記事をご参照ください。
目次
Sobelフィルタ
Sobelフィルタは、一次微分を利用して画像から輪郭を抽出するフィルタです。
一次微分というと複雑に感じますが、以下のような係数で与えられるディジタルフィルタです。例のように、水平方向の画素に大きく差がある場合に値が大きくなるため、エッジを抽出することができます。
同じ一次微分フィルタとしてはPrewittフィルタも有名ですが、Sobelフィルタの方がよりくっきりとエッジが抽出できる印象があります。
水平・垂直方向問わずにエッジを抽出したい場合においては、両方のフィルタを掛けた結果を足し合わせるなど、合成することでエッジの抽出が可能です。
画像へのSobelフィルタ適用によるエッジ抽出プログラム(Python+OpenCV)
画像にSobelフィルタを適用するプログラムを以下で紹介します。
以下の3パターンを試せるプログラムとしました。
- 水平方向Sobelフィルタ
- 垂直方向Sobelフィルタ
- 水平・垂直合成Sobelフィルタ
ソースコード
動作環境:OpenCV 4.5.5
ソースコードの解説
以下の箇所で水平方向Sobelフィルタの処理を記述しています。
また、以下の箇所で垂直方向Sobelフィルタの処理を記述しています。
最後に、以下の箇所で水平・垂直合成Sobelフィルタの処理を記述しています。
プログラムの動作結果
入力データとしては、以下の2枚の画像を用いました。結果を見る限りでは、エッジが正しく抽出できているように見えます。
水平方向Sobelフィルタ
垂直方向Sobelフィルタ
水平・垂直合成Sobelフィルタ
まとめ
本日はSobelフィルタを用いたエッジ抽出を紹介しました。以前にラプラシアンフィルタを用いたエッジ抽出についても紹介しているので、以下の記事も参考にしてみてください。