OpenCV图像颜色通道分离和图像颜色多通道混合.docx
- 文档编号:30116063
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:13
- 大小:354.04KB
OpenCV图像颜色通道分离和图像颜色多通道混合.docx
《OpenCV图像颜色通道分离和图像颜色多通道混合.docx》由会员分享,可在线阅读,更多相关《OpenCV图像颜色通道分离和图像颜色多通道混合.docx(13页珍藏版)》请在冰豆网上搜索。
OpenCV图像颜色通道分离和图像颜色多通道混合
颜色通道
每个图像都有一个或多个颜色通道,图像中默认的颜色通道数取决于其颜色模式,即一个图像的颜色模式将决定其颜色通道的数量。
例如,CMYK图像默认有4个通道,分别为青色、洋红、黄色、黑色。
在默认情况下,位图模式、灰度、双色调和索引颜色图像只有一个通道。
RGB和Lab图像有3个通道,CMYK图像有4个通道。
每个颜色通道都存放着图像中颜色元素的信息。
所有颜色通道中的颜色叠加混合产生图像中像素的颜色。
一幅RGB图像的基本组成单位是以RGB为基础展开的,为此可以理解为一个图像由RGB这样的三个元素组成,R为一个红色通道,表示为1;G为一个绿色通道,表示为2;B为一个蓝色通道,表示为3;有一处白色图像则为4,它是由1、2、3处的通道颜色混合而成,这相当于我们使用的调色板,几种颜色混合在一起将产生一种新的颜色。
分离颜色通道
对一幅RGB图像,是可以分理处RGB三个通道的,对于RGBA图像是可以分理处RGBA四个通道的(A是透明度通道)。
在OpenCV中,直接提供了2个函数方便我们对颜色通道进行调整。
分离通道函数:
splite()
该函数用于将一个多通道数据分离成几个单通道数组(cv:
:
Mat),该函数原型如下:
CV_EXPORTSvoidsplit(constMat&src,Mat*mvbegin);
参数一:
输入图像(要被分离的图像);
参数二:
输出分离后的列表,std:
:
vector : mat>类型; 测试代码 //测试通道分离 cv: : Matmat1; QStringfileName1="D: /qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/1.jpg"; mat1=cv: : imread(fileName1.toStdString()); if(! mat1.data) { qDebug()<<__FILE__<<__LINE__ <<"Failedtoloadimage: "< return; } std: : vector : Mat>listChannel; cv: : split(mat1,listChannel); cv: : imshow("origin",mat1); for(intindex=0;index { cv: : imshow("channel"+std: : to_string(index),listChannel.at(index)); } cv: : waitKey(0); 测试效果 因为分成的RGB编程单个通道,显示出来就是灰度图像了。 多颜色通道混合 该操作是分离颜色通道的逆向操作,将多个mat合并成一个多通道的mat。 此处纠正一下对通道的认知,mat多通道的矩阵,分离和混合的时候并不管其具体指示的颜色意义,操作时只认为是纯数字多通道的分离和混合。 混合通道函数: merge() 通道混合函数原型如下: CV_EXPORTS_Wvoidmerge(InputArrayOfArraysmv,OutputArraydst); 参数一: 输入通道列表,std: : vector : mat>类型; 参数二: 输出图像,cv: : Mat类型; 测试代码1 //测试通道分离 cv: : MatmatR(300,300,CV_8UC1); cv: : MatmatG(300,300,CV_8UC1); cv: : MatmatB(300,300,CV_8UC1); //上部分1/3为红色,2/3为绿色,3/3为蓝色 for(introw=0;row { if(row { for(intcol=0;col { matR.at matG.at matB.at } }elseif(row { for(intcol=0;col { matR.at matG.at matB.at } }else{ for(intcol=0;col { matR.at matG.at matB.at } } } cv: : MatmatOut; std: : vector : Mat>listChanel; //特别注意,OpenCV通道顺序为BGR listChanel.push_back(matB); listChanel.push_back(matG); listChanel.push_back(matR); cv: : merge(listChanel,matOut); cv: : imshow("merge",matOut); cv: : waitKey(0); 测试效果1 然后将分离颜色通道的进行一次优化,让其分离为RGB三个通道,查看测试代码2。 测试代码2 //测试通道分离 cv: : Matmat1; QStringfileName1="D: /qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/1.jpg"; mat1=cv: : imread(fileName1.toStdString()); if(! mat1.data) { qDebug()<<__FILE__<<__LINE__ <<"Failedtoloadimage: "< return; } std: : vector : Mat>listChannel; cv: : split(mat1,listChannel); cv: : imshow("origin",mat1); //生成一个空矩阵 cv: : Matchanel(mat1.rows,mat1.cols,CV_8UC1); for(introw=0;row { for(intcol=0;col { mat1.at } } for(intindex=0;index { //通道BGR if(index==0) { std: : vector : Mat>listOutChannel; listOutChannel.push_back(listChannel.at(0)); listOutChannel.push_back(chanel); listOutChannel.push_back(chanel); cv: : MatmatOut; cv: : merge(listOutChannel,matOut); cv: : imshow("channel"+std: : to_string(index),matOut); }elseif(index==1) { std: : vector : Mat>listOutChannel; listOutChannel.push_back(chanel); listOutChannel.push_back(listChannel.at (1)); listOutChannel.push_back(chanel); cv: : MatmatOut; cv: : merge(listOutChannel,matOut); cv: : imshow("channel"+std: : to_string(index),matOut); }elseif(index==2) { std: : vector : Mat>listOutChannel; listOutChannel.push_back(chanel); listOutChannel.push_back(chanel); listOutChannel.push_back(listChannel.at (2)); cv: : MatmatOut; cv: : merge(listOutChannel,matOut); cv: : imshow("channel"+std: : to_string(index),matOut); } } cv: : waitKey(0); 测试效果2 Demo源码 voidOpenCVManager: : testSplitAndMerge() { #defineTEST_SPLIT(0) #defineTEST_MERGE(0) #defineTEST_SPLIT_MERGE (1) #ifTEST_SPLIT //测试通道分离 cv: : Matmat1; QStringfileName1="D: /qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/1.jpg"; mat1=cv: : imread(fileName1.toStdString()); if(! mat1.data) { qDebug()<<__FILE__<<__LINE__ <<"Failedtoloadimage: "< return; } std: : vector : Mat>listChannel; cv: : split(mat1,listChannel); cv: : imshow("origin",mat1); for(intindex=0;index { cv: : imshow("channel"+std: : to_string(index),listChannel.at(index)); } cv: : waitKey(0); #endif #ifTEST_MERGE //测试通道分离 cv: : MatmatR(300,300,CV_8UC1); cv: : MatmatG(300,300,CV_8UC1); cv: : MatmatB(300,300,CV_8UC1); //上部分1/3为红色,2/3为绿色,3/3为蓝色 for(introw=0;row { if(row { for(intcol=0;col { matR.at matG.at matB.at } }elseif(row { for(intcol=0;col { matR.at matG.at matB.at } }else{ for(intcol=0;col { matR.at matG.at matB.at } } } cv: : MatmatOut; std: : vector : Mat>listChanel; //特别注意,OpenCV通道顺序为BGR listChanel.push_back(matB); listChanel.push_back(matG); listChanel.push_back(matR); cv: : merge(listChanel,matOut); cv: : imshow("merge",matOut); cv: : waitKey(0); #endif #ifTEST_SPLIT_MERGE //测试通道分离 cv: : Matmat1; QStringfileName1="D: /qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/1.jpg"; mat1=cv: : imread(fileName1.toStdString()); if(! mat1.data) { qDebug()<<__FILE__<<__LINE__ <<"Failedtoloadimage: "< return; } std: : vector : Mat>listChannel; cv: : split(mat1,listChannel); cv: : imshow("origin",mat1); //生成一个空矩阵 cv: : Matchanel(mat1.rows,mat1.cols,CV_8UC1); for(introw=0;row { for(intcol=0;col { mat1.at } } for(intindex=0;index { //通道BGR if(index==0) { std: : vector : Mat>listOutChannel; listOutChannel.push_back(listChannel.at(0)); listOutChannel.push_back(chanel); listOutChannel.push_back(chanel); cv: : MatmatOut; cv: : merge(listOutChannel,matOut); cv: : imshow("channel"+std: : to_string(index),matOut); }elseif(index==1) { std: : vector : Mat>listOutChannel; listOutChannel.push_back(chanel); listOutChannel.push_back(listChannel.at (1)); listOutChannel.push_back(chanel); cv: : MatmatOut; cv: : merge(listOutChannel,matOut); cv: : imshow("channel"+std: : to_string(index),matOut); }elseif(index==2) { std: : vector : Mat>listOutChannel; listOutChannel.push_back(chanel); listOutChannel.push_back(chanel); listOutChannel.push_back(listChannel.at (2)); cv: : MatmatOut; cv: : merge(listOutChannel,matOut); cv: : imshow("channel"+std: : to_string(index),matOut); } } cv: : waitKey(0); #endif }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenCV 图像 颜色 通道 分离 混合