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로 저장한 영상이다.
각 영상의 논리 연산 결과는 아래 이미지와 같다.
'DevelopmentTool > OpenCV' 카테고리의 다른 글
[OpenCV] 블러링 기법과 가우시안 필터 (0) | 2022.11.18 |
---|---|
[OpenCV] 필터링 개념과 filter2D함수 (0) | 2022.11.18 |
[OpenCV] 영상의 산술 연산 방법 (0) | 2022.11.18 |
[OpenCV] 히스토그램 (0) | 2022.11.18 |
[OpenCV] 영상 밝기 및 명암 조절 (0) | 2022.11.18 |