介绍可以实现图像通道合并与分离的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对象之间的关系就好,这个注释中已经说明。
演示: