영상에는 보통 우리가 관심이 있는 물체와 배경을 동시에 담고 있다. 그런데 어떤 영상의 경우 전체 픽셀 값의 다이내믹 레인지(dynamic range)가 매우 좁아서, 달리 이야기하면 영상의 히스토그램을 살펴볼 때 픽셀 값의 분포가 매우 좁은 영역에 한정이 되어있으면 물체와 배경의 구별이 잘 안되는 영상이 되게 된다. 이러한 영상의 경우 몇 가지 영상 처리 방법을 이용하면 좋은 contrast를 갖는 영상을 만들 수 있다.
Histogram Equalization(HE)은 이러한 기법 중의 하나로 좁은 영역에 분포하는 픽셀 값을 가능한 모든 범위에 골고루 분포하도록 재배치하여서 영상의 contrast를 증대시키는 방법이다. Histogram Equalization에서 사용하는 픽셀 값의 mapping은
(1) 출력 영상의 픽셀 값 범위는 전 그레이 레벨이어야 하고
(2) 각각의 그레이 레벨에 해당하는 픽셀의 수가 거의 일정하여야 한다: 픽셀 값이 이산적이어서 완벽하게 상수가 될 수는 없다, 좀 더 정확히는 출력 영상의 히스토그램 누적합이 그레이 레벨에 선형 비례해야 한다는 조건으로 결정된다.
입력 영상에서 값이 k 인 픽셀은 출력 영상에서 어떤 그레이 값을 가져야 할까? 조건에 따르면 입력 영상의 k 그레이 레벨이 출력 영상의 j 그레이 레벨로 매핑이 된다면, 출력 영상에서는 0부터 j까지 그레이 레벨에 해당하는 픽셀 수는 모든 그레이 레벨에서 픽셀 분포가 균일하다는 조건 때문에
로 주어진다. 이 값과 입력 영상에서 0부터 k까지 그레이 레벨을 갖는 픽셀의 수가 같으면 된다.
입력 영상에서 그레이 값이 0부터 k까지인 픽셀 수는
총 픽셀 수는 cumulative histogram[255]로 주어지므로 원하는 매핑 j = T [k]는
이 매핑에 의하면 입력 영상의 픽셀이 가지는 가장 큰 그레이 값은 출력 영상에는 255에 해당하게 된다. 출력 영상은 정의에 의해서 cumulative histogram이 직선적으로 증가하는 형태를 가지게 된다. 큰 영상의 경우 이 매핑을 Lookup 테이블로 저장하면 연산의 횟수를 줄일 수 있다.
note)
1. 0차 cumulative histogram을 이용하면 0부터 k까지의 histogram의 합은 한 번의 호출로 얻어진다.
2. 0차 cumulative histogram의 마지막 bin의 값은 전체 픽셀 수의 합이 된다.
// histogram의 합은 cumulative histogram을 구성하면 된다;
void HistogramEqualize(BYTE *src, int width, int height, BYTE* dst) {
int histogram[256] = {0}, cumhist[256];
for (int k = width * height; k-->0;) ++histogram[src[k]];
// make 0-st order cumulative histogram;
cumhist[0] = histogram[0];
for (int k = 1; k < 256; k++) cumhist[k] = cumhist[k-1] + histogram[k] ;
int map[256];
double v = 255.0 / cumhist[255]; // cumhist[255] = number of pixels;
for (int k = 0; k < 256; k++) {
int v = int(v * cumhist[k]);
map[k] = v > 255 ? 255: v;
}
for (int k = width * height; k-->0;) dst[k] = map[src[k]];
};
평탄화 전의 히스토그램(붉은색) 및 누적 히스토그램(연두색)
평탄화 후의 히스토그램(붉은색) 및 누적 히스토그램(연두색)
'Image Recognition > Fundamental' 카테고리의 다른 글
Bright Preserving Histogram Equalization with Maximum Entropy (0) | 2008.07.31 |
---|---|
Adaptive Binarization (2) | 2008.07.14 |
FFT2D (0) | 2008.06.10 |
Otsu Algorithm (6) | 2008.05.30 |
Hough Transform (2) | 2008.05.22 |