二千三百五十五年

"Making peace to build our future, Strong, united, working 'till we fall."

修身論文: Canny法の改良【2024-01-30】

読んだ論文の備忘録です。進捗があったときに更新されます。

出典

L. Xuan and Z. Hong, "An improved canny edge detection algorithm," 2017 8th IEEE International Conference on Software Engineering and Service Science (ICSESS), Beijing, China, 2017, pp. 275-278, doi: 10.1109/ICSESS.2017.8342913.

概要

古典的かつ幅広く利用されている輪郭抽出アルゴリズムのCanny法(Canny Edge Detector)を改良する提案。ノイズへのロバスト性が強化されているほか、一部のパラメータを適応的に決定する手法を構築している。

応用上の意義

深層学習華やかなりし現代においても、SN比が良好で、計算も軽く、明瞭な輪郭線がアルゴリズム的に(≒説明可能性のある方法で)得られるCanny法は幅広い分野の画像処理で利用されている信頼性の高い輪郭抽出手法であり、その簡単さを維持しながら性能を改善できる提案には大きな意義がある。被引用数もでかいし。

先行研究との比較

論文本体自体の短さもあってあまり明瞭には書かれていなかったが、画像に対して適応的なパラメータ設定を行った例や、他のCanny法改良の試みなどが例示されていた。この論文の直接の先行研究はCanny法を提案した1986年のJ. Cannyによるそれということになるだろうが、そこと現代の間をつなぐ流れの中にこの論文も位置しているということが説明したかったのだろう。

ポイント

この論文の提案を議論する前に、まずCanny法について明らかにする必要がある。これは上述の通り画像処理の分野で用いられる輪郭検出法の一つで、主に5つのプロセスによって構成される。

  1. ガウシアンフィルタによるデノイズ
  2. 微分フィルタによる輪郭の強度・角度の計算
  3. 非極大値抑制による輪郭線の明確化
  4. 二重閾値による輪郭候補点のふるい分け
  5. 輪郭候補点の接続、輪郭形成の完了

今回の被験者

それでは、実際に画像を処理していく形で順にCanny法のプロセスを見ていこう。

0. グレイスケール化

脱色

Canny法による輪郭抽出はRGBの3パラメータを処理するものではない。まずは画像を白黒にする。

1. ガウシアンフィルタによるデノイズ

カーネルが5×5、標準偏差1のガウス関数によってデノイズしたもの。ぼや~

次いで前処理として、ガウシアンフィルタによるデノイズが行われる。 単にガウシアンフィルタの計算量が小さく扱いやすい平滑化手法であるというのはもちろんのことだが、J. Cannyは、変分法によってガウス関数が輪郭抽出という目的にかなう関数だと発見し、ガウス関数を利用することにしたらしい。一体どういう計算が行われた……のかは文献をのちに漁りたい。

2. 微分フィルタによる輪郭の強度・角度の計算

ソーベルフィルタによって計算された輪郭強度の分布。それっぽくなってきた

画像について、ソーベルフィルタのような畳み込み演算子を用いることで、画像中の輪郭の強度(intensity)と角度を計算することができる。ソーベルフィルタを用いた場合の、画像Aからのもろもろの計算について雑に畳み込みの式を書いてみよう。

 \displaystyle
G_x=\begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \\
\end{bmatrix}*A

   

 \displaystyle
G_y = \begin{bmatrix} 1 & 2 & 1 \\ 0 & 0 & 0 \\ -1 & -2 & -1 \\ \end{bmatrix}*A

   

 \displaystyle
G_{int} = \sqrt{G_x^2+G_y^2}

   

 \displaystyle
G_{arg} = atan2(G_y, G_x)

ここでatan2は二つの因数をとるarctanの関数。 \theta = atan2(sin\theta, cos\theta) となる。 このようにしてフィルタを用いて輪郭の強度と角度が計算できた。実際に式を追えば、強度が画像中の明度の勾配の急さに、角度が明度の勾配の方向に対応していることがわかると思う。たしかにわかるなあ。角度については、関数の定義上は360度に連続的に分布させられるものであれど、実際の計算上は、縦・横・斜め×2の4パターンにまで角度を丸めることになる。

