アーカイブ

‘canny’ タグのついている投稿

OpenCVでエッジ検出するときの注意

2009 年 1 月 21 日 コメントはありません

OpenCVに実装されているCannyエッジ検出で衛星画像を処理しているとエラーが出ることがある。いろいろと検討した結果、画像サイズの素因数分解に大きな素数を持つとき、エラーになる傾向があるようだ。なお、CannyのアルゴリズムにはSobelフィルタが使われているようなので、Sobelでのエラーにも適用できると思う。

エラーが出る画像サイズ

画像1: x : 4986: 2 3 3 277; y : 4776: 2 2 2 3 199;
画像2: x: 5034: 2 3 839; y : 4836: 2 2 3 13 31;

エラーが出ない画像サイズ

画像1: x : 4968: 2 2 2 3 3 3 23; y : 4752: 2 2 2 2 3 3 3 11;
画像2: x : 5016: 2 2 2 3 11 19; y : 4794: 2 3 17 47;
画像3: x : 5052: 2 2 3 421; y: 4806: 2 3 3 3 89;
画像4: x : 5064: 2 2 2 3 211; y : 4764: 2 2 3 397;
画像5: x : 5040: 2 2 2 2 3 3 5 7; y : 4824: 2 2 2 3 3 67;
画像6: x : 5388: 2 2 3 449; y : 5112: 2 2 2 3 3 71;
画像7: x : 5064: 2 2 2 3 211; y : 4866: 2 3 811;

上記を見てみると、エラーが出ない画像サイズにも大きな素数が含まれる場合があって、正直のところ線引きがよくわからん。とりあえず僕の場合、結果が出てくれりゃそれでいいので、あまり深く考えない。

エラーが出た場合、元の画像をほんの少しサブセットしてあげればうまくいく。このとき、画像サイズが奇数よりも偶数のほうがうまくいきやすいようなので、縦横2ピクセルずつ切り詰めればOK。gdal_translateのsrcwinオプションを活用すると楽。