princeton.log

Princeton 大学の Department of Computer Science に一年留学する日本人が、学んだことや感じたことを綴ります。

プリンストンの授業② Computer Vision の続き

こんにちは。こちらでは、半袖でも過ごせる日と上着を重ね着してもまだ寒い日が交互に訪れていて、季節の移り変わりを感じます。10月の頭でこの気温だったら、真冬にはどうなってしまうんだろうか・・・

さて、前回はこのような画像から
f:id:liwii:20191001115652j:plain
このようなエッジ画像を取り出しました。
f:id:liwii:20191001125246j:plain
この画像を、

  • もっと線が細く
  • ノイズを除いたものに

変えよう、というのが今回のお話です。  前回、画像の各点について周りの点との色の違いのベクトルを取り出しました。このベクトルは、自分と最も色の違う点が存在する向き、つまり画像上のエッジに垂直な向きを持っているはずです。
f:id:liwii:20191008040834j:plain
ということは、この向きに沿って一番値が大きい部分だけを残し、残りの部分を削除すればいい感じでエッジを細くできそうです。これをNon-Maximum Suppressionと言います。
この処理をすると、例えば
f:id:liwii:20191008041532j:plain
こういう画像にこの処理を施すと、真ん中の2つの明るさのピークのみが残り、残りの部分が全て黒く塗りつぶされることになります。 f:id:liwii:20191008041536j:plain
先ほどの図形の画像にNon-Maximum Suppression を施すと、以下のような画像が得られます。
f:id:liwii:20191008042024j:plain
うまく線が細くなっているのがわかりますね。
あとは、画像に残ったノイズを除きましょう。これには閾値処理(Thresholding といいます)が有効です。一定以上の大きさを持たないエッジを全て削除し、残った部分をこの画像のエッジと判断すればいいのです。
しかし、単純な閾値処理には問題があります。例えば、下のような画像から
f:id:liwii:20191008045841j:plain
今まで説明してきた操作で、以下のような画像が得られたとしましょう。
f:id:liwii:20191008045835j:plain
この画像に対して、あまりにも低い閾値を設定すると、茂みの部分などからあまりにも多くの線がエッジとして検出されてしまいます。
f:id:liwii:20191008045830j:plain
逆に、閾値を高くしすぎると、このように真ん中の橋のような部分の線が途切れ途切れになってしまいます。 f:id:liwii:20191008045842j:plain
これは、一本の線の中にも、周りとの色の差が大きい部分と小さい部分があることから起きる現象です。しかし、一本の線が途切れ途切れで検出されるのはあまり良くない気がします。点単位ではなく、線単位でエッジを画像に残すかどうかを判断した方が良さそうです。
そのために、ここでは単純な Thresholding ではなく Hysterisis Thresholding という方法を使います。
Hysterisis Thresholding では、tH, tL という2種類の閾値を用います。先ほどのNon-Max Suppressionで残った各線に沿って各点の値を調べ、

  • tH以上の値を持つ点を画像に残します。
  • すでに画像に残っている点と繋がっているtH以上の点があれば、その点も画像に残します。

例えば、線A, Bに沿って各点の値を調べた結果が以下のグラフのようになっているとすると、(縦軸が各点の値の大きさです)線Aは全体が画像の中に残るのに対し、線Bは全て画像から消えることになります。   f:id:liwii:20191008055234j:plain   こうすることによって、弱いエッジを画像から消しながら、強いエッジを途切れ途切れにせずに画像から残すことができます。
先ほどの木の画像にHysterisis Thresholding を適用した結果がこちらです。細かい模様は消えているものの、各線は比較的繋がっていることが見られます。
f:id:liwii:20191008045833j:plain
最後にHysterisys Thresholding を先ほどの図形の画像に適用すると、ノイズがほとんど消えたエッジ画像を手に入れることができました。
f:id:liwii:20191008042952j:plain

これでCanny Edge Detection の話はおしまいです。実際には閾値ガウス分布の幅といったパラメーターを決めるのが難しく、綺麗に一発でエッジ画像が取れなかったりするのですが、うまく設定できると綺麗にエッジのみの画像を得ることができます。

初めて授業の内容を詳細に書いてみたんですが、予想以上に大変でしたし、文章で伝えるのは難しいですね・・・次回からは、授業の話をするときも「授業ではこんなことをやってます→詳細はこのページで見てね」みたいなフォーマットにするかもしれません。

次回はもうちょっとカジュアルな話をします。それでは。