????????介紹可以實現圖像通道合并與分離的API,這只是一種方式,后續還會介紹其他的合并與分離方法,以及ROI區域截取的方法。相關API:
-
split()
-
merge()
-
Mat對象()
代碼:
#include "iostream"
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;int main(int argc, char *argv)
{Mat src = imread("C:/Users/Administrator/Desktop/Zooey.png");if (src.empty()){cout << "could not find image file" << endl;return -1;}namedWindow("input", WINDOW_AUTOSIZE);//【通道分離】vector<Mat> mv;split(src, mv); //通道分離API,這里可以看成將一幅圖像按通道分成了三幅圖像。cout << "the size of mv:" << mv.size() << endl; //容器mv的大小,為3,因為里面存有3個mat對象。//顯示這三幅圖像imshow("blue channel", mv[0]);imshow("green channel", mv[1]);imshow("red channel", mv[2]);//【通道合并】mv[2] = Scalar(0); //將紅色通道的值歸0Mat dst;merge(mv, dst); //通道合并API,三幅圖合并為一幅imshow("red=0", dst);//【ROI(region of interest),即感興趣區域】//用Rect定義一個范圍,后續來截取這個范圍的內容Rect roi;roi.x = 100;roi.y = 100;roi.width = 250;roi.height = 200;//在原圖上畫出范圍rectangle(src, roi, Scalar(255, 255, 0), 1, 8);//截取,獲得一個Mat對象Mat sub = src(roi);//注意:此時截取部分sub跟原圖src中對應位置的內容是同一個東西,即修改sub,src中對應位置的內容也會改變。Mat sub = src(roi).clone();這種方式,就可以將sub和src之間的聯系切斷。//為了驗證上述所說的聯系,對截取范圍取反bitwise_not(sub, sub);//顯示roi圖與原圖imshow("roi", sub);imshow("input", src);waitKey(0);destroyAllWindows();return 0;
}
說下需要注意的點吧:
-
通道分離、合并可以看成根據通道進行圖片的分離與合并,一幅三通道的圖片,經過拆分,每個通道形成一幅圖片,即形成三幅圖片。合并同理,對應三個通道的三幅圖片合并成一幅圖片。合并后的圖片每個像素有三通道,拆分的三幅圖片,每幅圖的每個像素只有一個通道。代碼中,圖片對應mat對象。
-
ROI實際上就是對我們想要的區域進行截取。注意截取后的mat對象跟原mat對象之間的關系就好,這個注釋中已經說明。
演示: