opencv分离颜色通道多通道图像混合.docx_第1页
opencv分离颜色通道多通道图像混合.docx_第2页
opencv分离颜色通道多通道图像混合.docx_第3页
opencv分离颜色通道多通道图像混合.docx_第4页
opencv分离颜色通道多通道图像混合.docx_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【OpenCV入门教程之五】分离颜色通道&多通道图像混合上篇文章中我们讲到了使用addWeighted函数进行图像混合操作,以及将ROI和addWeighted函数结合起来使用,对指定区域进行图像混合操作。而为了更好的观察一些图像材料的特征,有时需要对RGB三个颜色通道的分量进行分别显示和调整。通过OpenCV的split和merge方法可以很方便的达到目的。一、分离颜色通道就让我们来详细介绍一下这两个互为冤家的函数。首先是进行通道分离的split函数。split函数详解将一个多通道数组分离成几个单通道数组。ps:这里的array按语境译为数组或者阵列。这个split函数的C+版本有两个原型,他们分别是:cppview plaincopyprint?C+:voidsplit(constMat&src,Mat*mvbegin);C+:voidsplit(InputArraym,OutputArrayOfArraysmv);关于变量介绍:第一个参数,InputArray类型的m或者const Mat&类型的src,填我们需要进行分离的多通道数组。第二个参数,OutputArrayOfArrays类型的mv,填函数的输出数组或者输出的vector容器。就如上一节中讲到方法一样,这里的OutputArrayOfArrays我们通过【转到定义】大法,可以查到它是_OutputArray的引用,那么我们在源代码中再次通过【转到定义】看到_OutputArray类的原型,即是OutputArrayOfArrays的原型:cppview plaincopyprint?classCV_EXPORTS_OutputArray:public_InputArraypublic:_OutputArray();_OutputArray(Mat&m);template_OutputArray(vector&vec);template_OutputArray(vectorvector&vec);_OutputArray(vector&vec);template_OutputArray(vectorMat_&vec);template_OutputArray(Mat_&m);template_OutputArray(Matx&matx);template_OutputArray(_Tp*vec,intn);_OutputArray(gpu:GpuMat&d_mat);_OutputArray(ogl:Buffer&buf);_OutputArray(ogl:Texture2D&tex);_OutputArray(constMat&m);template_OutputArray(constvector&vec);template_OutputArray(constvectorvector&vec);_OutputArray(constvector&vec);template_OutputArray(constvectorMat_&vec);template_OutputArray(constMat_&m);template_OutputArray(constMatx&matx);template_OutputArray(const_Tp*vec,intn);_OutputArray(constgpu:GpuMat&d_mat);_OutputArray(constogl:Buffer&buf);_OutputArray(constogl:Texture2D&tex);virtualboolfixedSize()const;virtualboolfixedType()const;virtualboolneeded()const;virtualMat&getMatRef(inti=-1)const;/*virtual*/gpu:GpuMat&getGpuMatRef()const;/*virtual*/ogl:Buffer&getOGlBufferRef()const;/*virtual*/ogl:Texture2D&getOGlTexture2DRef()const;virtualvoidcreate(Sizesz,inttype,inti=-1,boolallowTransposed=false,intfixedDepthMask=0)const;virtualvoidcreate(introws,intcols,inttype,inti=-1,boolallowTransposed=false,intfixedDepthMask=0)const;virtualvoidcreate(intdims,constint*size,inttype,inti=-1,boolallowTransposed=false,intfixedDepthMask=0)const;virtualvoidrelease()const;virtualvoidclear()const;#ifdefOPENCV_CAN_BREAK_BINARY_COMPATIBILITYvirtual_OutputArray();#endif;类体中还是有不少内容的,其实注意到里面是定义的各种模板,重载的各种构造函数就可以了。好了,穿越完OutputArrayOfArrays的介绍,我们继续讲解split。split函数分割多通道数组转换成独立的单通道数组,按公式来看就是这样: 最后看一个示例吧:cppview plaincopyprint?MatsrcImage;MatimageROI;vectorchannels;srcImage=cv:imread(dota.jpg);/把一个3通道图像转换成3个单通道图像split(srcImage,channels);/分离色彩通道imageROI=channels.at(0);addWeighted(imageROI(Rect(385,250,logoImage.cols,logoImage.rows),1.0, logoImage,0.5,0.,imageROI(Rect(385,250,logoImage.cols,logoImage.rows);merge(channels,srcImage4);namedWindow(sample);imshow(sample,srcImage);将一个多通道数组分离成几个单通道数组的split()函数的内容大概就是这些了,下面我们来看一下和他亲如手足或者说是他的死对头merge()函数。merge函数详解merge()函数的功能是split()函数的逆向操作,将多个数组组合合并成一个多通道的数组。它通过组合一些给定的单通道数组,将这些孤立的单通道数组合并成一个多通道的数组,从而创建出一个由多个单通道阵列组成的多通道阵列。它有两个基于C+的函数原型:cppview plaincopyprint?C+:voidmerge(constMat*mv,size_tcount,OutputArraydst)C+:voidmerge(InputArrayOfArraysmv,OutputArraydst)第一个参数,mv,填需要被合并的输入矩阵或vector容器的阵列,这个mv参数中所有的矩阵必须有着一样的尺寸和深度。第二个参数,count,当mv为一个空白的C数组时,代表输入矩阵的个数,这个参数显然必须大于1.第三个参数,dst,即输出矩阵,和mv0拥有一样的尺寸和深度,并且通道的数量是矩阵阵列中的通道的总数。函数解析:merge函数的功能是将一些数组合并成一个多通道的数组。关于组合的细节,输出矩阵中的每个元素都将是输出数组的串接,其中,第i个输入数组的元素被视为mvi。 c一般用其中的Mat:at()方法对某个通道进行存取,也就是这样用channels.at(0)。PS: Mat:at()方法,返回一个引用到指定的数组元素。注意是引用,相当于两者等价,修改其中一个另一个跟着变。来一个示例吧:cppview plaincopyprint?vectorchannels;MatimageBlueChannel;MatimageGreenChannel;MatimageRedChannel;srcImage4=imread(dota.jpg);/把一个3通道图像转换成3个单通道图像split(srcImage4,channels);/分离色彩通道imageBlueChannel=channels.at(0);imageGreenChannel=channels.at(1);imageRedChannel=channels.at(2);上面的代码先做了相关的类型声明,然后把载入的3通道图像转换成3个单通道图像,放到vector类型的channels中,接着进行引用赋值。根据OpenCV的BGR色彩空间,其中channels.at(0)就表示引用取出channels中的蓝色分量,channels.at(1)就表示引用取出channels中的绿色色分量,channels.at(2)就表示引用取出channels中的红色分量。一对做相反操作的plit()函数和merge()函数和用法就是这些了。另外提一点,如果我们需要从多通道数组中提取出特定的单通道数组,或者说实现一些复杂的通道组合,可以使用mixChannels()函数。二、多通道图像混合示例程序依然是每篇文章都会配给大家的一个详细注释的示例程序,把这篇文章中介绍的知识点以代码为载体,展现给大家。本篇文章中,我们把多通道图像混合的实现代码封装在了名为MultiChannelBlending()的函数中。直接上代码吧:cppview plaincopyprint?/-【程序说明】-/程序名称::【OpenCV入门教程之四】分离颜色通道&多通道图像混合配套源码/VS2010版OpenCV版本:2.4.8/2014年3月13日Createby浅墨/图片素材出处:dota2原画dota2logo/浅墨的微博:浅墨_毛星云/-/-【头文件包含部分】-/描述:包含程序所依赖的头文件/-#include#include#include/-【命名空间声明部分】-/描述:包含程序所使用的命名空间/-usingnamespacecv;usingnamespacestd;/-【全局函数声明部分】-/描述:全局函数声明/-boolMultiChannelBlending();/-【main()函数】-/描述:控制台应用程序的入口函数,我们的程序从这里开始/-intmain()system(color5E);if(MultiChannelBlending()coutendl嗯。好了,得出了你需要的混合值图像;waitKey(0);return0;/-【MultiChannelBlending()函数】-/描述:多通道混合的实现函数/-boolMultiChannelBlending()/【0】定义相关变量MatsrcImage;MatlogoImage;vectorchannels;MatimageBlueChannel;/=【蓝色通道部分】=/描述:多通道混合-蓝色分量部分/=/【1】读入图片logoImage=imread(dota_logo.jpg,0);srcImage=imread(dota_jugg.jpg);if(!logoImage.data)printf(Oh,no,读取logoImage错误!n);returnfalse;if(!srcImage.data)printf(Oh,no,读取srcImage错误!n);returnfalse;/【2】把一个3通道图像转换成3个单通道图像split(srcImage,channels);/分离色彩通道/【3】将原图的蓝色通道引用返回给imageBlueChannel,注意是引用,相当于两者等价,修改其中一个另一个跟着变imageBlueChannel=channels.at(0);/【4】将原图的蓝色通道的(500,250)坐标处右下方的一块区域和logo图进行加权操作,将得到的混合结果存到imageBlueChannel中addWeighted(imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows),1.0,logoImage,0.5,0,imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows);/【5】将三个单通道重新合并成一个三通道merge(channels,srcImage);/【6】显示效果图namedWindow(游戏原画+logo蓝色通道by浅墨);imshow(游戏原画+logo蓝色通道by浅墨,srcImage);/=【绿色通道部分】=/描述:多通道混合-绿色分量部分/=/【0】定义相关变量MatimageGreenChannel;/【1】重新读入图片logoImage=imread(dota_logo.jpg,0);srcImage=imread(dota_jugg.jpg);if(!logoImage.data)printf(Oh,no,读取logoImage错误!n);returnfalse;if(!srcImage.data)printf(Oh,no,读取srcImage错误!n);returnfalse;/【2】将一个三通道图像转换成三个单通道图像split(srcImage,channels);/分离色彩通道/【3】将原图的绿色通道的引用返回给imageBlueChannel,注意是引用,相当于两者等价,修改其中一个另一个跟着变imageGreenChannel=channels.at(1);/【4】将原图的绿色通道的(500,250)坐标处右下方的一块区域和logo图进行加权操作,将得到的混合结果存到imageGreenChannel中addWeighted(imageGreenChannel(Rect(500,250,logoImage.cols,logoImage.rows),1.0,logoImage,0.5,0.,imageGreenChannel(Rect(500,250,logoImage.cols,logoImage.rows);/【5】将三个独立的单通道重新合并成一个三通道merge(channels,srcImage);/【6】显示效果图namedWindow(游戏原画+logo绿色通道by浅墨);imshow(游戏原画+logo绿色通道by浅墨,srcImage);/=【红色通道部分】=/描述:多通道混合-红色分量部分/=/【0】定义相关变量MatimageRedChannel;/【1】重新读入图片logoImage=imread(dota_logo.jpg,0);srcImage=imread(dota_jugg.jpg);if(!logoImage.data)printf(Oh,no,读取logoImage错

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论