分享

【OpenCV】图像的通道分离

 学海无涯GL 2013-12-02

分离图像通道采用函数cvSplit。

 

函数原型:void cvSplit(const CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3)

分离出来的顺序是逆序的,这个要注意。

  1. cvSplit(pImg,bImg,gImg,rImg,0);  


分离出来的是单通道的图,显示出来是这样的:

 

通过cvMerge合并通道实现彩色图像的显示,并且也是按照BGR的顺序来输入的。

函数原型:void cvMerge(const CvArr* src0, const CvArr* src1, const CvArr* src2, const CvArr* src3, CvArr* dst)

这里有个小问题,假如说代码是这样的:

  1.     cvMerge(bImg,0,0,0,pImg1);  
  2.     cvMerge(0,gImg,0,0,pImg2);  
  3.     cvMerge(0,0,rImg,0,pImg3);  

显示出来的图像是这样的:

Blue通道Green通道Red通道

再对通道进行分离的结果是这样的:

以Blue通道的为例

Blue通道分离的灰度图Green通道的灰度图Green通道的灰度图

照理说其他通道的值应该为0的才对,也就是说应该显示为黑色,为灰色意味着灰度值不为0。为什么会这样?具体的原因要看源码了,估计是当通道指针为0的时候,该通道会附一个值,但是刚刚用printf试了下输出是0没错。这下子困惑了。暂时不管他先。

我们在通道赋值1来代替0试试看:

  1. for(int i=0;i<pTem->nChannels;i++)  
  2.  {  
  3.      value.val[0]=0x1;  
  4.      //value.val[1]=0x1;   
  5.      //value.val[2]=0x1;   
  6.  }  
  7.  for(int i=0;i<pTem->height;i++)  
  8.  {  
  9.      for(int j=0;j<pTem->width;j++)  
  10.      {  
  11.          cvSet2D(pTem,i,j,value);  
  12.      }  
  13.  }  


这样输出的结果就成了这:

Red通道Green通道Blue通道

猴哥终于被分离了大笑

 

源代码:

  1. #include "stdafx.h"   
  2. #include <opencv2/opencv.hpp>   
  3. int main()  
  4. {  
  5.   
  6.     IplImage* pImg;  
  7.     IplImage *pImg1,*pImg2,*pImg3;  
  8.     IplImage *rImg,*bImg,*gImg;  
  9.     IplImage *pTem;  
  10.     CvScalar value;  
  11.   
  12.     pImg=cvLoadImage("Baboon.jpg",CV_LOAD_IMAGE_COLOR);  
  13.   
  14.     pTem=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,1);  
  15.   
  16.     for(int i=0;i<pTem->nChannels;i++)  
  17.     {  
  18.         value.val[0]=0x1;  
  19.         //value.val[1]=0x1;   
  20.         //value.val[2]=0x1;   
  21.     }  
  22.     for(int i=0;i<pTem->height;i++)  
  23.     {  
  24.         for(int j=0;j<pTem->width;j++)  
  25.         {  
  26.             cvSet2D(pTem,i,j,value);  
  27.         }  
  28.     }  
  29.     cvNamedWindow("1",CV_WINDOW_AUTOSIZE);  
  30.   
  31.     cvNamedWindow("2",CV_WINDOW_AUTOSIZE);  
  32.     cvNamedWindow("3",CV_WINDOW_AUTOSIZE);  
  33.     cvNamedWindow("4",CV_WINDOW_AUTOSIZE);  
  34.     cvNamedWindow("5",CV_WINDOW_AUTOSIZE);  
  35.       
  36.     cvShowImage("1",pImg);  
  37.   
  38.     rImg=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,1);  
  39.     bImg=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,1);  
  40.     gImg=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,1);  
  41.   
  42.     pImg1=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,3);  
  43.     pImg2=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,3);  
  44.     pImg3=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,3);  
  45.   
  46.     cvSplit(pImg,bImg,gImg,rImg,0);  
  47.       
  48.     cvMerge(bImg,pTem,pTem,0,pImg1);  
  49.       
  50.     cvMerge(pTem,gImg,pTem,0,pImg2);  
  51.     cvMerge(pTem,pTem,rImg,0,pImg3);  
  52.       
  53.     /* 
  54.     cvMerge(bImg,0,0,0,pImg1); 
  55.     cvMerge(0,gImg,0,0,pImg2); 
  56.     cvMerge(0,0,rImg,0,pImg3); 
  57.     */  
  58.   
  59.     cvSplit(pImg1,bImg,gImg,rImg,0);  
  60.     printf("%lf",gImg->imageData[0]);  
  61.   
  62.     cvNamedWindow("6",CV_WINDOW_AUTOSIZE);  
  63.     cvNamedWindow("7",CV_WINDOW_AUTOSIZE);  
  64.     cvNamedWindow("8",CV_WINDOW_AUTOSIZE);  
  65.       
  66.     //cvShowImage("6",pImg1);   
  67.   
  68.     cvShowImage("2",rImg);  
  69.     cvShowImage("3",bImg);  
  70.     cvShowImage("4",gImg);  
  71.     cvShowImage("5",pTem);  
  72.     cvShowImage("6",pImg1);  
  73.     cvShowImage("7",pImg2);  
  74.     cvShowImage("8",pImg3);  
  75.   
  76.     cvWaitKey(0);  
  77. }  


 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多