Census Transform

1 개요

이미지의 Census 변환을 연산하는 알고리즘입니다.

2 알고리즘 상세 설명

Census transform은 픽셀 간의 값을 비교하여 값을 설정하는 알고리즘입니다.

먼저 설정하려는 픽셀을 기준으로 Kernel의 범위에 있는 픽셀을 해당 픽셀의 값과 비교합니다. 비교한 결과 중 크거나 같은 경우에는 '1', 작은 경우에는 '0'을 설정하여 순서대로 나열을 하여 해당 픽셀의 값을 설정합니다.

Source Image
Fig. 3x3 Kernel 일반 동작 방식 설명

이미지의 둘레의 경우 결과를 '1'로 설정됩니다.

Source Image
Fig. 3x3 Kernel 둘레 동작 방식 설명

해당 연산은 Kernel의 크기에 따라서 연산 결과의 Depth가 결정됩니다.

Source Image
Fig. 3x5 Kernel 일반 동작 방식 설명

결과의 Depth와 같지 않은 Format가 없는 경우 Depth보다 높은 Depth 중 가장 낮은 Depth를 사용하여 Format가 결정됩니다. 이로 인하여 채워지지 않은 비트는 모두 '0'으로 설정이 됩니다.
함수 GetResultDepth를 사용하여 연산 시 결과 Depth의 값의 반환이 가능합니다.
함수 EnableMSBShiftMode를 사용하여 결과 비트를 Shift하는 방향의 설정이 가능합니다.

Source Image
Fig. 5x5 Kernel 일반 동작 방식 설명

위 Kernel의 크기가 64가 최대인 상황에서 더 넓은 범위의 검색이 필요한 경우, 함수 SetSparseLength를 사용하여 더 넓은 범위의 탐색이 가능합니다.
Sparce Length는 Kernel의 각 픽셀의 거리를 뜻하며 일반적으로 1으로 설정되어 있습니다.

Source Image
Fig. 3x3 Kernel, Sparce Length 2의 동작 방식 설명

마지막으로 Mirror Mode를 사용하여 연산 시간을 줄일 수 있습니다.

Source Image
Fig. 3x3 Kernel, Mirror Mode의 동작 방식 설명

해당 연산은 결과 이미지 생성 시 설정된 결과 이미지를 지우고 연산을 진행하며, 각 Channel은 따로 계산이 됩니다.

Source Image Destination Image
Source Image Destination Image
Fig. Census Transform의 동작 결과

3 파라미터 설정 및 사용 방법

int32_t i32KernelHeight;
int32_t i32KernelWidth;

// Kernel 크기 설정
censusTransform.SetKernelHeight(i32KernelHeight);
censusTransform.SetKernelWidth(i32KernelWidth);

// Kernel 크기 가져오기
i32KernelHeight = censusTransform.GetKernelHeight();
i32KernelWidth = censusTransform.GetKernelWidth();
int i32KernelHeight;
int i32KernelWidth;

// Kernel 크기 설정
censusTransform.SetKernelHeight(i32KernelHeight);
censusTransform.SetKernelWidth(i32KernelWidth);

// Kernel 크기 가져오기
i32KernelHeight = censusTransform.GetKernelHeight();
i32KernelWidth = censusTransform.GetKernelWidth();

Kernel의 높이와 너비 값을 설정 및 가져옵니다.
객체를 처음 생성하거나 Clear 한 경우 두 값은 모두 3으로 설정됩니다.
각각의 값은 1보다 큰 홀수 만 사용이 가능하며 잘못된 값을 설정 후 실행 시 오류를 반환합니다.

int32_t i32SparseLength;

// Kernel의 Sparse Length 설정
censusTransform.SetSparseLength(i32SparseLength);

// Kernel의 Sparse Length 가져오기
i32SparseLength = censusTransform.GetSparseLength();
int i32SparseLength;

// Kernel의 Sparse Length 설정
censusTransform.SetSparseLength(i32SparseLength);

// Kernel의 Sparse Length 가져오기
i32SparseLength = censusTransform.GetSparseLength();

Kernel의 Sparse Length 값을 설정 및 가져옵니다.
객체를 처음 생성하거나 Clear 한 경우 1으로 설정됩니다.
값은 0보다 큰 수 만 사용이 가능하며 잘못된 값을 설정 후 실행 시 오류를 반환합니다.

bool bMirrorMode;
bool bMSBShiftMode;

// Mirror Mode 설정
censusTransform.EnableMirrorMode(bMirrorMode);
// MSB Shift Mode 설정
censusTransform.EnableMSBShiftMode(bMSBShiftMode);

// Mirror Mode 가져오기
bMirrorMode = censusTransform.IsMirrorModeEnabled();
// MSB Shift Mode 가져오기
bMSBShiftMode = censusTransform.IsMSBShiftModeEnabled();
bool bMirrorMode;
bool bMSBShiftMode;

// Mirror Mode 설정
censusTransform.EnableMirrorMode(bMirrorMode);
// MSB Shift Mode 설정
censusTransform.EnableMSBShiftMode(bMSBShiftMode);

// Mirror Mode 가져오기
bMirrorMode = censusTransform.IsMirrorModeEnabled();
// MSB Shift Mode 가져오기
bMSBShiftMode = censusTransform.IsMSBShiftModeEnabled();

연산의 Mirror/MSB Shift Mode를 설정 및 설정 여부를 가져옵니다.
객체를 처음 생성하거나 Clear 한 경우 두 값은 모두 True로 설정됩니다.
결과 Depth와 Kernel Depth가 같은 경우 MSB Shift Mode는 같은 결과를 반환합니다.

4 예제 코드

CCensusTransform censusTransform;

// 입력 이미지 설정
CFLImage fliSourceImage;
censusTransform.SetSourceImage(fliSourceImage);

// 결과 이미지 설정
CFLImage fliDestinationImage;
censusTransform.SetDestinationImage(fliDestinationImage);

// Kernel 높이 설정
int32_t i32KernelHeight;
censusTransform.SetKernelHeight(i32KernelHeight);

// Kernel 너비 설정
int32_t i32KernelWidth;
censusTransform.SetKernelWidth(i32KernelWidth);

// Kernel의 Sparse Length 설정
int32_t i32SparseLength;
censusTransform.SetSparseLength(i32SparseLength);

// Mirror Mode 설정
bool bMirrorMode;
censusTransform.EnableMirrorMode(bMirrorMode);

// MSB Shift Mode 설정
bool bMSBShiftMode;
censusTransform.EnableMSBShiftMode(bMSBShiftMode);
CCensusTransform censusTransform = new CCensusTransform();

// 입력 이미지 설정
CFLImage fliSourceImage = new CFLImage();
censusTransform.SetSourceImage(ref fliSourceImage);

// 결과 이미지 설정
CFLImage fliDestinationImage = new CFLImage();
censusTransform.SetDestinationImage(ref fliDestinationImage);

// Kernel 높이 설정
int32_t i32KernelHeight;
censusTransform.SetKernelHeight(i32KernelHeight);

// Kernel 너비 설정
int32_t i32KernelWidth;
censusTransform.SetKernelWidth(i32KernelWidth);

// Kernel의 Sparse Length 설정
int32_t i32SparseLength;
censusTransform.SetSparseLength(i32SparseLength);

// Mirror Mode 설정
bool bMirrorMode;
censusTransform.EnableMirrorMode(bMirrorMode);

// MSB Shift Mode 설정
bool bMSBShiftMode;
censusTransform.EnableMSBShiftMode(bMSBShiftMode);