Census Transform
1 개요
이미지에 Census 변환을 적용하는 알고리즘입니다.
2 알고리즘 상세 설명
Census Transform은 커널 내의 픽셀 값을 서로 비교하여 값을 설정하는 알고리즘입니다.
중앙 픽셀을 기준으로 커널의 범위 내에 있는 픽셀을 중앙 픽셀의 값과 비교합니다.
비교한 픽셀 값이 크거나 같은 경우에는 '1', 작은 경우에는 '0'으로 간주하여 왼쪽 위에서 오른쪽 밑까지 중앙 픽셀을 재외하고 순서대로 나열을 하여 중앙 픽셀의 값을 설정합니다.

Mirror Mode를 사용하는 경우 각 픽셀은 중앙 픽셀의 값이 아닌 중앙 픽셀 기준으로 대각 위치에 있는 픽셀을 비교합니다.

해당 연산은 커널의 크기에 따라서 결과 값의 비트 수가 결정되어 연산 결과의 포맷 또한 같이 결정됩니다.
모든 결과 포맷은 Unsigned으로 고정됩니다.

결과 비트 수와 같은 비트 수를 가지는 포맷이 없는 경우 결과 비트 수 보다 높은 비트 수를 가지는 포맷 중 가장 낮은 비트 수를 가지는 포맷이 사용됩니다. 최대 비트 수를 가지는 포맷의 비트 수는 64입니다.
결과 비트를 채우고 남은 비트의 값은 '0'으로 설정됩니다. 채워지는 '0'의 위치는 MSB 모드에 따라서 정해집니다.
함수 EnableMSBShiftMode로 채워지는 '0'의 위치 설정이 가능합니다.
함수 GetResultDepth를 사용하여 연산 시 결과 Depth의 값의 반환이 가능합니다. -1을 반환하는 경우 해당 결과 비트 수의 출력이 불가능하다는 뜻이며 알고리즘 동작 시 오류를 반환합니다.

커널 내에 이미지의 바깥이 포함되는 경우 해당 픽셀이 포함되는 비교의 결과 값을 '0'으로 간주합니다.

Sparce Length는 각 픽셀 간의 거리를 뜻하며 일반적으로 1으로 설정되어 있습니다.

| Source Image | Destination Image |
|---|---|
![]() |
![]() |
3 파라미터 설정 및 사용 방법
// 객체 생성
CCensusTransform censusTransform;
// Kernel 높이
int32_t i32KernelHeight = 3;
// Kernel 너비
int32_t i32KernelWidth = 3;
// Kernel 크기 설정
censusTransform.SetKernel(i32KernelWidth, i32KernelHeight);
// Kernel 크기 가져오기
censusTransform.GetKernel(i32KernelWidth, i32KernelHeight);
커널의 높이와 너비 값을 설정 및 가져옵니다.
객체를 처음 생성하거나 Clear 한 경우 두 값은 모두 3으로 설정됩니다.
각각의 값은 1보다 큰 홀수 만 사용이 가능하며 잘못된 값을 설정 후 실행 시 오류를 반환합니다.
// 객체 생성
CCensusTransform censusTransform;
// Kernel의 Sparse Length
int32_t i32SparseLength = 1;
// Kernel의 Sparse Length 설정
censusTransform.SetSparseLength(i32SparseLength);
// Kernel의 Sparse Length 가져오기
i32SparseLength = censusTransform.GetSparseLength();
커널의 Sparse Length 값을 설정 및 가져옵니다.
객체를 처음 생성하거나 Clear 한 경우 1으로 설정됩니다.
값은 0보다 큰 수 만 사용이 가능하며 잘못된 값을 설정 후 실행 시 오류를 반환합니다.
// 객체 생성
CCensusTransform censusTransform;
// Mirror Mode
bool bMirrorMode = true;
// MSB Shift Mode
bool bMSBShiftMode = true;
// 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로 설정됩니다.
// 객체 생성
CCensusTransform censusTransform;
// 결과 이미지의 Depth
int32_t i32ResultDepth;
// 결과 이미지의 Depth 출력
i32ResultDepth = censusTransform.GetResultDepth();
연산 결과의 Depth를 예상하여 출력합니다.
해당 함수가 -1을 반환하는 경우 알고리즘 실행 시 오류를 반환합니다.
4 예제 코드
// 객체 생성
CCensusTransform censusTransform;
// 입력 이미지 설정
CFLImage fliSourceImage;
censusTransform.SetSourceImage(fliSourceImage);
// 결과 이미지 설정
CFLImage fliDestinationImage;
censusTransform.SetDestinationImage(fliDestinationImage);
// Kernel 높이 너비 설정
int32_t i32KernelWidth = 3;
int32_t i32KernelHeight = 3;
censusTransform.SetKernel(i32KernelWidth, i32KernelHeight);
// Kernel의 Sparse Length 설정
int32_t i32SparseLength = 1;
censusTransform.SetSparseLength(i32SparseLength);
// Mirror Mode 설정
bool bMirrorMode = true;
censusTransform.EnableMirrorMode(bMirrorMode);
// MSB Shift Mode 설정
bool bMSBShiftMode = true;
censusTransform.EnableMSBShiftMode(bMSBShiftMode);

