【積分画像とは】計算方法と高速化の仕組み

積分画像とは?計算方法と高速化の仕組みについてまとめました。

積分画像とは

積分画像(Integral Image)は、注目画素とその左と上にある全ての画素値の和を求めた物です。

例えば、入力画像IIが与えられた場合
I=[I(0,0)I(1,0)I(2,0)I(0,1)I(1,1)I(2,1)I(0,2)I(1,2)I(2,2)] I= \left[ \begin{array}{ccc} I(0,0) & I(1,0) & I(2,0) \\ I(0,1) & I(1,1) & I(2,1) \\ I(0,2) & I(1,2) & I(2,2) \\ \end{array} \right]

積分画像II’の画素値は次のように計算します。

I=[I(0,0)I(1,0)I(2,0)I(0,1)I(1,1)I(2,1)I(0,2)I(1,2)I(2,2)] I’= \left[ \begin{array}{ccc} I'(0,0) & I'(1,0) & I'(2,0) \\ I'(0,1) & I'(1,1) & I'(2,1) \\ I'(0,2) & I'(1,2) & I'(2,2) \\ \end{array} \right]

I(0,0)=I(0,0)I(1,0)=I(0,0)+I(1,0)I(2,0)=I(0,0)+I(1,0)+I(2,0)I(0,1)=I(0,0)+I(1,0)I(1,1)=I(0,0)+I(1,0)+I(0,1)+I(1,1)I(2,1)=I(0,0)+I(1,0)+I(0,1)+I(1,1)+I(2,0)+I(2,1)I(0,2)=I(0,0)+I(0,1)+I(0,2)I(1,2)=I(0,0)+I(0,1)+I(0,1)+I(1,0)+I(1,1)+I(1,2)I(2,2)=I(0,0)+I(0,1)+I(0,1)+I(1,0)+I(1,1)+I(1,2)+I(2,0)+I(2,1)+I(2,2) \begin{aligned} I'(0,0) &= I(0,0)\\ I'(1,0) &= I(0,0) + I(1,0)\\ I'(2,0) &= I(0,0) + I(1,0) + I(2,0)\\ I'(0,1) &= I(0,0) + I(1,0)\\ I'(1,1) &= I(0,0) + I(1,0) + I(0,1) + I(1,1)\\ I'(2,1) &= I(0,0) + I(1,0) + I(0,1) + I(1,1) + I(2,0) + I(2,1)\\ I'(0,2) &= I(0,0) + I(0,1) + I(0,2)\\ I'(1,2) &= I(0,0) + I(0,1) + I(0,1) + I(1,0) + I(1,1) + I(1,2)\\ I'(2,2) &= I(0,0) + I(0,1) + I(0,1) + I(1,0) + I(1,1) + I(1,2) + I(2,0) + I(2,1) + I(2,2) \end{aligned}

積分画像による高速化の仕組み

積分画像は近傍画素の処理の高速化によく使われます。

例えば、注目画素と8近傍の計9画素の画素値の総和を求めたいとします。
普通に計算すると、「画素値の取り出し9回」「加算8回」を行う必要があります。

ところが、あらかじめ積分画像を作っておけば、「画素値の取り出し4回」「加算1回+減算2回」で済ませることができます。
例として、赤色領域(注目画素+8近傍の画素)にある画素値の総和SSを求めることを考えてみましょう。

SSは以下の式で計算できます。

S=S1S2S3+S4 S=S_1-S_2-S_3+S_4

S1S_1からS2S_2S3S_3を引き、引きすぎた分S4S_4を加算しています。
ここで、S1,S2,S3,S4S_1, S_2, S_3, S_4は積分画像の画素値に等しくなります。

■積分画像II’

S1=I(3,3)S2=I(0,3)S3=I(3,0)S4=I(0,0)S_1=I'(3,3)\\ S_2=I'(0,3)\\ S_3=I'(3,0)\\ S_4=I'(0,0)

よって、積分画像を先に作成しておけば、少ない計算回数(加算1回+減算2回)画素へのアクセス回数(4回)で画素値の総和を計算できます。
それにより計算時間を大幅に抑えることができます。
近傍画素の個数が多くなったり、繰り返し回数が増えるほど、高速化の効果も大きくなります。

積分画像を使った高速化は、畳み込み演算特徴量の計算などでよく利用されている重要なアルゴリズムです。

積分画像の計算式

入力画像IIとその積分画像II’があるとします。
このとき、左上座標(x,y)(x, y)、幅ww, 高さhhの矩形領域内にある画素値の総和SSは次式で計算できます。

S=I(x+w,y+h)I(x,y+h)I(x+w,y)+I(x,y) S=I'(x+w,y+h)-I'(x,y+h)-I'(x+w, y)+I'(x,y)

関連ページ

【Python/OpenCV】積分画像を用いた処理の高速化
Python版OpenCVで積分画像を作成する方法をソースコード付きで解説します。
【画像処理超入門】アルゴリズムの仕組みと実装方法を簡単に解説
画像処理超アルゴリズムの仕組みとプログラミングによる実装方法を簡単に解説します。
この記事を書いた人
西住技研

在学中はシステム制御理論や画像処理、機械学習を専攻分野として研究していました。就職後は、プログラミング(Python)を活用したデータ分析や作業自動化に取り組み、現在に至ります。そこで得たノウハウをブログで発信しています。
YoutubeX(旧Twitter)でも情報発信中です

西住技研をフォローする
画像処理

コメント