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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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