エッジ検出(7) キャニー・エッジ検出
2010/02/27 00:30 - AS3.0
キャニー・エッジ検出(以下「キャニー法」)というエッジ検出法がある、ということが「OpenGL+GLSLによる画像処理プログラミング」のP116に書かれています。
キャニー法というのは、『「ゼロ・クロス法」をベースに、「1次微分」(勾配)の方向性を考慮することによって (OpenGL+GLSLによる画像処理プログラミング P116)』実現される高精度のエッジ検出法とのこと。
何が何だかさっぱりだ。とりあえず理解できたのは以下の二つのアルゴリズムを組み合わせて使う手法だということ。
- ゼロ・クロス法(ゼロ交差法)
- エッジの勾配
「ゼロ・クロス法(ゼロ交差法)」にしても「エッジの勾配」にしても、何度読んでもよく分からんす。
ゼロ・クロス法については、他の画像処理本の「実践画像処理入門」と「C言語で学ぶ実践画像処理
」にも書いてありますが、やっぱりよく分からんす。
ゼロ・クロス法は2次微分がどうのこうの書いてあります。
エッジの勾配は勾配から近傍8画素のうちいずれか一つを取得するとか書いてあります。
何となーく朧気ながら分かったのは以下のようなこと。
ゼロ・クロス法は濃度が急激に変化する地点を取得する方法だということ。
エッジの勾配は、そのゼロ・クロス法で得られた地点が本当にエッジかどうか精査する方法だということ。
でもそれ以上はよく分からん、分からんから本に書いてあるサンプルコードを AS に翻訳することもできない。 もうキャニー法のマスターは諦めよ、と二値化について調べ始めたんです。
二値化についていろいろやっているうちに気づきました。
ゼロ・クロス法による急激な濃度変化の取得って、二値化処理で代替できるんじゃないだろうか、と。
人間の眼で、カラー画像もしくは256段階モノクロ画像を見たとき、そのエッジは判別しづらい。 でも画像の全ピクセルを白と黒の2色に置き換えた二値化画像だったらどうだ。人間の眼でもエッジが簡単に判別できるじゃないの。 白と黒が隣り合っているところがエッジであることはもう疑いないことです。
この白と黒の境界線部分を線にして、それ以外の部分を線とは違う色にすればキャニー・エッジ検出と同じ効果が得られるよね?
前に調べたエッジ検出のうち、ラプラシアンは2次微分によるものだということでした。
だったら二値化した BitmapData にラプラシアンマトリクスによる ConvolutionFilter を適用すると、もしかして求めるものが得られるのでは?
試してみたところ、見事できましたよ。1ピクセル幅のエッジを取得できました。
ゼロ・クロス法やエッジの勾配はけっこう複雑な計算を要求するようなんですが、これなら BitmapData.Threshold と ConvolutionFilter だけで実行できるから処理もはるかに軽いことでしょう。
結果オーライ。もうこれでキャニー・エッジ検出をマスターしたことに勝手に認定しちゃうさ。
サンプル→は上から原画、二値化処理で得られた画像、それにラプラシアンの ConvolutionFilter を適用した結果の画像です。 一番下のスライダーで、二値化の閾値を変えることができます。 閾値を変えることで下のエッジも変化する様をご覧ください。