-
로그 변환(Log Transformation) 구현컴공지식/컴퓨터비전 2024. 9. 6. 00:32
이것도 Intensity Transformation 중 하나인데 코드를 통해서 구현해보자
다음과 같이 이미지를 불러오고(이것도 마찬가지로 그레이스케일)
Mat image = imread("lena.png", 0);
필요한 변수와 매트릭스를 생성해준다.
Mat f_img, log_img;
double c = 1.5f; // scale constantf_img와 log_img는 각각 변환된 이미지를 저장할 매트릭스다.
c는 스케일 상수로, 로그 변환의 결과를 스케일링하는 데 사용한다.
여기서는 1.5로 설정됐다.
그 다음은 이미지 타입을 변환해야 한다.
image.convertTo(f_img, CV_32F);
이미지 데이터를 float 타입(CV_32F)으로 변환해 f_img에 저장한다.
로그 변환은 실수형 데이터를 다루기 때문에 이미지 데이터를 실수형으로 변환해야 한다.
f_img = abs(f_img) + 1;
이 단계에서 f_img의 모든 픽셀 값을 절대값으로 바꾸고, 1을 더해준다.
1을 더하는 이유는 로그 계산 시 0 값이 들어가는 것을 피하기 위해서다.
(로그 함수에서 0의 로그는 정의되지 않으니까!)
다음으로 로그 변환을 수행해준다.
log(f_img, f_img);
이 코드는 f_img의 모든 픽셀 값에 로그 연산을 수행한다.
그리고 그 결과를 다시 f_img에 저장한다.
normalize(f_img, f_img, 0, 255, NORM_MINMAX);
로그 변환 후 결과 이미지를 0에서 255 사이의 범위로 정규화한다.
normalize 함수는 NORM_MINMAX를 사용해 f_img의 모든 값을 0~255로 스케일링한다.
convertScaleAbs(f_img, log_img, c);
이 함수는 f_img를 c 값으로 스케일링한 후, 결과를 log_img에 저장한다.
동시에 log_img는 uchar 타입(8비트)으로 변환되어 화면으로 바로 출력할 수 있다.
로그 변환을 통해 이미지의 어두운 부분을 더 밝게 하고, 그 결과를 화면에 출력한다.
이미지의 픽셀 값을 실수형으로 변환한 후 로그 연산을 하고, 그 결과를 다시 0-255로 스케일링해서 화면에 표시할 수 있는 형태로 만들어주는 과정이다.
'컴공지식 > 컴퓨터비전' 카테고리의 다른 글
Spatial Filtering이란? (0) 2024.09.06 감마 보정(Gamma Correction) 구현 (0) 2024.09.06 네거티브 변환(Negative Transformation) 구현 (0) 2024.09.06 Pixel Access (0) 2024.09.06 Intensity Transformation (0) 2024.09.03