两个像素逻辑运算规则
异或:同0,不同1;
对于8位,要将其转化为二进制,比如1111 1111 的十进制是255。
比如0000 0101(5)与0000 0110(6)进行与运算:0000 0100(4)
bitwise_not() 非
void cv::bitwise_not(InputArray src,
OutputArray dst,
InputArray mask = noArray()
)
bitwise_and() 与
void cv::bitwise_and(InputArray src1,
InputArray src2,
OutputArray dst,
InputArray mask = noArray()
)
bitwise_or() 或
void cv::bitwise_or(InputArray src1,
InputArray src2,
OutputArray dst,
InputArray mask = noArray()
)
bitwise_xor() 异或
void cv::bitwise_xor (InputArray src1,
InputArray src2,
OutputArray dst,
InputArray mask = noArray()
)
示例
<opencv2/opencv.hpp>
#include <iostream>
using namespace cv; //opencv的命名空间
using namespace std;
int main()
{
Mat a = (Mat_<uchar>(1, 2) << 0, 5);
Mat b = (Mat_<uchar>(1, 2) << 0, 6);
Mat Xor, Or , Not, And;
bitwise_not(a, Not);
cout << "a Not" << Not << endl;
bitwise_and(a, b, And);
bitwise_or(a, b, Or);
bitwise_xor(a, b, Xor);
cout << And << endl;
cout << Or << endl;
cout << Xor << endl;
Mat img = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenac.png");
Mat mark = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/mask_white.png");
Mat result;
bitwise_and(img, mark, result);
Mat img_inv;
/*bitwise_not(img, img_inv);*/
cvtColor(mark, mark, COLOR_BGR2GRAY);
bitwise_not(img, img_inv, mark); //只在mark中非零像素进行操作
Mat mark_black = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/mask_black.png");
min(img, mark_black, img);
img = img + img_inv;
return 0;
}
结果