ABOUT ME

Today
Yesterday
Total
  • 로그 변환(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 constant

     

    f_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
Designed by Tistory.