メインコンテンツ

integralImage

2 次元積分イメージの計算

説明

"積分イメージ" の各ピクセルは、対応する入力ピクセルとその入力ピクセルの上側および左側のすべてのピクセルの累積和を表します。

積分イメージを使用すると、イメージの部分領域の総和を高速に計算できます。部分領域の総和は、部分領域のサイズに関係なく、積分イメージ内の 4 つのピクセルのみの線形結合として定数時間で計算できます。積分イメージの使用は Viola-Jones アルゴリズムによって一般に普及しました[1]

J = integralImage(I) はイメージ I から積分イメージを計算します。この関数は、出力の積分イメージ J の上側と左側にゼロをパディングします。

J = integralImage(I,orientation) は、orientation で指定された方向の積分イメージを計算します。

すべて折りたたむ

簡単なサンプル行列を作成します。

I = magic(5)
I = 5×5

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

サンプル行列の積分イメージを計算します。以下の手順は、元の行列の最初のいくつかの値が積分イメージの値にどのようにマッピングされるかを示すものです。元のイメージにある (行, 列) 座標が (r, c) のピクセルは、積分イメージの座標 (r+1, c+1) のピクセルに対応することに注意してください。

  • 積分イメージの最初の行と列はすべて 0 です。

  • 元の行列の座標 (1, 1) にある、値が 17 のピクセルは、和の中に他のピクセルがないため積分イメージ内で変化しません。そのため、積分イメージの座標 (2, 2) のピクセルは値が 17 になります。

  • 元の行列の座標 (1, 2) のピクセルは積分イメージのピクセル (2, 3) にマッピングされます。その値は、元のピクセル値 (24)、その上側のピクセル (0)、左側のピクセル (17) の総和であり、次のようになります。24 + 17 + 0 = 41.

  • 元の行列の座標 (1, 3) のピクセルは積分イメージのピクセル (2, 4) にマッピングされます。その値は、元のピクセル値 (1)、その上側のピクセル (0)、左側のピクセル (既に合計済みで 41) の総和です。したがって、積分イメージのピクセル (2, 4) の値は 1 + 41 + 0 = 42 になります。

J = integralImage(I)
J = 6×6

     0     0     0     0     0     0
     0    17    41    42    50    65
     0    40    69    77    99   130
     0    44    79   100   142   195
     0    54   101   141   204   260
     0    65   130   195   260   325

グレースケール イメージをワークスペースに読み取ります。イメージを表示します。

I = imread('pout.tif');
imshow(I)

積分イメージを計算します。

J = integralImage(I);

drawrectangle ツールを使用して四角形の部分領域を選択します。ツールは Rectangle オブジェクトを返します。

d = drawrectangle;

Rectangle オブジェクトの Vertices プロパティは、4 行 2 列の行列として頂点の座標を格納します。頂点は、左上から開始して時計回りの方向に続く順番で並べられます。行座標と列座標を含む 2 つのベクトルに行列を分割します。積分イメージは上側と左側でゼロ パディングされているため、行座標と列座標を 1 増やして積分配列の対応要素を取得します。

r = floor(d.Vertices(:,2)) + 1;
c = floor(d.Vertices(:,1)) + 1;

積分イメージの 4 つのピクセルを結合することにより、四角形の部分領域にあるすべてのピクセルの和を計算します。

regionSum = J(r(1),c(1)) - J(r(2),c(2)) + J(r(3),c(3)) - J(r(4),c(4))
regionSum = 613092

簡単なサンプル行列を作成します。

I = magic(5)
I = 5×5

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

回転した方向の積分イメージを作成します。

J = integralImage(I,'rotated')
J = 6×7

     0     0     0     0     0     0     0
     0    17    24     1     8    15     0
    17    64    47    40    38    39    15
    64    74    91   104   105    76    39
    74   105   149   188   183   130    76
   105   170   232   272   236   195   130

回転した四角形の部分領域を定義します。この例では、元のイメージの座標 (1,3) に上側の隅がある部分領域を指定します。部分領域の回転した高さは 1 で幅は 2 です。

r = 1;
c = 3;
h = 1;
w = 2;

積分イメージ内の部分領域の 4 つの隅にあるピクセルの値を取得します。

regionBottom = J(r+w+h,c-h+w+1);
regionTop = J(r,c+1);
regionLeft = J(r+h,c-h+1);
regionRight = J(r+w,c+w+1);
regionCorners = [regionBottom regionTop regionLeft regionRight]
regionCorners = 1×4

   105     0    24    39

4 つの隅のピクセル値を合計することにより、部分領域のピクセルの和を計算します。

regionSum = regionBottom + regionTop - regionLeft - regionRight
regionSum = 
42

入力引数

すべて折りたたむ

イメージは、任意の次元の数値配列として指定します。RGB イメージなど、入力イメージが 2 次元を超える場合 (ndims(I)>2)、integralImage は高次元のすべての 2 次元平面に対する積分イメージを計算します。

データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32

イメージの方向。"upright" または "rotated" として指定します。方向を "rotated" に設定すると、integralImage は 45 度回転した四角形の和を計算する積分イメージを返します。

データ型: char | string

出力引数

すべて折りたたむ

積分イメージ。数値行列として返されます。この関数は、イメージの orientation に従って積分イメージをゼロ パディングします。こうしたサイズ設定により、イメージ境界でピクセル和の計算が容易になります。積分イメージ J は、基本的に cumsum(cumsum(I,2)) の値をパディングしたものです。

イメージの方向積分イメージのサイズ
垂直の積分イメージ上側と左側のゼロ パディング。size(J) = size(I)+1
回転した積分イメージ上側、左側、右側のゼロ パディング。size(J) = size(I)+[1 2]

データ型: double

アルゴリズム

すべて折りたたむ

参照

[1] Viola, P., and M. J. Jones. "Rapid Object Detection using a Boosted Cascade of Simple Features". Proceedings of the 2001 IEEE Computer Society Conference on Computer Vision and Pattern Recognition. 2001. Vol. 1, pp. 511–518.

[2] Lienhart, R., and J. Maydt. "An Extended Set of Haar-like Features for Rapid Object Detection". Proceedings of the 2002 IEEE International Conference on Image Processing. Sept. 2002. Vol. 1, pp. 900–903.

拡張機能

すべて展開する

バージョン履歴

R2015b で導入

すべて展開する