OpenCV(六)—————图像位操作(C++)

内容:

1.与或非

2.利用带mask操作
 

 

1.取反操作

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    //  读入图像
    Mat src = imread("../chaoxiong.jpg");
    imshow("input",src);

    //  图像取反
    Mat m1;
    //  取反API
    //Mat mask = Mat::zeros(src.size(),CV_8UC1);
    bitwise_not(src,m1,Mat());
    imshow("bitwise not",m1);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

原图:

 

 取反后:

 

添加mask后,意为src进行取反时参照mask,取反的值放在m1中,若mask的像素值为0时(mask要么为0,要么为255),取反的值是不放在m1中的,当mask的值不为0时,才把取反的值放到m1中,所以这里m1是没有存放取反结果的,为全黑:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    //  读入图像
    Mat src = imread("../chaoxiong.jpg");
    imshow("input",src);

    //  图像取反
    Mat m1;
    //  取反API
    //  mask的类型必须是CV_8UC1
    Mat mask = Mat::zeros(src.size(),CV_8UC1);
    //  意为src进行取反时参照mask,取反的值放在m1中,若mask的像素值为0时(mask要么为0,要么为255),取反的值是不放在m1中的,当mask的值不为0时,才把取反的值放到m1中
    //  所以这里m1是没有存放取反结果的,为全黑
    bitwise_not(src,m1,mask);
    imshow("bitwise not",m1);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

所以这里m1是没有存放取反结果的,为全黑:

 

运用mask上面的特性可以进行部分取反:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    //  读入图像
    Mat src = imread("../chaoxiong.jpg");
    imshow("input",src);

    //  图像取反
    Mat m1;
    Mat mask = Mat::zeros(src.size(),CV_8UC1);
    //  越界管理
    int w = src.cols/2;
    int h = src.rows/2;
    for(int row = 0;row < h; row++)
    {
        for(int col = 0;col < w; col++)
        {
            mask.at<uchar>(row,col) = 255;
        }
    }
    imshow("mask",mask);

    bitwise_not(src,m1,mask);
    imshow("bitwise not",m1);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

运行结果:

 

 

可以发现,只有mask图像中白色的区域才被取反。

2.与操作

先与自身进行与操作,输出的依然是原图:

    Mat m2;
    //  原图与原图进行与操作
    bitwise_and(src,src,m2,Mat());
    imshow("bitwise and",m2);

对指定的mask区域:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    //  读入图像
    Mat src = imread("../chaoxiong.jpg");
    //imshow("input",src);

    //  图像取反
    Mat m1;
    Mat mask = Mat::zeros(src.size(),CV_8UC1);
    //  越界管理
    int w = src.cols/2;
    int h = src.rows/2;
    for(int row = 0;row < h; row++)
    {
        for(int col = 0;col < w; col++)
        {
            mask.at<uchar>(row,col) = 255;
        }
    }
    //imshow("mask",mask);
    bitwise_not(src,m1,mask);

    //  取mask区域的原图,与操作
    Mat m2;
    //  原图与原图进行与操作
    bitwise_and(src,src,m2,mask);
    imshow("bitwise and",m2);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

输出结果:

  

改变数值:

for(int row = 150;row < h+200; row++)
    {
        for(int col = 280;col < w+150; col++)
        {
            mask.at<uchar>(row,col) = 255;
        }
    }

结果为:

 

3.或运算

或操作中得到的值一直都是值更大的那个。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    //  读入图像
    Mat src = imread("../chaoxiong.jpg");
    //imshow("input",src);

    //  图像取反
    Mat m1;
    Mat mask = Mat::zeros(src.size(),CV_8UC1);
    Mat mask1 = Mat::zeros(src.size(),CV_8UC1);
    //  越界管理
    int w = src.cols/2;
    int h = src.rows/2;
    for(int row = 150;row < h+200; row++)
    {
        for(int col = 280;col < w+150; col++)
        {
            mask.at<uchar>(row,col) = 127;
            mask1.at<uchar>(row,col) = 0;
        }
    }
    //imshow("mask",mask);
    bitwise_not(src,m1,mask);
    Mat m3;
    //  或操作中得到的值一直都是值更大的那个
    bitwise_or(mask,mask1,m3);
    imshow("bitwise and",m3);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章