如果我们想分离出每个通道的具体值,并且可以演示看出分离的是“红”“绿”“蓝”的效果。可以用如下函数:

1、C接口程序:

 IplImage* img = cvLoadImage("baboon.jpg");IplImage* rImg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);    IplImage* gImg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);    IplImage* bImg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); cvSplit( img,bImg, gImg,rImg,0);  IplImage* rImg3=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);    IplImage* gImg3=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);    IplImage* bImg3=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);   cvMerge(bImg,gImg,0,0,rImg3);  cvMerge(bImg,0,rImg,0,gImg3);  cvMerge(0,gImg,rImg,0,bImg3); 

cvMerge源程序:

CV_IMPL void cvMerge(const void* srcarr0, const void* srcarr1, const void* srcarr2,const void* srcarr3, void* dstarr )
{const void* sptrs[] = { srcarr0, srcarr1,srcarr2, srcarr3 };cv::Mat dst = cv::cvarrToMat(dstarr);int i, j, nz = 0;for( i = 0; i < 4; i++ )nz += sptrs[i] != 0;CV_Assert( nz > 0 );cv::vector<cv::Mat> svec(nz);cv::vector<int> pairs(nz*2);for( i = j = 0; i < 4; i++ ){if( sptrs[i] != 0 ){svec[j] = cv::cvarrToMat(sptrs[i]);CV_Assert( svec[j].size == dst.size&&svec[j].depth() == dst.depth()&&svec[j].channels() == 1&& i < dst.channels() );pairs[j*2] = j;pairs[j*2+1] = i;j++;}}if( nz == dst.channels() )cv::merge( svec, dst );else{cv::mixChannels( &svec[0], nz,&dst, 1, &pairs[0], nz );}
}

说明:cvMerge函数中cv::Mat dst = cv::cvarrToMat(dstarr);这句会使得dst中元素全为205,具体为什么不清楚。

2、C++接口程序

//单窗口显示多幅图像
int showManyImages( const std::vector<cv::Mat> &srcImages, cv::Size imgSize,cv::Mat& dstImage )
{int nNumImages = srcImages.size();cv::Size nSizeWindows;if(nNumImages > 12){std::cout << " Not more than 12 images!" << std::endl;return -1;}// 根据图片序列数量来确定分割小窗口形态switch(nNumImages){case 1: nSizeWindows = cv::Size(1,1);break;case 2: nSizeWindows = cv::Size(2,1);break;case 3: case 4: nSizeWindows = cv::Size(2,2);break;case 5: case 6: nSizeWindows = cv::Size(3,2);break;case 7: case 8: nSizeWindows = cv::Size(4,2);break;case 9: nSizeWindows = cv::Size(3,3);break;default:nSizeWindows = cv::Size(4,3);break;}// 设置小图像尺寸,间隙,边界cv::Size nShowImageSize = cv::Size(300,200);//每张图显示在画布上的尺寸int nSplitLineSize  = 30;int nAroundLineSize = 50;// 创建输出图像,图像大小根据输入源确定const int imagesHeight = nShowImageSize.height * nSizeWindows.height+ nAroundLineSize + (nSizeWindows.width - 1) *nSplitLineSize;const int imagesWidth = nShowImageSize.width*nSizeWindows.height + nAroundLineSize + (nSizeWindows.height - 1) * nSplitLineSize;//std::cout << imagesWidth << " " << imagesHeight << std::endl;cv::Mat resultImage(imagesHeight, imagesWidth, CV_8UC3,cv::Scalar(0,0,0));// 提取对应小图像的左上角坐标X,Yint posX = (resultImage.cols-(nShowImageSize.width*nSizeWindows.width+(nSizeWindows.width-1)*nSplitLineSize))/2;int posY = (resultImage.rows-(nShowImageSize.height*nSizeWindows.height+(nSizeWindows.height-1)*nSplitLineSize))/2;//std::cout << posX << " " << posY  << std::endl;int tempPosX = posX;int tempPosY = posY;//write text on image std::vector<cv::string> msg;msg.push_back("original image");msg.push_back("blue image");msg.push_back("green image");msg.push_back("red image");int baseLine = 0;// 将每一小幅图像整合大图像for(int i = 0; i < nNumImages; i++){// 小图像坐标转换if(( i % nSizeWindows.width == 0) && ( tempPosX != posX )){tempPosX = posX;tempPosY  += (nSplitLineSize + nShowImageSize.height);}// 利用Rect区域将小图像置于大图像相应区域cv::Mat tempImage = resultImage(cv::Rect(tempPosX, tempPosY , nShowImageSize.width, nShowImageSize.height));// 利用resize函数实现图像缩放resize(srcImages[i], tempImage,cv::Size( nShowImageSize.width ,   nShowImageSize.height));cv::Size textSize = cv::getTextSize(msg[i], 1, 1, 1, &baseLine);//returns bounding box of the text stringint textPosX = tempPosX + nShowImageSize.width/2 - textSize.width/2;int textPosY = tempPosY - 10;cv::Point textOrigin(textPosX,textPosY);cv::putText(resultImage,msg[i],textOrigin,1,1,cv::Scalar(255,255,255),1,8);tempPosX += (nSplitLineSize + nShowImageSize.width);  }dstImage = resultImage.clone();
}
int main()
{cv::Mat srcImage = cv::imread("baboon.jpg"); if(!srcImage.data) return -1;std::vector<cv::Mat> vecImage(3),bgrImage(3);cv::split(srcImage,vecImage);// B/G/Rfor (int i = 0;i<3;i++){cv::split(srcImage,vecImage);// B/G/Rfor (int j = 0;j<3;j++){if (i != j )  vecImage[i] = cv::Mat::ones(srcImage.size(), vecImage[0].type())*205;//为了保持与cvMerge结果一致  }cv::merge(vecImage,bgrImage[i]); }cv::Mat showImage;bgrImage.insert(bgrImage.begin(),srcImage);showManyImages(bgrImage,cv::Size(2,2),showImage);cv::imwrite("showImage.jpg",showImage);cv::waitKey(0);return 0;
}

