더북(TheBook)

이 코드에서 변수 vint형으로 선언하였기 때문에 255보다 큰 정수도 저장할 수 있습니다. 그리고 C/C++ 문법 중 삼항 조건 연산자를 이용하여 0보다 작거나 255보다 큰 정수 값을 0 또는 255로 설정하여 결과 영상의 픽셀 값으로 대입했습니다. 즉, v > 255가 참이면 255를 결과 영상 픽셀 값으로 대입하고, 거짓이면 다시 v < 0 조건을 검사합니다. v < 0이 참이면 0을 대입하고, 그렇지 않으면 v를 결과 영상 픽셀 값으로 대입합니다. 결국 v가 0에서 255 사이인 경우에는 v를 그대로 결과 영상 픽셀 값으로 설정합니다. 소스 코드가 조금 복잡해 보일 수도 있지만, 찬찬히 살펴보면 충분히 이해할 수 있을 것입니다.

그런데 이처럼 그레이스케일 값 범위에 맞게끔 결과 영상 픽셀 값을 설정하는 작업은 컴퓨터 비전 프로그래밍에서는 매우 빈번하게 일어납니다. 그래서 OpenCV는 앞과 같이 행렬의 자료형에 맞게끔 포화 연산을 수행하는 saturate_cast()라는 이름의 캐스팅 함수를 지원합니다. saturate_cast() 함수는 템플릿 함수로 정의되어 있으며, 그레이스케일 영상에 대해 자주 사용되는 형식은 다음과 같습니다.

template<> inline 
uchar saturate_cast<uchar>( int v );

v

int 자료형이 표현할 수 있는 범위의 정수

반환값

0~255 사이의 정수

 

saturate_cast() 함수는 원래 템플릿으로 정의된 함수이기 때문에 <> 괄호 사이에 사용하는 자료형을 명시해야 합니다. 앞에 나타낸 saturate_cast() 함수 형식은 int 자료형의 값을 uchar 자료형 범위로 포화 연산을 수행합니다. 그레이스케일 영상에서는 uchar 타입으로 픽셀 값을 표현하기 때문에 밝기 조절 코드에 포화 연산을 추가하려면 다음과 같이 코드를 작성합니다.

int v = src.at<uchar>(j, i) + 100;
dst.at<uchar>(j, i) = saturate_cast<uchar>(v);
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.