HistogramsOfOrientedGradients(HOG)

1 개요

이미지의 Gradient를 구하여 Cell 단위로 그 각도를 수집하여 저장하는 알고리즘입니다.

2 알고리즘 상세 설명

원본 이미지 최종 정규화 결과
HOG Basic Source HOG Basic Result...
Fig. 비주얼화 없이 기본 데이터 생성 결과

이 알고리즘은 여러 단계로 이루어져 있습니다.

첫 번째 단계로는 이미지의 X 방향과 Y 방향의 Gradient값을 각각 구합니다. 이 알고리즘에서는 kernel 사이즈 3의 Gradient Filter로 Gradient값을 구합니다.

두 번째 단계로는 각 방향의 Gradient로 각 픽셀의 Gradient의 각도를 구한 뒤, 지정된 사이즈의 Cell 단위로 각 픽셀의 각도를 지정된 각도들과 비교하여 더 가까운 각도에 가중치를 두어 저장합니다. 지정된 각도는 0~160도까지 20도 단위로 지정되어 있으며(0,20,40....160 9개의 방향), 180도가 추가된 반대 방향은 음수 가중치가 적용됩니다.

세 번째 단계로 Cell들을 지정된 사이즈만큼 Block으로 모아서 Cell단위로 저장한 각도의 세기들을 정규화하여 조명 등으로 인한 밝기 노이즈를 제거합니다. 최종적으로 각 Cell의 각 방향의 세기는 0~1의 Double타입으로 저장됩니다.

Source Peak Vector Prediction Image
HOG Visual Source HOG Peak Vector Result HOG Prediction Image Result
Fig. 비주얼화 옵션별 결과

마지막 단계는 선택사항입니다. 정규화된 Gradient Data를 지정된 비주얼화 방식으로 비주얼화 합니다. 각 Cell별로 가장 세기가 큰 각도를 Peak Vector로 Figure화 시켜 원본 이미지에 override시키는 방법과 Gradient Data를 토대로 경계 예측 이미지를 생성하는 방법이 존재합니다. Peak Vector의 경우 하나의 이미지에서 10000개의 Vector까지 지원합니다.

시트 셀 선택 셀 위치 (Peak Vector 첨부) Pane 그래프
Sheet Cell Select Cell Position Pane Graph
Fig. GUI 그래프 출력

GUI에서는 결과 Sheet에서 셀 결과를 선택 시 이미지에 해당 셀의 위치를 표시해주고 해당 셀의 결과를 Histogram화 하여 pane 그래프에 표시해 줍니다. GUI Sheet에서는 하나의 이미지에서 10000개의 Gradient 수집 결과(Cell*Channels)까지 지원합니다.

FLImaging®의 HOG 알고리즘은 채널별 데이터 및 비주얼화 결과를 지원합니다. 이미지의 다양한 채널 정보에 대한 Gradient 정보를 얻을 수 있습니다.

HOG ROI Result
Fig. ROI와 실제 연산 영역(Cell Size =8, Block Size =2)

이 알고리즘은 Gradient계산을 제외한 모든 연산이 Cell과 Block단위로 이루어져 있기 때문에 임의의 연산 영역이 주어졌을 때 Cell과 Block단위로 나누기 모호한 측면이 있습니다. 또한 Padding영역의 값이 Cell 전체의 데이터에 영향을 미치므로 실제의 결과보다 오차가 더 커질 수 있습니다. 그렇기 때문에 이 알고리즘은 rect ROI에 대해서만 지원하고, 해당 연산 영역 중 Gradient 연산의 Padding 영역은 자동으로 제외됩니다.

남은 연산 영역 중에서 최대한 많은 Block이 포함될 수 있도록 자동으로 Cell과 Block을 나눕니다. 최종 연산 영역 전체를 Block으로 채울 수 없는 경우 상하와 좌우의 빈 영역이 균일하게 되도록 Block영역을 지정합니다.

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

4 알고리즘 수행 결과 취득 방법

기본적인 Cell별 Gradient 수집 정보와 Peak Vector 설정 시 결과 Vector의 Figure의 경우 다음 함수들을 통해 취득할 수 있습니다.

5 예제 코드

Peak Vector 출력 예제

CHistogramsOfOrientedGradients hog;

CFLImage fliSourceImage;
hog.SetSourceImage(fliSourceImage);

hog.Execute();

double* pF64Result;
hog.GetResultHistogram(0, pF64Result);

CFLFigureArray flfaPeakVectors;
hog.GetPeakVectorsFigure(0, flfaPeakVectors);

CHistogramsOfOrientedGradients hog = new CHistogramsOfOrientedGradients();

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

hog.Execute();

List<double> listResult = new List<double>();
hog.GetResultHistogram(0, out listResult);

CFLFigureArray flfaPeakVectors = new CFLFigureArray();
hog.GetPeakVectorsFigure(0, out flfaPeakVectors);

PredictionImage 출력 예제

CHistogramsOfOrientedGradients hog;

CFLImage fliSourceImage;
hog.SetSourceImage(fliSourceImage);

hog.SetVisualResultType(CHistogramsOfOrientedGradients::EVisualResultType_PredictionImage);

CFLImage fliDestinationImage;
hog.SetDestinationImage(fliDestinationImage);

hog.Execute();

double* pF64Result;
hog.GetResultHistogram(0, pF64Result);

CHistogramsOfOrientedGradients hog = new CHistogramsOfOrientedGradients();

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

hog.SetVisualResultType(CHistogramsOfOrientedGradients.EVisualResultType.PredictionImage);

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

hog.Execute();

List<double> listResult = new List<double>();
hog.GetResultHistogram(0, out listResult);

6 관련 알고리즘

CGradientFilter