Integral Image

1 개요

적분합 이미지를 계산하는 알고리즘으로, 이미지의 특정 영역에 대한 누적값을 효율적으로 계산합니다.

2 알고리즘 상세 설명

결과 이미지 크기

ROI(Region of Interest)는 직사각형(Rect)만 지원하며, 결과 이미지는 ROI의 크기에 가로와 세로 각각 1씩 더해진 크기로 출력됩니다.

지원 자료형

결과 이미지는 6개의 자료형을 지원하며, 이미지의 크기 및 값에 따라 적분합의 결과가 자료형의 표현 범위를 초과하는 경우 오버플로우가 발생할 수 있으므로 적절한 자료형을 사용자가 선택해야 합니다.
결과 값의 범위에 따라 아래 자료형을 선택합니다.

Direction (적분 방향)

Direction 파라미터에 따라 적분 방향을 설정합니다.

Calculate Option

각 적분합에는 Weights(가중치) Parameter가 존재하며, 기본값은 모두 1입니다.
아래는 각 적분합 옵션의 수식에 대해 설명합니다. Direction은 XY로 설정되었다고 가정합니다.
총 네 가지 계산 옵션을 지원합니다:

  1. Sum : 원본 픽셀 값의 누적합.

IDst(x,y)=i=0x1j=0y1(aISrc(i,j))I_{Dst}(x,y) = \sum_{i=0}^{x-1} \sum_{j=0}^{y-1}(a\cdot I_{Src}(i,j))

  1. Square Sum: 원본 픽셀 값의 제곱에 대한 누적합.

IDst(x,y)=i=0x1j=0y1(aISrc(i,j)2)I_{Dst}(x,y) = \sum_{i=0}^{x-1} \sum_{j=0}^{y-1}(a\cdot I_{Src}(i,j)^2)

IDst(x,y)=i=0x1j=0y1(aISrc(i,j)2+bISrc(i,j))I_{Dst}(x,y) = \sum_{i=0}^{x-1} \sum_{j=0}^{y-1}(a\cdot I_{Src}(i,j)^2 + b\cdot I_{Src}(i,j))

IDst(x,y)=i=0x1j=0y1(aISrc(i,j)2+bISrc(i,j)+c)I_{Dst}(x,y) = \sum_{i=0}^{x-1} \sum_{j=0}^{y-1}(a\cdot I_{Src}(i,j)^2 + b\cdot I_{Src}(i,j) + c)

동작 예시

Source Image Result Image
Source Result
Source Value Result Value
Source Result
Fig. Integral Image 동작 예시

원본 이미지는 Uint8 타입의 단일 채널 이미지이며, 결과 이미지는 XY 방향으로 누적합을 계산한 Float32 타입의 이미지입니다.
좌상단에서 우하단으로 갈수록 값이 누적되며 밝아지는 것을 확인할 수 있습니다.

3 예제

CIntegral integral;

CFLImage fliSourceImage;
integral.SetSourceImage(fliSourceImage);

CFLImage fliDestinationImage;
integral.SetDestinationImage(fliDestinationImage);

integral.SetCalculationMode(CIntegral::ECalculationMode_Sum);
integral.SetDirection(CIntegral::EDirection_XY);
integral.SetDataType(CIntegral::EDataType_Float32);
integral.Execute();
CIntegral integral = new CIntegral();

CFLImage fliSourceImage = new CFLImage();
integral.SetSourceImage(ref fliSourceImage);

CFLImage fliDestinationImage = new CFLImage();
integral.SetDestinationImage(ref fliDestinationImage);

integral.SetCalculationMode(CIntegral.ECalculationMode.Sum);
integral.SetDirection(CIntegral.EDirection.XY);
integral.SetDataType(CIntegral.EDataType.Float32);
integral.Execute();