코드 10-1의 color_inverse() 함수에서 영상의 픽셀 값을 반전하는 코드는 for 반복문 안쪽의 14~19행입니다. 코드 10-1에서는 가독성을 위해서 src 영상과 dst 영상의 (i, j) 위치 픽셀 값을 각각 Vec3b 자료형 변수 p1과 p2로 참조한 후에 반전하였지만, 이 코드는 다음과 같이 간략하게 바꿔 쓸 수도 있습니다.
for (int j = 0; j < src.rows; j++) { for (int i = 0; i < src.cols; i++) { dst.at<Vec3b>(j, i) = Vec3b(255, 255, 255) - src.at<Vec3b>(j, i); } }
이 예제 코드는 B, G, R 색상 성분의 반전을 각각 따로 처리하지 않고, Vec3b 클래스에서 지원하는 - 연산자 재정의를 이용하여 한꺼번에 반전을 수행합니다.
코드 10-1의 color_inverse() 함수 실행 결과를 그림 10-1에 나타냈습니다. 그림 10-1에서 src는 입력 영상 butterfly.jpg 파일이고, dst는 반전된 영상입니다. 입력 영상 src에서 검은색 나비 날개 부분이 반전되어 흰색으로 변경된 것을 확인할 수 있습니다. 또한 입력 영상에서 배경의 녹색 나뭇잎 영역은 B, G, R 각 채널이 각각 반전되어 결과 영상에서는 보라색으로 변경되었습니다.
▲ 그림 10-1 컬러 영상의 반전
Note
코드 10-1에서는 컬러 영상의 픽셀 값 참조 방법을 설명하기 위해 영상의 반전을 직접 구현하는 코드를 설명했습니다. 그러나 실전에서 컬러 영상을 반전하려면 Mat 클래스에 대해 정의된 - 연산자 재정의 함수를 사용하는 것이 효율적입니다. 예를 들어 butterfly.jpg 나비 영상을 반전하려면 다음과 같이 코드를 작성합니다.
Mat src = imread("butterfly.jpg", IMREAD_COLOR); Mat dst = Scalar(255, 255, 255) - src;
이 예제 코드는 src 영상의 모든 픽셀에 대하여 B, G, R 색상 성분을 각각 255에서 빼고, 그 결과를 dst 영상의 픽셀 값으로 설정합니다.