3. 非極大値抑制による輪郭線の明確化

輪郭線が細く、シャープになっている!

非極大値抑制(non-maximum suprression)によって、輪郭線を細くする。

これは具体的にはどういうプロセスだろうか?ここがCanny法の一番面白いところなのでついてきてほしい。

いま、2の計算によって、縦方向の輪郭線の一部だと(言い換えれば、横方向に明度変化の勾配が存在していると)計算されたピクセルがあるとしよう。そのピクセルの輪郭強度 G_{int} の値と、そのピクセルの一つ右、一つ左(つまり、横方向であり、輪郭の垂線方向)のピクセルと輪郭強度を比べて、値が最大だったときのみ、そのピクセルが輪郭線上に載っているとみなす。そうでなければ抑制する( G_{int}=0 だとみなす。)

このようなプロセスを繰り返すことにより、輪郭の強度が輪郭の垂線方向に対して単峰性の分布を示すならば、輪郭線上に乗っているピクセルは峰の頂点の一つに限定される、つまり輪郭線を限界まで、1ピクセルの太さまで細く圧縮することができるのだ。横方向、斜め方向の場合も同様に輪郭線の垂線方向にあるピクセルと値を比べ、非極大値抑制をかければ、おのずと極大値のみが残る。

4. 二重閾値による輪郭候補点のふるい分け

 TH_h = 100, TH_l = 40 とし、二重閾値によって選別

経験的に決定された二重の閾値 TH_h, TH_l, (TH_l \lt TH_h) により、 G_{int} の値に応じて、上述のプロセスを生き残った輪郭候補点を強い点 (G_{int}>TH_h) 、弱い点 (TH_h>G_{int}>TH_l) 、抑制して無視する点 (G_{int} \lt TH_l) の3種類に分類する。

適切な閾値は画像の性質や求める輪郭によって変わりうるので、ここは経験的に決定するほかない。具体的な手法としてはGSD: 大学院生降下法などがあると思う。

良いも悪いもパラメータ次第

5. 輪郭候補点の接続、輪郭形成の完了

以上のプロセスを通じて抽出された二種類の点をもとに、最終的な輪郭を形成する。

まず、強い点は無条件に輪郭の一部だとみなす。

問題になるのは弱い点の扱いだ。これについては、縦横斜めの近傍8ピクセルに強い点が存在したらば、その弱い点も強い点から繋がっている輪郭の一部とみなすということにする。また、これによって輪郭だとみなされた点も強い点だとする。そのため、再帰的に接続の検証を繰り返せば、やがて強い点につながっている弱い点すべてが輪郭だとみなされることになる。

出来た!

場合によっては輪郭の長さに応じて短すぎるものを消したりもするらしいが、とにかくこうして抽出された点の集合が所定の輪郭線ということになる。これで輪郭抽出は完了だ。やったね。そして君もCanny法による輪郭抽出のアルゴリズムをこれ以上ないくらい正確に理解したと期待されるわけだ。すごいねえ。

話を戻そう。

この論文で提案された方法では、Canny法のアルゴリズムを部分的に改変している。

1b. メディアンフィルタによるデノイズ

5×5のメディアンフィルタでデノイズするとこんな感じ。べた~

論文中では、ガウシアンフィルタに代わってメディアンフィルタをデノイズに用いることを提案している。これならば、ノイズも含めてなめらかにするガウシアンフィルタと違って、ノイズを中央値で塗りつぶせるので、画像のSN比が十分によければノイズ自体を無視できるというわけだ。

2b. 適応的な二重閾値の決定

微分フィルタによる輪郭強度・角度の計算と非極大値抑制はCanny法のままに行なうが、論文中では、二重の閾値を適応的に(adaptive)、つまり画像の性質に対応して自動的に決定する方法を提案している。その手法というのが中々面白い。

