[컴퓨터비전 STUDY / KOCW 한동대학교 황성수 교수님 강의 Review]
입력 영상의 각 픽셀이 가지고 있는 Intensity 값을 어떤 함수를 사용해서 해당 출력 Intensity 값으로 매핑하는 과정을 일컫는 말이다.

Intensity transformation의 예시는 다음과 같다.

영상의 Intensity level이 [0, L-1] 일 때, Image negatives로 mapping을 하면
s = L-1-r (s: output r: input) 로 출력된다.
이미지의 어두운 영역에 내장된 흰색 또는 회색 디테일을 강화하는 데 적합한 방법이다.

다음은 실행 코드이다.
int main() {
Mat image = imread("lena.png", 0); // image를 grayscale로 읽음
Mat negative_img = image.clone(); // 원본 image의 복제본 생성
for (int i = 0; i < image.rows; i++)
for (int j = 0; j < image.cols; j++)
negative_img.at<uchar>(i, j) = 255 - image.at<uchar>(i, j); // Image negative 수행
imshow("Input image", image);
imshow("Negative transformation", negative_img);
waitKey(0);
return 0;
}
결과는 다음과 같다.

s = c log(1+r) , c : constant, r : input, s : output
좁은 범위의 낮은 Intensity 값을 더 넓은 범위의 출력 레벨 범위에 매핑한다.
-> 이것은 어두운 영역의 대비를 개선시킨다.
주의할 점은, 영상이 밝아지는 것이 아니라 어두운 영역의 detail이 증가한다는 것이다.
반면에, 밝은 영역의 detail은 감소한다.

다음은 실행 코드이다.
int main() {
Mat image = imread("lena.png", 0);
Mat f_img, log_img;
double c = 1.5f; // scale constant
image.convertTo(f_img, CV_32F);
f_img = abs(f_img) + 1;
log(f_img, f_img);
normalize(f_img, f_img, 0, 255, NORM_MINMAX); // normalize image to (0~255)
convertScaleAbs(f_img, log_img, c); // scaling by c, conversion to an unsigned 8-bit type
imshow("Input image", image);
imshow("Log transformation", log_img);
waitKey(0);
}
결과는 다음과 같다.


감마 값에 따라 영상의 어두운 픽셀 범위가 확대된다.
(어두운 픽셀 세부 정보가 강조 표시됨)
감마 값이 1보다 작으면, 어두운 영역의 detail은 증가하고, 밝은 영역의 detail은 감소한다.
감마 값이 1이면, 입력값과 출력값이 동일하다.
감마 값이 1보다 크면, 어두운 영역의 detail은 감소하고, 밝은 영역의 detail은 증가한다.
예시는 다음과 같다.

다음은 실행 코드이다.
int main() {
Mat image = imread("lena.png", 0);
Mat gamma_img;
MatIterator_<uchar> it, end;
float gamma = 0.5; // 감마값
unsigned char pix[256];
// 감마 보정 테이블 생성
for (int i = 0; i < 256; i++) {
pix[i] = saturate_cast<uchar>(pow((float)(i / 255.0), gamma) * 255.0f);
}
gamma_img = image.clone();
// 생성된 테이블을 사용하여 이미지의 각 픽셀에 감마 보정 적용
for (it = gamma_img.begin<uchar>(), end = gamma_img.end<uchar>(); it != end; it++) {
*it = pix[(*it)];
}
imshow("Input image", image);
imshow("Gamma transformation", gamma_img);
waitKey(0);
}
결과는 다음과 같다.



다음은 Thresholding 방식이라고 한다.
임계값 K보다 크면 255, K보다 작으면 0으로 매핑시킨다.

