OpenCV(九)—————圖像通道合併與分離(C++)

1.分離

將一張圖像分別分成三個通道的圖像.

使用split()函數,分離之後的數據存到一個Mat對象的容器中.

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

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    //  讀入圖像
    Mat src = imread("../meizi.jpg");
    if(src.empty())
    {
        printf("不能找到文件。\n");
        return -1;
    }
    namedWindow("input",WINDOW_AUTOSIZE);
    imshow("input", src);

    vector<Mat> mv;
    split(src,mv);
    imshow("blue channel",mv[0]);
    imshow("green channel",mv[1]);
    imshow("red channel",mv[2]);

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

輸出結果:

原圖:

blue通道:

red通道:

green通道:

可明顯看出來紅色通道亮度最高,即佔比最大.

2.合併

將紅色通道去掉再合併的效果:

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

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    //  讀入圖像
    Mat src = imread("../meizi.jpg");
    if(src.empty())
    {
        printf("不能找到文件。\n");
        return -1;
    }
    namedWindow("input",WINDOW_AUTOSIZE);
    imshow("input", src);

    //  分離
    vector<Mat> mv;
    split(src,mv);

    //  合併,將紅色通道去掉再合併的效果
    mv[2] = Scalar(0);
    Mat dst;
    merge(mv,dst);
    imwrite("../result.jpg",dst);
    imshow("result",dst);

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

結果:

假如綠色通道缺失:

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

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    //  讀入圖像
    Mat src = imread("../meizi.jpg");
    if(src.empty())
    {
        printf("不能找到文件。\n");
        return -1;
    }
    namedWindow("input",WINDOW_AUTOSIZE);
    imshow("input", src);

    //  分離
    vector<Mat> mv;
    split(src,mv);

    //  合併,green通道缺失的情況
    mv[1] = Scalar(0);
    Mat dst;
    merge(mv,dst);
    imwrite("../result.jpg",dst);
    imshow("result",dst);

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

結果:

藍色通道缺失:

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

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    //  讀入圖像
    Mat src = imread("../meizi.jpg");
    if(src.empty())
    {
        printf("不能找到文件。\n");
        return -1;
    }
    namedWindow("input",WINDOW_AUTOSIZE);
    imshow("input", src);

    //  分離
    vector<Mat> mv;
    split(src,mv);

    //  合併,blue通道缺失的情況
    mv[0] = Scalar(0);
    Mat dst;
    merge(mv,dst);
    imwrite("../result.jpg",dst);
    imshow("result",dst);

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

結果:

將綠色通道取反再令其缺失:

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

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    //  讀入圖像
    Mat src = imread("../meizi.jpg");
    if(src.empty())
    {
        printf("不能找到文件。\n");
        return -1;
    }
    namedWindow("input",WINDOW_AUTOSIZE);
    imshow("input", src);

    //  分離
    vector<Mat> mv;
    split(src,mv);
    //  將綠色通道比重增大(取反)
    bitwise_not(mv[2],mv[2]);

    //  合併,增大後的green通道缺失的情況
    mv[2] = Scalar(0);
    Mat dst;
    merge(mv,dst);
    imwrite("../result.jpg",dst);
    imshow("result",dst);

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

結果:

3.補充API---ROI

這個api是用來截圖圖像的,通過設置參數可以截取部分圖像,要注意一個問題,截取的圖像改變的話,是會改變原圖像的,因爲兩者指向的是同一個內存對象.

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

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    //  讀入圖像
    Mat src = imread("../meizi.jpg");
    if(src.empty())
    {
        printf("不能找到文件。\n");
        return -1;
    }
    namedWindow("input",WINDOW_AUTOSIZE);
    imshow("input", src);

    //  分離
    vector<Mat> mv;
    split(src,mv);

    Rect roi;
    roi.x = 100;
    roi.y = 100;
    roi.width = 250;
    roi.height = 200;
    Mat sub = src(roi);
    rectangle(src,roi,Scalar(255,255,0),1,8);
    imshow("roi",sub);
    imshow("input",src);

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

輸出結果:

如果想要截取的圖像不能改變原圖像:

Mat sub = src(roi).clone();

 

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