分離圖像通道采用函數(shù)cvSplit,。
函數(shù)原型:void cvSplit(const CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3)
分離出來的順序是逆序的,,這個要注意,。
- cvSplit(pImg,bImg,gImg,rImg,0);
分離出來的是單通道的圖,顯示出來是這樣的:
通過cvMerge合并通道實現(xiàn)彩色圖像的顯示,,并且也是按照BGR的順序來輸入的,。
函數(shù)原型: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);
- }
|