サイトアイコン CV & Technologies

ピクセル毎の論理演算 AND NOT OR XOR

Matを入力とする論理演算関数がOpenCVには用意されています。マスク画像を作る時に役に立つかもしれません。ピクセルごとにAND NOT OR XORを計算する4つの関数が用意されています。4つの関数共に引数の最後にマスクとなるMatを指定すると処理対象となるピクセルを指定できます。

bitwise_and()関数

第1、第2引数の2つのMatを入力に、論理積ANDを計算します。第3引数に出力先のMatを指定します。
1 and 1=1
1 and 0=0
0 and 1=0
0 and 0=0

bitwise_not()関数

第1引数のMatを入力に、NOTを計算します。第2引数に出力先のMatを指定します。各ピクセルに対して反転を行います。
not 1=0
not 0=1

bitwise_or()関数

第1、第2引数の2つのMatを入力に、論理和ORを計算します。第3引数に出力先のMatを指定します。
1 or 1=1
1 or 0=1
0 or 1=1
0 or 0=0

bitwise_xor()関数

第1、第2引数の2つのMatを入力に、排他的論理和XORを計算します。第3引数に出力先のMatを指定します。
1 xor 1=0
1 xor 0=1
0 xor 1=1
0 xor 0=0

#include "opencv/cv.h"
#include "opencv/highgui.h"
using namespace cv;

int main(){
    Mat img1 = Mat::zeros(500, 500, CV_8UC1);
    circle(img1, cv::Point(200, 250), 100, Scalar(100), 30, 4);
    
    Mat img2 = Mat::zeros(500, 500, CV_8UC1);
    circle(img2, cv::Point(300, 250), 100, Scalar(50), 30, 4);
    
    Mat img_and;
    bitwise_and(img1, img2, img_and);
    
    Mat img_not;
    bitwise_not(img1, img_not);
    
    Mat img_or;
    bitwise_or(img1, img2, img_or);
    
    Mat img_xor;
    bitwise_xor(img1, img2, img_xor);

    imshow("img1", img1);
    imshow("img2", img2);
    imshow("1and2", img_and);
    imshow("not1", img_not);
    imshow("1or2", img_or);
    imshow("1xor2", img_xor);
    
    waitKey(0);
    return 0;
}

モバイルバージョンを終了