结果:

opencv RGB三通道分离相关推荐

  1. OpenCV——RGB三通道分离

    opencv 和 matlab 在处理彩色图像的时候,通道的存储顺序是不同的. matlab 的排列顺序是R,G,B: 而在opencv中,排列顺序是B,G,R. 下面通过一个小程序看看opencv中 ...

  2. 【Opencv入门】RGB三通道直方图的计算与绘制

    文章目录 一. 直方图概述 Overview of histogram 二.直方图的建立 Establishment of histogram 三.直方图的作用 The function of his ...

  3. 彩色图像RGB三通道问题探究

    之前做图像问题研究时经常会提到RGB通道,这次做一个小研究,对最底层的东西深究一二-- 直接上全部代码吧,一点点来: # -*- coding: utf-8 -*- import cv2 img=cv ...

  4. BMP位图转为RGB三通道图

    文章目录 读取BMP位图转为RGB三通道图 注意 相关/参考链接 本人机器开发环境 用到的图像 大小端模式介绍: 完整代码: 结果 读取BMP位图转为RGB三通道图 个人总结,目的是给自己日后参考,或 ...

  5. PIL将png的RGBA四通道改为jpg的RGB三通道方法

    将一张png图像使用PIL读入的时候,发现是一个四通道图像,即:RGBA,分别代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间.其中Alpha通道一般用做透明度参数,这就是为 ...

  6. 提取图片RGB三通道数据+用RGB恢复原始图片

    提取图片的RGB三通道数据+用RGB恢复原始图片 提取图片的RGB三通道数据 用RGB恢复原始图片 功能实现: 提取出一张图片的R.G.B三个通道的值并且将其分别转换为十进制数据存储到R.txt.G. ...

  7. tensorflow RGB三通道图转换为灰度图

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Blue_Ghost_/article/details/81977987 </div>&l ...

  8. 带alpha通道四通道的图片转成rgb三通道

    查看第四通道数值范围,若最大值为255,则归一化到1,再与前三通道相乘,得到叠加透明度的结果

  9. 将三张灰度图转换为RGB三通道图片python

    import cv2 import numpy as np from PIL import Image import matplotlib.pyplot as plt #使用cv2读取图片 img = ...

最新文章

  1. 邬贺铨院士:十问边缘计算!
  2. mysql 查询rowno_C# Mysql 查询 Rownum的解决方法
  3. python读取excel部分值存入另一个excel-python3读取excel文件只提取某些行某些列的值方法...
  4. python语音播报-用Python写一个语音播放软件
  5. 推荐13个CSS3快速开发工具
  6. C#学习笔记(一)变量 常量 基本数据类型 其它
  7. 按要求罗列所有字符串字符序列
  8. vue单向数据流与双向绑定两者区别
  9. linux常用指令笔记(1)
  10. LeetCode每日一题 416. 分割等和子集
  11. python不同版本共存_多个python版本共存时的pip配置
  12. Samba 3.0.25 颁布发表
  13. 大数据之-入门_大数据部门业务流程分析---大数据之hadoop工作笔记0006
  14. Python对命令提示符cmd以及操作系统的一些操作
  15. 昼猫笔记 JavaScript -- 闭包
  16. 22.案例实战:把springboot的接口,自动生成接口文档
  17. 韩昊 20190919-2 功能测试
  18. 【python数据分析】分组聚合操作
  19. html标签img是什么意思,html中img标签属性是什么意思
  20. python中数组常用的统计方法

热门文章

  1. 使用wget报错-颁发的证书已经过期。
  2. 老外眼里的中式英语PK标准英语
  3. 湖北武汉电信机房详细介绍
  4. 我爱天文 - 秋季有大三角吗?
  5. jmeter性能测试--对MQTT服务做压力测试
  6. HDU 6447 YJJ's Salesman(线段树+DP)
  7. 如何正确地给固态硬盘(SSD)分区
  8. 无需排队!NewBing已向全球个人开放,教程一篇就够了
  9. 天宝营养冲刺深交所:年营收12.5亿 拟募资7亿
  10. Java实现多个图片转化成PDF