DevelopmentTool/OpenCV

[OpenCV] 영상의 논리 연산 방법

유제필 2022. 11. 18. 10:13

OpenCV에서 영상의 논리 연산(logical operation)이란 픽셀 값을 2진수로 표현하여 각 비트 단위 논리 연산을 수행하는 것을 의미한다.

OpenCV에서는 논리합(OR), 논리곱(AND), 부정(NOT), 배타적 논리합(XOR) 연산을 지원한다.

논리합(OR) : 2개의 입력 비트 중 1개라도 1이면 결과가 1이 되는 연산

논리곱(AND) : 2개의 입력 비트 중 모두 1인 경우만 결과가 1이 되는 연산

부정(NOT) : 입력 비트가 0이면 결과가 1, 1이면 결과가 0이 되는 연산

배타적 논리합(XOR) : 2개의 입력 비트 중 1개만 1인 경우 결과가 1이 되는 연산

입력 비트
논리 연산 결과
a
b
OR
AND
NOT a
XOR
0
0
0
0
1
0
0
1
1
0
1
1
1
0
1
1
0
1
1
1
1
1
0
0

영상의 논리 연산은 각 픽셀 값에 대하여 비트 단위로 이루어진다.

그레이스케일 영상의 경우 1픽셀을 구성하는 8개의 비트에 모두 논리 연산이 이루어 진다.

예를 들어, 특정 좌표에 있는 픽셀의 그레이스케일 값이 100과 200이라고 했을 때, 각 비트 모두에 연산을 수행한다.

 

 

OpenCV에서는 영상의 비트 단위 논리 연산을 수행하는 함수를 제공한다.

bitwise_or();

void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());

src1 : 1번째 입력 행렬 또는 스칼라
src2 : 2번째 입력 행렬 또는 스칼라
dst : 출력 행렬
mask : 마스크 영상

 

bitwise_and();

void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());

src1 : 1번째 입력 행렬 또는 스칼라
src2 : 2번째 입력 행렬 또는 스칼라
dst : 출력 행렬
mask : 마스크 영상

 

bitwise_not();

void bitwise_not(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());

src1 : 1번째 입력 행렬 또는 스칼라
dst : 출력 행렬
mask : 마스크 영상

 

bitwise_xor();

void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());

src1 : 1번째 입력 행렬 또는 스칼라
src2 : 2번째 입력 행렬 또는 스칼라
dst : 출력 행렬
mask : 마스크 영상
 

각각 OR, AND, NOT, XOR 순으로 OpenCV에서 제공하는 함수이다.

예제 코드

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main()
{

	Mat src1 = imread("C:/opencv/ch02/Project1/lenna.bmp", IMREAD_GRAYSCALE);
	Mat src2 = imread("C:/opencv/ch02/Project1/test.bmp", IMREAD_GRAYSCALE);

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

	Mat dst_or, dst_and, dst_not, dst_xor;

	bitwise_or(src1, src2, dst_or);
	bitwise_and(src1, src2, dst_and);
	bitwise_not(src1, dst_not);
	bitwise_xor(src1, src2, dst_xor);

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

	waitKey();

}

Mat 객체 src1, src2에 각각 다른 영상을 저장하고 두 영상간의 논리 연산을 수행한다.

 

위 2개의 영상을 각각 src1, src2로 저장한 영상이다.

각 영상의 논리 연산 결과는 아래 이미지와 같다.