반전 이미지 만들기 (Make inverted image)
컬러 이미지는 하나의 픽셀마다
빨간색, 녹색, 청색 (Red, green, blue)의 3가지 정보를 가지고 있다.
각각의 색깔 정보를 전문용어로 채널(channel)이라고 한다.
일반적으로 각 채널은 8 bit을 사용하므로
256 가지 의 색을 표시할 수 있다.
즉, 0부터 255까지의 값을 가질 수 있다.
이론적으로 보자면,
각 채널이 256가지의 색을 표현하기 때문에,
3개 채널을 모두 고려하면 256 * 256 *256 가지의 색깔 표현이 가능한 것이다.
반전 이미지 (inverted image)는
각 채널의 값 v를 255-v로 대체하는 것을 말한다.
쉽게 말하면, 0을 255로 바꾸는 것이다.
직관적으로 이해하자면, 검정색이 흰색이 되는 것이다.
이를 구현한 것이 아래 코드이다.
void InvertColor(Mat& input_img, Mat& inverted_img)
{
CV_Assert(input_img.type() == CV_8UC3);
inverted_img = input_img.clone();
for (int row = 0; row < input_img.rows; row++)
{
for (int col = 0; col < input_img.cols; col++)
{
for (int ch = 0; ch < input_img.channels(); ch++)
{
inverted_img.at<Vec3b>(row, col)[ch] = 255 - inverted_img.at<Vec3b>(row, col)[ch];
}
}
}
}
우선, 인수로 주어지는 input_img가 3개 채널을 갖는 컬러영상이고,
각 채널이 8bit인지를 확인한다.
그리고 나서는, 모든 픽셀에 대해 (2개의 바깥 for-loop 부분),
각 채널값을 꺼내서 반전시켜서 다시 넣는다. (가장 안쪽의 for-loop 부분)
각 픽셀의 3개 채널값을 한 번에 읽는 방법은 다음과 같다.
inverted_img.at<Vec3b>(row, col)
이후에 개별 채널값은 배열 인덱스를 이용하여 읽어내면 된다.
inverted_img.at<Vec3b>(row, col)[ch]
웹캠으로부터 들어오는 컬러 영상을
함수 InvertColor( )를 이용하여 반전시키는 프로그램은 아래와 같다.
코드의 함수 onmouse( )와 헤더, 매크로 선언 부분은 이전 포스트를 참조하면 되겠다.
프로그램 수행결과는 아래와 같이, 반전을 하기 전의 원래 영상과 반전 영상이다.
<< 원래영상>>
<< 반전 영상>>
'Computer Vision by OpenCV' 카테고리의 다른 글
OpenCV HLS형식의 이미지 채널별 분리 (Split HLS-formated image) (0) | 2016.03.19 |
---|---|
OpenCV YUV형식의 이미지 분리 (Split YUV-formated image) (0) | 2016.03.19 |
OpenCV 함수 at( )과 포인터 사용간의 시간 차이 (0) | 2016.03.19 |
컬러이미지를 색깔별로 구분하기 (Split color image into R, G, B images) (0) | 2016.03.19 |
Webcam 영상을 Grey로 출력하기 (0) | 2016.03.16 |