[OpenCV] 영상 산술 연산 – 3. 논리 연산(AND, OR, XOR, NOT)

이번 글에서는 영상의 논리 연산, 비트단위 연산인 AND, OR, XOR, NOT에 대해 알아보겠습니다.

영상에서의 비트단위 연산은, 영상에서의 픽셀값을 비트단위로 표현하여 논리연산을 수행하는 것을 말합니다.
비트 단위 연산이라는 것에 대해서 처음 들어보신다면 여기를 참고하시길 바랍니다.

함수 원형

AND, OR, XOR, NOT의 함수는 모두 비슷하니 한꺼번에 알아보도록 하겠습니다.

/*
@param src1 입력 영상 1
@param src2 입력 영상 2
@param dst 출력 영상
@param mask 마스크 영상
*/
void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
void bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray());

NOT 연산은 비트를 반전 시키므로 입력 영상이 하나이고 나머지 AND, OR, XOR은 입력 영상을 두개 받아 연산을 수행합니다.

샘플 코드

샘플 코드는 아래와 같습니다.

Mat src1 = imread("lenna.bmp", IMREAD_GRAYSCALE);
Mat src2 = imread("square.bmp", IMREAD_GRAYSCALE);

if (src1.empty() || src2.empty())
{
	cerr << "image load fail" << endl;
	return;
}

imshow("src1", src1);
imshow("src2", src2);

Mat dst_and, dst_or, dst_xor, dst_not;
bitwise_and(src1, src2, dst_and); // AND
bitwise_or(src1, src2, dst_or); // OR
bitwise_xor(src1, src2, dst_xor); // XOR
bitwise_not(src1, dst_not); // NOT

imshow("dst_and", dst_and);
imshow("dst_or", dst_or);
imshow("dst_xor", dst_xor);
imshow("dst_not", dst_not);

waitKey();
destroyAllWindows();

src1과 src2에 영상을 그레이스케일로 불러온 뒤 비트단위 연산을 하여 dst_and, dst_or, dst_xor, dst_not 변수에 출력합니다.

출력 결과

출력 결과는 아래와 같습니다.

기타

OpenCV 함수를 사용하지 않고, C++에서 사용하는 비트단위연산자 기호를 사용해도 동일하게 수행합니다.

dst_and = src1 & src2; // AND
dst_or = src1 | src2; // OR
dst_xor = src1 ^ src2; // XOR
dst_not = ~src1; // NOT

이상으로 영상에서 비트 단위 연산에 대해 알아보았습니다.