서로 다른 조건에서 생성이 된 두 개의 영상을 비교하기 위해서는 먼저 영상을 정규화시키어야 한다. 쉽게 생각할 수 있는 정규화의 방법은 두 개의 영상이 동일한 히스토그램을 같도록 만들면 된다. 어떻게 동일한 히스토그램을 만들 수 있는가? 간단히 생각할 수 있는 방법은 주어진 영상의 히스토그램을 전 픽셀에 걸쳐서 균일한 빈도를 보이는 히스토그램이 되도록 변환을 하는 것이다. 즉, 히스토그램을 평탄화시키는 것이다. 이 변환을
이 히스토그램의 평탄화는 픽셀 값이 좁은 영역에 몰려있는 영상을 전 영역에 분포하도록 한다. 인간은 영상의 밝기에 의해서 보다는 밝고 어두움의 변화의 크기에 의해서 인지도가 증가하게 되는데, 평탄화된 영상은 보다 쉽게 인식이 될 수 있는 구조를 가진다.
std::vector<BYTE> histogram_eq(const std::vector<BYTE> &src) {
int hist[256] = {0}, cum[256], map[256];
for (int k = src.size(); k-->0;) ++hist[src[k]];
for (int k = 0, s = 0; k < 256; k++) {
s += hist[k]; cum[k] = s;
}
double factor = double(255) / (cum[255] - cum[0]) ;
for (int k = 0; k < 256; k++) {
int x = int(factor * (cum[k] - cum[0]));
map[k] = x > 255 ? 255: x;
}
std::vector<BYTE> dst(src.size());
for (int k = src.size(); k-->0;) dst[k] = map[src[k]];
return dst;
}


'Image Recognition > Fundamental' 카테고리의 다른 글
2차원 Gaussian 분포 생성(Creating a 2d Gaussian Distribution) (0) | 2020.12.10 |
---|---|
PCA Line Fitting (0) | 2020.11.12 |
Least Squares Fitting of Circles (0) | 2020.11.11 |
Integer Sqrt (0) | 2020.11.11 |
Parabolic Interpolation in Peak Finding (3) | 2020.11.10 |