When will you grow up?

17.Gamma correction (감마 보정) 본문

02. Study/Computer Vision(openframworks&opencv)

17.Gamma correction (감마 보정)

미카이 2016. 10. 30. 11:01


Gamma correction 

"모든 모니터들은 실제 모니터로 보내지는 영상 정보보다 어둡게 보여준다" 에서 출발된다.

잘나와있는곳 : 클릭
모니터 마다 모두 차이는 존재.

모니터로 보내지는 영상 정보가 예를 들어 R,G,B 값으로 0.5, 0.5, 0.5 라고 하면 정확히 중간 값의 회색이 화면에 보여져야 하는데 실제로 눈으로 느끼는 것은 중간 보다 좀 더 어둡게 보인다는 이야기입니다.

때문에 모니터로 보내는 영상의 값을 좀 더 높게 보내면 원래 보여주고자 하는 영상을 보여줄수 있습니다. 예를 들어, 0.8, 0.8, 0.8 을 모니터에 보여주려고 하면 눈으로 느껴지는 것은 0.5, 0.5, 0.5 가 된다는 것입니다.

계산 공식이 여러가지로 많이 있는데 일반적으로 다음과 같은 공식을 사용합니다.

(보여주고자 하는 값) ^ (1.0/2.2)

여기에서 2.2 라는 값을 흔히 Gamma 값 이라고 합니다. Gamma 값은 2.2 이 가장 근접한 값으로 알려져있는데, 그냥 2.0 을 사용하는 것이 연산 속도가 빠른 관계로 2.0 을 사용하는 경우도 많습니다.

--출처 : 쌀밥게임대왕,,코드닷컴



감마콜렉션 opencv 를 이용하여 구현하기


결과

원본,감마값0.5/1.0/1.5/2.0





핵심 코드입니다.


void GammaCorrection(Mat& src, Mat& dst, float fGamma)


{

unsigned char lut[256];


for (int i = 0; i < 256; i++)

{

lut[i] = saturate_cast<uchar>(pow((float)(i / 255.0), fGamma) * 255.0f);

}

dst = src.clone();

const int channels = dst.channels();

switch (channels)

{

case 1:

{

MatIterator_<uchar> it, end;

for (it = dst.begin<uchar>(), end = dst.end<uchar>(); it != end; it++)

*it = lut[(*it)];

break;

}

case 3:

{

MatIterator_<Vec3b> it, end;

for (it = dst.begin<Vec3b>(), end = dst.end<Vec3b>(); it != end; it++)

{

(*it)[0] = lut[((*it)[0])];

(*it)[1] = lut[((*it)[1])];

(*it)[2] = lut[((*it)[2])];

}

break;

}

}

}

Comments