【OpenCV】图像的通道分离
分離圖像通道采用函數(shù)cvSplit。
?
函數(shù)原型:void cvSplit(const CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3)
分離出來的順序是逆序的,這個(gè)要注意。
?
cvSplit(pImg,bImg,gImg,rImg,0);
分離出來的是單通道的圖,顯示出來是這樣的:
?
通過cvMerge合并通道實(shí)現(xiàn)彩色圖像的顯示,并且也是按照BGR的順序來輸入的。
函數(shù)原型:void cvMerge(const CvArr* src0, const CvArr* src1, const CvArr* src2, const CvArr* src3, CvArr* dst)
這里有個(gè)小問題,假如說代碼是這樣的:
?
??? cvMerge(bImg,0,0,0,pImg1);cvMerge(0,gImg,0,0,pImg2);cvMerge(0,0,rImg,0,pImg3);顯示出來的圖像是這樣的:
再對(duì)通道進(jìn)行分離的結(jié)果是這樣的:
以Blue通道的為例
照理說其他通道的值應(yīng)該為0的才對(duì),也就是說應(yīng)該顯示為黑色,為灰色意味著灰度值不為0。為什么會(huì)這樣?具體的原因要看源碼了,估計(jì)是當(dāng)通道指針為0的時(shí)候,該通道會(huì)附一個(gè)值,但是剛剛用printf試了下輸出是0沒錯(cuò)。這下子困惑了。暫時(shí)不管他先。
我們?cè)谕ǖ蕾x值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);}}
這樣輸出的結(jié)果就成了這:
猴哥終于被分離了
?
源代碼:
#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); }
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/snake-hand/archive/2013/06/12/3132809.html
總結(jié)
以上是生活随笔為你收集整理的【OpenCV】图像的通道分离的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS Window.Open 打开窗口详
- 下一篇: 云计算之路-阿里云上:一场暴风雨的袭击