ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 감마 보정(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
Designed by Tistory.