【OpenCV入门教程之五】 分离颜色通道多通道图像混合

写作当前博文时配套使用的OpenCV版本:2.4.8

上篇文章中我们讲到了使用addWeighted函数进行图像混合操作,以及将ROI和addWeighted函数结合起来使用,对指定区域进行图像混合操作。

而为了更好的观察一些图像材料的特征,有时需要对RGB三个颜色通道的分量进行分别显示和调整。通过OpenCV的split和merge方法可以很方便的达到目的。

这就是我们这篇文章的主要内容。依然是先看一张截图吧:

一、分离颜色通道

就让我们来详细介绍一下这两个互为冤家的函数。首先是进行通道分离的split函数。

<1>split函数详解

将一个多通道数组分离成几个单通道数组。ps:这里的array按语境译为数组或者阵列。

这个split函数的C++版本有两个原型,他们分别是:

C++: void split(const Mat& src, Mat*mvbegin);C++: void split(InputArray m,OutputArrayOfArrays mv);

关于变量介绍:

第一个参数,InputArray类型的m或者const Mat&类型的src,填我们需要进行分离的多通道数组。第二个参数,OutputArrayOfArrays类型的mv,填函数的输出数组或者输出的vector容器。

就如上一节中讲到方法一样,这里的OutputArrayOfArrays我们通过【转到定义】大法,可以查到它是_OutputArray的引用,那么我们在源代码中再次通过【转到定义】看到_OutputArray类的原型,即是OutputArrayOfArrays的原型:

class CV_EXPORTS _OutputArray : public_InputArray{public: _OutputArray();_OutputArray(Mat& m); template<typename _Tp> _OutputArray(vector<_Tp>& vec); template<typename _Tp> _OutputArray(vector<vector<_Tp>>& vec); _OutputArray(vector<Mat>& vec); template<typename _Tp> _OutputArray(vector<Mat_<_Tp>>& vec); template<typename _Tp> _OutputArray(Mat_<_Tp>& m); template<typename _Tp, int m, int n> _OutputArray(Matx<_Tp, m,n>& matx); template<typename _Tp> _OutputArray(_Tp* vec, int n); _OutputArray(gpu::GpuMat& d_mat); _OutputArray(ogl::Buffer& buf); _OutputArray(ogl::Texture2D& tex);_OutputArray(constMat& m); template<typename _Tp> _OutputArray(const vector<_Tp>&vec); template<typename _Tp> _OutputArray(constvector<vector<_Tp> >& vec); _OutputArray(const vector<Mat>& vec); template<typename _Tp> _OutputArray(const vector<Mat_<_Tp>>& vec); template<typename _Tp> _OutputArray(const Mat_<_Tp>& m); template<typename _Tp, int m, int n> _OutputArray(constMatx<_Tp, m, n>& matx); template<typename _Tp> _OutputArray(const _Tp* vec, int n); _OutputArray(const gpu::GpuMat& d_mat); _OutputArray(const ogl::Buffer& buf); _OutputArray(const ogl::Texture2D& tex);virtual bool fixedSize() const; virtual bool fixedType() const; virtual bool needed() const; virtual Mat& getMatRef(int i=-1) const; /*virtual*/ gpu::GpuMat& getGpuMatRef() const; /*virtual*/ ogl::Buffer& getOGlBufferRef() const; /*virtual*/ ogl::Texture2D& getOGlTexture2DRef() const; virtual void create(Size sz, int type, int i=-1, bool allowTransposed=false,int fixedDepthMask=0) const; virtual void create(int rows, int cols, int type, int i=-1, boolallowTransposed=false, int fixedDepthMask=0) const; virtual void create(int dims, const int* size, int type, int i=-1, boolallowTransposed=false, int fixedDepthMask=0) const; virtual void release() const; virtual void clear() const; #ifdefOPENCV_CAN_BREAK_BINARY_COMPATIBILITY virtual ~_OutputArray();#endif};

类体中还是有不少内容的,其实注意到里面是定义的各种模板,重载的各种构造函数就可以了。

好了,穿越完OutputArrayOfArrays的介绍,我们继续讲解split。

split函数分割多通道数组转换成独立的单通道数组,按公式来看就是这样:

最后看一个示例吧:

其实,每个人都是幸福的。只是,你的幸福,常常在别人眼里。

【OpenCV入门教程之五】 分离颜色通道多通道图像混合

相关文章:

你感兴趣的文章:

标签云: