본문 바로가기

Computer Vision by OpenCV

Gamma correction

반응형


ㅇ Gamma correction은 이미지의 밝기를 조절하는 방법입니다.
  - 일반적으로 이미지를 밝게 하려면 픽셀값 (pixel intensity)을 증가시키면 됩니다.
  - 반대로 어둡게 하려면 감소시키면 됩니다.
  - 가장 간단한 방법으로는 모든 픽셀값을 같은 크기 만큼 증가시키면 이미지가 밝아집니다.
  - 하지만 gamma correction은 동일한 값 만큼 증가시키지는 않습니다.
  - Gamma correction은 이미지의 어두운 부분에 집중합니다.
  - 밝게 하거나, 어둡게 할 때,어두운 부분의 변화폭을 밝은 부분보다 크게 합니다.
  - 이러한 특징에 대해서는 뒤에서 그래프와 함께 자세히 설명하겠습니다.
 
ㅇ Gamma correction에서 gamma 값은 양수로서, 그 크기에 따라 밝기가 조정됩니다.
 - Gamma > 1이면, 이미지를 밝게 하는 것이고,
  - 0 < Gamma < 1이면, 어두워집니다.
  - Gamma 값은 양수 ( > 0)여야 합니다.
  - 만약 Gamma = 1인 경우, 이미지 밝기는 변하지 않습니다..

ㅇ Gamma correction은 컬러와 gray 이미지에 모두 적용 가능합니다.
  - Intensity를 가진 gray 이미지는 물론,
  - RGB 컬러이미지에도 적용 가능합니다. 
  - 이 때는, 각 채널별로 gamma correction을 적용해야 합니다.




ㅇ Gamma correction 공식을 살펴보겠습니다.
  - I (x,y)를 이미지(x,y)에서의 pixel intensity라고 하고
  - \gamma > 0가 주어지면, 
  - 아래 식은 correction 후의 pixel intensity값을 나타냅니다.
ㅇ 이 때 I(x,y) 값은 [0, 1.0]에 있어야 합니다.
따라서, 0 <= pixel intensity <= 255 일 경우에는,
[0 1]로 scaling한 후에 correction을 수행하고,
 다시 [0 255]로 scaling합니다.




ㅇ Gamma correction 적용 이미지를 살펴봅시다.
  - Gamma < 1 일 때 (=0.6), 전반적으로 사진이 어두워지며
  - Gamma > 1 일 때 (= 2, 3), 사진이 밝아지는 것을 
  - 아래 2가지 사진 예에서 correction결과를 볼 수 있습니다.







ㅇ Pixel intensity별로 correction 후에 값이 어떻게 변하는지 살펴보겠습니다.
  - Gamma 값에 따라 달라지는 이미지 brightness를 그래프로 그려 보았습니다.

ㅇ gamma > 1 인 경우,
- 아래 그래프에서, I(x,y) = 0.3이 
- gamma correction 이후에 0.55로 변환
- 어두웠던 것 (0.3)이 밝은 것(0.55)로 변환되었습니다.



ㅇ 0 < gamma < 1 인 경우, 
- 밝았던 부분 (= 0.8)이 gamma correction에 의해
- 어두운 부분 (=0.31)로 되었습니다.
- 비율로 따지자면, 밝았던 부분이 어두워지는 비율이 훨씬 크다


ㅇ Gamma correction은 이미지의 어두운 부분을 밝은 부분보다 더 많이 변화시키는 특징을 가집니다. 
  - 즉, intensity가 낮은 부분, 즉 어두운 부분에 대해서
  - 값의 변화정도가 더 크다.

0 < Gamma < 1 일 때,
intensity I [0, 1.0]별로,
correction이후의 값 I'과의 ratio를 비교해보겠습니다.
아래 그래프는 I' / I를 보여준 것입니다.
Intensity가 낮은 pixel들이 변환 후에 더 낮은 비율을 가지게 됨을 알 수 있습니다.
이로부터, gamma correction은,
이미지를 어둡게 할 때, 어두운 쪽의 픽셀들이 더 많이 어두워진다는 것을 알 수 있습니다.



Gamma > 1 일때,
낮은 intensity의 부분들이 correction 후에
값이 증가되는 비율이 높은 intensity부분들보다 더 크다는 것을 알 수 있습니다.
아래 결과를 잘 보면,
밝은 부분 (intensity가 큰 부분)은 gamma 값의 변화에 크게 영향을 받지 않음을 볼 수 있습니다.
하지만, 어두운 부분은 gamma값의 영향에 따라 값이 크게 변하는 것을 볼 수 있습니다.




ㅇ Gamma correction 구현
  - MATLAB으로 gamma correction을 수행하는 함수를 구현해 보았습니다.
  - 인수로 correction을 수행할 컬러이미지 (I)와
  - gamma를 받습니다.
    . 이 함수는 color이미지에 대해서만 동작합니다. 
  - 반환값은 gamma correction된 이미지입니다. 

  
function [img] = myGammaCorrection(I, gamma)
    
    %
    % double precision으로 바꾼다.
    % 값들이 rescaling되어 0 <= pixel <= 1.0으로 바뀐다.
    %
    img = im2double(I);
   

    % gamma correction
    agamma = 1/gamma;
    for i=1:3
        img(:,:,i) = img(:,:,i).^agamma;
    end
    
   
    % 값들이 다시 [0, 255]로 rescaling된다.
    img = im2uint8(img);
    
end







반응형