-
감마 보정(Gamma Correction) 구현컴공지식/컴퓨터비전 2024. 9. 6. 00:36
이것도 마찬가지로 Intensity Transformation 중 하나인데
코드로 살펴보자
이미지와 변수 초기화
Mat image = imread("lena.png", 0);
Mat gamma_img;
float gamma = 0.5;
unsigned char pix[256];이 또한 그레이스케일로 이미지를 불러오고 감마 보정을 적용한 결과를 저장할 gamma_img라는 변수를 선언한다.
감마 값을 0.5로 설정한다. 감마 값이 1보다 작으니까, 결과 이미지는 원본보다 더 밝아지게 될 것이다.
픽셀 값 변환을 위해 0부터 255까지의 값을 담는 배열을 선언한다.
감마 변환 테이블 생성
for (int i = 0; i < 256; i++) {
pix[i] = saturate_cast<uchar>(pow((float)(i / 255.0), gamma) * 255.0f);
}이 부분에서는 0부터 255까지의 모든 픽셀 값에 대해 감마 보정을 미리 계산해 pix 배열에 저장한다.
pow((float)(i / 255.0), gamma) * 255.0f;는 각 픽셀 값을 0-1 사이의 범위로 변환한 다음, 감마 보정을 적용하고 다시 0-255 사이의 값으로 스케일링한다.
saturate_cast<uchar>는 계산 결과가 0-255 범위를 넘지 않도록 제한한다. 즉 값이 unsigned char 타입(0-255)에 맞도록 보정해 준다.
감마 변환 이미지 생성
gamma_img = image.clone();
for (int j = 0; j < image.rows; j++)
for (int i = 0; i < image.cols; i++)
gamma_img.at<uchar>(j, i) = pix[gamma_img.at<uchar>(j, i)];이중 for 루프를 사용해 이미지의 모든 픽셀에 대해 감마 변환 테이블 pix를 적용한다.
각 픽셀 값은 pix 배열에서 변환된 값을 가져와 대체된다.
전체적으로 감마 보정은 먼저 감마 보정을 위한 변환 테이블을 만들고, 그 테이블을 이용해 이미지의 각 픽셀에 변환을 적용하는 방식으로 동작한다.
'컴공지식 > 컴퓨터비전' 카테고리의 다른 글
Averaging Filter와 Gaussian Filter (0) 2024.09.06 Spatial Filtering이란? (0) 2024.09.06 로그 변환(Log Transformation) 구현 (0) 2024.09.06 네거티브 변환(Negative Transformation) 구현 (0) 2024.09.06 Pixel Access (0) 2024.09.06