princeton.log

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

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

先日朝起きて部屋を出ると、キツネが目の前に突っ立っていてびっくりしました。中型犬くらいのサイズがあるのでリスと違ってちょっと怖かったです。リスとか食べてるんですかね・・・
f:id:liwii:20191001125746j:plain

余談はこれくらいにして、今回は授業でやっていることについて触れたいと思います。
今日紹介する授業は COS 432 Computer Vision です。

コンピュータビジョン(computer vision)はコンピュータがデジタルな画像、または動画をいかによく理解できるか、ということを扱う研究分野

です。*1
この授業も、画像を処理していかに情報を取り出すか、ということを単純な形状検出からディープラーニングなどを用いた意味認識まで幅広く扱う授業になっています。
週2回の授業 + 2週に1回提出のPythonによる実装課題という構成で授業は進んでおり、今週にも1つ宿題の提出期限が迫っています。そんなわけで、今日は課題の一つの Canny Edge Detector について説明したいと思います。(コンピュータービジョンの分野においてはかなり基本的なものなので知っている人も多いかもしれませんが・・・)
Canny Edge Detector は、画像からエッジ検出を行う仕組みの一つです。平たくいうと、画像の中にある「線」を検出するということですね。 f:id:liwii:20191001112906j:plain
こういう画像を
f:id:liwii:20191001112933j:plain
こういう風にしたい、ということです。
そもそも画像の中の「線」とはなんでしょうか?ここでは、「隣の点とのい色の違いが大きい点が並んでいる部分」と考えましょう。そうすると、隣の点との色の違いが大きい点を全て取ってくれば線が検出できるような気がします。
しかし、ここに一つ問題があります。画像には、様々な要因によって以下の白い点のようなノイズが入ります。
f:id:liwii:20191001115652j:plain この画像を単純に処理すると、白いノイズもエッジとして検出されてしまいます。
f:id:liwii:20191001115649j:plain
これを防ぐにはどうすればいいのでしょうか?一点だけ目立っている点を除くには、周りの点との平均を取って画像の中の色の差を滑らかにしてあげれば良さそうです。実際には、実際には、ガウス分布による重み付き平均を用いて画像を平滑化します。
先ほどのノイズが入った画像にこの処理を施すと、
f:id:liwii:20191001121621j:plain
このように、ノイズが目立たなくなっているのがわかります。
この後に、隣の画素との色の差を横方向、縦方向に取ってあげると以下のような画像がとれます(実際にはもうちょっとだけ複雑な処理をしていますが、ここでは割愛します)。
f:id:liwii:20191001123535j:plainf:id:liwii:20191001123537j:plain
いい感じで画像の線がとれてそうな感じがしますね。
それぞれの点について、先ほど取ったx方向、y方向の差をdx, dyとすると、ベクトルf:id:liwii:20191001124430g:plainがその点の周りの色の勾配を表すことになります。よって、f:id:liwii:20191001124435g:plainでその点の周りの点との差の大きさが、f:id:liwii:20191001124439g:plainで勾配の向きが取れることになります。 *2
それぞれの点について、勾配の大きさを表した画像は下のようになります。
f:id:liwii:20191001125246j:plain
なかなかいい感じにとれていますが、線が太すぎるのでもうちょっと細くしたいですね。また、ノイズがまだ残っているのも気になります。 ちょっと時間がなくなってきたので、今回はこの辺で終わりにして残りの説明は次回に回します。また来週〜

*1:https://ja.wikipedia.org/wiki/コンピュータビジョン

*2:dx = 0の時は別で処理する必要がありますが、Pythonのmathモジュールにあるatan2という関数がよしなにやってくれます。