행렬의 비트연산
행렬에 사용할 수 있는 기본적인 비트연산의 종류는 다음과 같다.
bitwise_or
bitwise_and
bitwise_xor
bitwise_not
멀티채널 행렬의 경우에는 각 채널별로 연산이 진행되며.
모든 비트연산에는 마스크 기능이 포함되어 있다.
샘플 이미지
code)
//! 캔버스의 크기와 색상지정. int width = 300; int height = 200; Size size(width, height); Scalar blue = Scalar(0xd4, 0x34, 0x48); Scalar white = Scalar(0xff, 0xff, 0xff); //! 왼쪽 원 Mat left = Mat(size, CV_8UC3, blue); circle( left, //! 원을 그릴 이미지 행렬 Point(width/3, height/2), //! 원의 중심 width/4, //! 반지름 white, //! 색상 FILLED); //! 라인타입 //! 오른쪽 원 Mat right = Mat(size, CV_8UC3, blue); circle( right, Point(width*2/3, height/2), width/4, white, FILLED);
figure)
1 오퍼랜드 비트연산
피연산자가 1개 필요한 비트연산이다.
not
def )
/** * 피연산자가 1개 필요한 비트연산. * * @param src 피연산자 * @param dest 결과가 저장될 곳 * @param mask 마스크 */ void bitwise_not(Mat src, Mat dest, Mat mask);
example 1)
다음 코드는 왼쪽 원에 대해서 논리적 NOT을 수행한다.
해당 원은 3채널 이미지이기 때문에, RGB채널별로 NOT 연산이 수행된다.
//! 논리적 NOT Mat canvas; bitwise_not(left, canvas);
example 2)
마스크가 0인 위치는 검정색으로 변하며,
마스크가 1인 위치는 원래대로 나온다.
//! 마스크 Mat mask = Mat(size, CV_8UC1); rectangle( mask, //! 사각형을 그릴 행렬 Point(width*0.25, height*0.25), //! TOP_LEFT Point(width*0.75, height*0.75), //! BTM_RIGHT Scalar(255), //! 색상 FILLED //! LINE_TYPE ); //! 마스크가 포함된 논리적 NOT Mat canvas; bitwise_not(left, canvas, mask);
마스크가 흰색인 부분만 원래색으로 나온다.
2 오퍼랜드 비트연산
피연산자가 2개가 필요한 비트연산이다.
and
or
xor
def )
/** * 피연산자가 2개 필요한 비트연산. * * @param src1 첫 번째 피연산자 * @param src2 두 번째 피연산자 * @param dest 결과가 저장될 곳 * @param mask 마스크 */ void bitwise_and(Mat src1, Mat src2, Mat dest, Mat mask); void bitwise_or(Mat src1, Mat src2, Mat dest, Mat mask); void bitwise_xor(Mat src1, Mat src2, Mat dest, Mat mask);
example 1 )
다음 코드는 두 원의 논리적 OR을 수행한다.
두 원은 3채널 이미지이기 때문에, RGB 채널별로 OR 연산이 수행되는데.
이 때, 어떤색 OR 하얀색 = 하얀색 임을 알아두자.
마찬가지로, 어떤색 AND 검정색 = 검정색 이다.
//! 논리적 OR Mat canvas; bitwise_or(left, right, canvas);
example 2 )
다음 코드는 두 원의 논리적 XOR을 수행한 결과이다.
두 원은 3채널 이미지이기 때문에, RGB 채널별로 XOR 연산이 수행되는데.
이 때, 같은색 XOR 같은색 = 검정색 임을 알아두자,
색이 같은 영역은 검정색으로 변하는 것이다.
//! 논리적 XOR Mat canvas; bitwise_xor(left, right, canvas);
'# 미사용 > OpenCV' 카테고리의 다른 글
[OpenCV] 이진화 (1) 응용 : 로고넣기 (0) | 2019.11.03 |
---|---|
[OpenCV] 이진화 (1) BINARY, BINARY_INV (0) | 2019.11.01 |
[OpenCV] 행렬의 산술연산 (0) | 2019.10.31 |
[OpenCV] 채널의 분리, 병합, 혼합 (0) | 2019.10.31 |
[OpenCV] 행렬의 대칭, 전치, 반복 (0) | 2019.10.30 |