본문 바로가기

# 미사용/OpenCV

[OpenCV] 행렬의 비트연산


 행렬의 비트연산

행렬에 사용할 수 있는 기본적인 비트연산의 종류는 다음과 같다.

  • 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);