【OpenCV】图像的通道分离
分离图像通道采用函数cvSplit。
函数原型:void cvSplit(const CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3)
分离出来的顺序是逆序的,这个要注意。
cvSplit(pImg,bImg,gImg,rImg,0);
分离出来的是单通道的图,显示出来是这样的:
通过cvMerge合并通道实现彩色图像的显示,并且也是按照BGR的顺序来输入的。
函数原型:void cvMerge(const CvArr* src0, const CvArr* src1, const CvArr* src2, const CvArr* src3, CvArr* dst)
这里有个小问题,假如说代码是这样的:
cvMerge(bImg,0,0,0,pImg1); cvMerge(0,gImg,0,0,pImg2); cvMerge(0,0,rImg,0,pImg3);
显示出来的图像是这样的:
再对通道进行分离的结果是这样的:
以Blue通道的为例
照理说其他通道的值应该为0的才对,也就是说应该显示为黑色,为灰色意味着灰度值不为0。为什么会这样?具体的原因要看源码了,估计是当通道指针为0的时候,该通道会附一个值,但是刚刚用printf试了下输出是0没错。这下子困惑了。暂时不管他先。
我们在通道赋值1来代替0试试看:
for(int i=0;i<pTem->nChannels;i++) { value.val[0]=0x1; //value.val[1]=0x1; //value.val[2]=0x1; } for(int i=0;i<pTem->height;i++) { for(int j=0;j<pTem->width;j++) { cvSet2D(pTem,i,j,value); } }
这样输出的结果就成了这:
猴哥终于被分离了
源代码:
#include "stdafx.h" #include <opencv2/opencv.hpp> int main() { IplImage* pImg; IplImage *pImg1,*pImg2,*pImg3; IplImage *rImg,*bImg,*gImg; IplImage *pTem; CvScalar value; pImg=cvLoadImage("Baboon.jpg",CV_LOAD_IMAGE_COLOR); pTem=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,1); for(int i=0;i<pTem->nChannels;i++) { value.val[0]=0x1; //value.val[1]=0x1; //value.val[2]=0x1; } for(int i=0;i<pTem->height;i++) { for(int j=0;j<pTem->width;j++) { cvSet2D(pTem,i,j,value); } } cvNamedWindow("1",CV_WINDOW_AUTOSIZE); cvNamedWindow("2",CV_WINDOW_AUTOSIZE); cvNamedWindow("3",CV_WINDOW_AUTOSIZE); cvNamedWindow("4",CV_WINDOW_AUTOSIZE); cvNamedWindow("5",CV_WINDOW_AUTOSIZE); cvShowImage("1",pImg); rImg=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,1); bImg=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,1); gImg=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,1); pImg1=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,3); pImg2=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,3); pImg3=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,3); cvSplit(pImg,bImg,gImg,rImg,0); cvMerge(bImg,pTem,pTem,0,pImg1); cvMerge(pTem,gImg,pTem,0,pImg2); cvMerge(pTem,pTem,rImg,0,pImg3); /* cvMerge(bImg,0,0,0,pImg1); cvMerge(0,gImg,0,0,pImg2); cvMerge(0,0,rImg,0,pImg3); */ cvSplit(pImg1,bImg,gImg,rImg,0); printf("%lf",gImg->imageData[0]); cvNamedWindow("6",CV_WINDOW_AUTOSIZE); cvNamedWindow("7",CV_WINDOW_AUTOSIZE); cvNamedWindow("8",CV_WINDOW_AUTOSIZE); //cvShowImage("6",pImg1); cvShowImage("2",rImg); cvShowImage("3",bImg); cvShowImage("4",gImg); cvShowImage("5",pTem); cvShowImage("6",pImg1); cvShowImage("7",pImg2); cvShowImage("8",pImg3); cvWaitKey(0); }