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で求まるという訳。
数式わからない人もこれならどうでしょうか。