OpenCV のエッジ検出(Sobel)について
はじめに
OpenCV のsobelを使ったエッジ検出処理ついて調べたことをまとめた。
とりあえず関数を試してみたい方
実験用プログラム OpenCV_test の GitHubリポジトリ
URL
https://github.com/iryachi/OpenCV_test
実行ファイルだけ
https://github.com/iryachi/OpenCV_test/releases
使い方
https://iryachi.stars.ne.jp/opencv_test_imple/
Sobelフィルタとは
畳み込みを利用して色の変化度合いを可視化するフィルタ。色が急に変化する部分が強調される。
平滑化フィルタ(ガウシアン)の要素も入っているので、ノイズに少し対応できる。
縦方向と横方向それぞれにパラメータが設定できるので、縦線だけ強調したいなどの用途に向いている。
畳み込みフィルタについては以下参照
https://iryachi.stars.ne.jp/?p=90
畳み込みフィルタの基本となる filter2D は以下
https://iryachi.stars.ne.jp/opencv-filter2d/
Sobel関数について
void cv::Sobel (InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
int ksize = 3,
double scale = 1,
double delta = 0,
int borderType )
引数
src | InputArray | 入力画像 | グレースケールの画像 |
dst | OutputArray | 出力画像 | グレースケールの画像 フォーマットはddepth による。 |
ddepth | int | 出力画像深度 | 出力画像のビット深度。 負数の場合、入力と同じビット深度。 CV_16S, CV_32F, CV_64F |
dx | int | x方向微分係数 | x軸方向の微分回数。 |
dy | int | y方向微分係数 | y軸方向の微分回数。 |
ksize | int | カーネルサイズ | フィルタのサイズ 1, 3, 5, 7 -1 の時 Scharr フィルタになる。 |
scale | double | スケーリング係数 | 処理後の画素値に乗算する値。 |
delta | double | 加算係数 | 処理後の画素値に加算する値。 |
borderType | int | 境界外処理方法 | cv::BorderTypes 画面 もしくは roi の境界処理をどうするか。(後述) |
パラメータ borderTypeについて
BORDER_DEFAULT | 画像境界で反射。 |
BORDER_CONSTANT | ある一定値を使用。 |
BORDER_REPLICATE | 境界の値を使用。 |
BORDER_REFLECT | BORDER_DEFAULT 同様 |
BORDER_REFLECT_101 | BORDER_DEFAULT 同様 |
BORDER_REFLECT101 | BORDER_DEFAULT 同様 |
BORDER_TRANSPARENT | 元画像を変更しない |
BORDER_WRAP | 画像自身を繰り返し (未対応) |
BORDER_ISOLATED | 何もしない。 |
詳しくは下記参照
https://iryachi.stars.ne.jp/opencv_bordertype/
カーネル
ksize = 3 の時のカーネルは以下になる。(たぶん)
Scharr フィルタのアパーチャ (ksize = -1 の時)
処理例
元画像
おわりに
エッジ検出フィルタは実際に処理したい画像を用いてやってみないとどれがいいかわかりにくい。
Canny や Laplacian とかも比較検討してみるといいと思う。
ディスカッション
コメント一覧
まだ、コメントがありません