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;
}