ここではヒストグラムを利用する。非極大値抑制を終えた後の画像中の輪郭強度 G_{int} の分布をヒストグラムにまとめる(恐るべきことに論文中ではそのヒストグラムの階級値の幅について何も言及されていなかったが、ここでは慣例に従って1ずつにビンを区切ることとする)。このとき、強度 i に対応するヒストグラムの度数を H(i) と表すことにしよう。ここで我々は、高い閾値 TH_h の値を、 H(i+1)-H(i)=0 を与える最小の強度 i 、つまり、隣り合う二つの階級の度数が同じになる最初の階級値で与えることにする。低い閾値については TH_l=0.4*TH_h とする。

画像の場合についてもヒストグラムを作ってそのような値を計算すると、 TH_h=89  TH_l=35.6 となった。なかなかうまい具合に行くものだ。

このようにして適応的に閾値を決定した後も、極端に短い輪郭線をノイズとして排除するためにいくつかの計算を行ったりするのだが、紹介が面倒になったのでここで輪郭抽出を終えることにする。

このようにして、提案手法によって得られた輪郭線を従来のCanny法によるものと比べてみよう。

……なんか変わった?

実証手法

実際に画像からCanny法と提案手法で輪郭抽出を行い、その出力結果について定性的に議論する方式で評価が為されている。まあこの手の性能を定量的指標で評価するのは無理筋だしな。論文だと、Canny法が拾いがちな背景ノイズなんかが結構綺麗に落ちているのが観察できる。たぶん短い輪郭線を落とす処理を面倒くさがって実装しなかったのが上の比較には効いているんだと思う。

批判

ヒストグラムによる閾値の決定は新鮮な発想だけれど、少々乱暴ではないだろうか。実際いくつかの画像で試してみたらだいたいうまくいったので、読者諸君が想定している以上にこの手法は巧妙なもののようだけれども(おそらく、輪郭強度の分布の極値を抽出することを狙っているのだろう)、二つの批判がありうると思う。

まず、この方法は画像のサイズに対して中立でない。画素数が増えれば増えるほど輪郭線も長くなり、非極大値抑制を生き残るピクセルの数も多くなって、ヒストグラムはより多くの要素から構成されることになる。しかしそのように要素が増えれば、隣り合う階級値が偶然横並びに一致する可能性はどんどん低くなるだろう。逆に画素数が極端に小さければ、求める TH_h が小さくなりすぎてしまう可能性もある。

次いで、この手法は一貫性に欠ける。確かに適応的ではあるが、わずかなピクセルの変動によって、求める閾値の値は10程度簡単に変わりうる。輪郭を検出したい画像が1枚や2枚ならこの特性はさほど問題にならないだろうが、何十枚と画像が続く動画から一貫性のある輪郭検出を行いたい場合には問題になってくるだろう。輪郭強度の分布を利用するという発想自体はよくあるが、ほかの論文では、比較的にゆらぎにくいはずの中央値や第一四分位数なんかを利用する例が多いみたいだし。

感想

Canny法について知りたかったので勉強ついでに読んだ論文。論文自体は4ページと短くシンプルだったので理解もやさしく、説明に使う画像を工作するためのPython環境構築の方が難しかった。

ところで、Canny法でガウシアンフィルタが用いられているのは変分法によって最適な関数がそれと定められたから(?)であるらしく、この辺の理屈が全くもってわからんので、J. Cannyの元論文もいつか漁りたい。

このような輪郭検出はだいたい家とか機械とか虫みたいな自然物の画像をもとにして実験するのがふつうなのだが、今回はnijijourneyによって生成されたいわゆる「AI絵」を用いた(新規性かも!?)。これはおれの画像フォルダにあるうちで権利フリーなのがたまたまこれだったというほかにも、潜在拡散モデルの仕組み上必然的に生まれるノイズ状の色のばらつきや、二次絵的な「線」が輪郭検出に与える影響を見たかったという動機がある。実際のところ、ノイズはほとんどフィルタリングによって潰し切れたようだ。

拡大してみると結構ノイジーなAI絵