非运算
cv::Mat src(5, 4, CV_8UC3,cv::Scalar(10,20,30)); std::cerr<<src<<std::endl; cv::Mat dst; cv::bitwise_not(src, dst);//对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1 std::cerr<<dst<<std::endl;
实例:黑白颠倒
cv::Mat src = cv::imread("D:/bb/tu1/4.jpg"); cv::Mat dst = ~src; //取反 cv::namedWindow("src"); cv::imshow("src", src); cv::namedWindow("dst"); cv::imshow("dst", dst);
与运算
图像的与运算主要用于获取某个图像中感兴趣的部分
cv::Mat src(5, 4, CV_8UC3, cv::Scalar(1, 3, 5)); cv::Mat src1(5, 4, CV_8UC3, cv::Scalar(1, 2, 4)); cv::Mat dst(5, 4, CV_8UC3, cv::Scalar(11, 22, 44)); cv::Mat mask(5, 4, CV_8UC3, cv::Scalar(10, 20, 40)); cv::Rect r1(0, 0, 2, 1); mask(r1) = cv::Scalar(0, 0, 0); cv::bitwise_and(src, src1, dst); //对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0 std::cerr << src << std::endl; std::cerr << src1 << std::endl; std::cerr << dst << std::endl;
实例
dog.png
cv::Mat src = cv::imread("D:/bb/tu1/dog.png"); cv::Mat mask(src.rows,src.cols,CV_8UC3,cv::Scalar(0,0,0)); cv::Rect r(162,70,232,150); cv::Point p1= cv::Point(162, 70); cv::Point p2 = cv::Point(232, 150); cv::rectangle(mask,p1,p2,cv::Scalar(255,255,255),-1); cv::Mat m_out; bitwise_and(src,mask,m_out);//mask值为255的不变,mask值为0的都变成0 //利用mask矩阵,提取感兴趣的区域 cv::namedWindow("src"); cv::imshow("src",src); cv::namedWindow("mask"); cv::imshow("mask",mask); cv::namedWindow("m_out"); cv::imshow("m_out",m_out);
bitwise_or是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1|1=1,1|0=1,0|1=1,0|0=0
bitwise_xor是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,1^1=0,1^0=1,0^1=1,0^0=0