opencv-位运算

非运算

    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

原文地址:https://www.cnblogs.com/liming19680104/p/15464595.html