integral imageについて調べた

integral imageというアルゴリズムがあるのを昨日知って、いまいち仕組みが分からなかったので色々調べてみた。

これを使うと、画像のある領域の明るさを求める事が出来る。
一応理解もかねて頭の中にあることを書いてるので、間違ってたらすいません。

のABCDという所の明るさを求めたいとすると、この方法の場合は0D+0A-0B-0Cで明るさが出ると考える。
つまり、各点までの明るさの総和が出ていれば、ABCDの中を一つ一つ足さなくても明るさが求まる。
で、その為に、一旦0Dの四角形の各点の明るさを元に計算をしておく。

明るさを求めたい領域が分かってて、かつ1回だけしか必要じゃない場合はintegral imageを使う必要はなくて、元々顔認識とかに使われているらしんですけど、何度もいろんな領域の明るさを求めようとすると、領域の中を毎回足しまくってると遅すぎるので、先に明るさマップみたいなのを作っておくという事です。多分。

で、その明るさマップを作る方法についての説明。

まず、こういう領域であるとする。数字は各領域の明るさ。

でこの時にこの4つの領域の明るさの和(つまり、x,yまでの明るさの和)を求める時に

(x,yの明るさ)+(x-1,yの明るさの総和)+(x,y-1の明るさの総和)-(x-1,y-1の明るさの総和)

とうい式を立てる。最後のx-1,y-1の明るさの総和を引くので、ちょうどよくx,yの明るさの総和になる。


ちなみに枠の外は明るさ0で計算する。

で、これを囲われた枠に対してがーと求めていく。
図にするのめんどくさいので、
Computer Vision – The Integral Image « Computer Science: Source の Bigger Example っていう所が下の方にあるので見て下さい。

こういう風に明るさマップを作っていくと、ある領域の右下の値は必ずその領域の明るさの総和になる。

ので、これを使って最初の

に戻って最初に明るさマップを作っておけばABCDの明るさの総和は0D+0A-0B-0Cで求まるという訳。

数式わからない人もこれならどうでしょうか。