一. 使用cvSplit将图像的中的通道拆分到单个图像中
1.所需函数:cvSplit
函数功能:将图像的中的通道拆分到单个图像中

函数原型:

void  cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1,CvArr* dst2, CvArr* dst3 );

参数介绍:

const CvArr* src:       输入的多通道图像
CvArr* dst0:      输出的B通道图像
CvArr* dst1:      输出的G通道图像
CvArr* dst2:      输出的R通道图像
CvArr* dst3:            输出的A通道图像

返回值:无

2.cvMerge

函数功能:用于将通道合并到图像中

函数原型:

void  cvMerge( const CvArr* src0, const CvArr* src1,const CvArr* src2, const CvArr* src3,CvArr* dst );

参数介绍:

const CvArr* src0:    输入B通道
const CvArr* src1:    输入G通道
const CvArr* src2:    输入R通道
const CvArr* src3:    输入A通道
CvArr* dst:         输出图像

返回值:无

二.开始编写代码

2.1 将测试图加载到内存

//加载图像到内存
IplImage *image = cvLoadImage("D:\\1.jpg");  //将图像加载到内存
if (image == NULL){       //判断是否加载成功printf("图像文件打开失败");
}

2.2 创建三幅单通道图像用来存储原图上的RGB通道

//创建存储RGB通道图像
IplImage *image_r = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像
IplImage *image_g = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像
IplImage *image_B = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像

2.3 创建多通道图像

注意分离后的图像是的单通道的只能显示灰度图,所以我们要创建多通道图像与用来存储RGB值

//创建多通道的RGB图像
IplImage *image_rgb_r = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像
IplImage *image_rgb_g = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像
IplImage *image_rgb_b = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像

2.4 分离通道

//分离通道
cvSplit(image, image_b, image_g, image_r,NULL); //注意Opencv中默认是BGR格式不是RGB!

2.5 合并图像

注意分离后的图像是的单通道的只能显示灰度图,所以我们要将其转换成彩色图

//合并图像
cvMerge(image_b, 0, 0, NULL, image_rgb_b);  //合并图像
cvMerge(0, image_g, 0, NULL, image_rgb_g);  //合并图像
cvMerge(0, 0, image_r, NULL, image_rgb_r);  //合并图像

2.6 显示图像

//显示图像cvNamedWindow("image",0);cvNamedWindow("image_r", 0);cvNamedWindow("image_g", 0);cvNamedWindow("image_b", 0);cvShowImage("image", image);cvShowImage("image_r", image_rgb_r);cvShowImage("image_g", image_rgb_g);cvShowImage("image_b", image_rgb_b);

2.5 释放内存

//释放内存
cvReleaseImage(&image);
cvReleaseImage(&image_r);
cvReleaseImage(&image_g);
cvReleaseImage(&image_b);
cvReleaseImage(&image_rgb_r);
cvReleaseImage(&image_rgb_g);
cvReleaseImage(&image_rgb_b);

运行结果:

如需测试可以自行使用绘图软件进行颜色调整测试,看一下是否一致

完整代码:

//加载图像到内存IplImage *image = cvLoadImage("D:\\1.jpg");  //将图像加载到内存if (image == NULL){     //判断是否加载成功printf("图像文件打开失败");}//创建存储RGB通道图像IplImage *image_r = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像IplImage *image_g = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像IplImage *image_b = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像//创建多通道的RGB图像IplImage *image_rgb_r = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像IplImage *image_rgb_g = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像IplImage *image_rgb_b = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像//分离通道cvSplit(image, image_b, image_g, image_r,NULL); //注意Opencv中默认是BGR格式不是RGB!//合并图像cvMerge(image_b, 0, 0, NULL, image_rgb_b);    //合并图像cvMerge(0, image_g, 0, NULL, image_rgb_g);    //合并图像cvMerge(0, 0, image_r, NULL, image_rgb_r);    //合并图像//显示图像cvNamedWindow("image",0);cvNamedWindow("image_r", 0);cvNamedWindow("image_g", 0);cvNamedWindow("image_b", 0);cvShowImage("image", image);cvShowImage("image_r", image_rgb_r);cvShowImage("image_g", image_rgb_g);cvShowImage("image_b", image_rgb_b);cvWaitKey(0);//释放内存cvReleaseImage(&image);cvReleaseImage(&image_r);cvReleaseImage(&image_g);cvReleaseImage(&image_b);cvReleaseImage(&image_rgb_r);cvReleaseImage(&image_rgb_g);cvReleaseImage(&image_rgb_b);

合并三通道,只需要在cvWaitKey函数前加上如下代码:

//合并图像
IplImage *image_rgb = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像
cvMerge(image_b, image_g, image_r, NULL, image_rgb);    //合并图像
//显示合并后图像
cvNamedWindow("image_rgb", 0);
cvShowImage("image_rgb", image_rgb);

运行结果:

最后别忘记释放哦

cvReleaseImage(&image_rgb);

完整代码:

//加载图像到内存IplImage *image = cvLoadImage("D:\\1.jpg");  //将图像加载到内存if (image == NULL){     //判断是否加载成功printf("图像文件打开失败");}//创建存储RGB通道图像IplImage *image_r = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像IplImage *image_g = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像IplImage *image_b = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像//创建多通道的RGB图像IplImage *image_rgb_r = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像IplImage *image_rgb_g = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像IplImage *image_rgb_b = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像//分离通道cvSplit(image, image_b, image_g, image_r,NULL); //注意Opencv中默认是BGR格式不是RGB!//合并图像cvMerge(image_b, 0, 0, NULL, image_rgb_b);    //合并图像cvMerge(0, image_g, 0, NULL, image_rgb_g);    //合并图像cvMerge(0, 0, image_r, NULL, image_rgb_r);    //合并图像//显示图像cvNamedWindow("image",0);cvNamedWindow("image_r", 0);cvNamedWindow("image_g", 0);cvNamedWindow("image_b", 0);cvShowImage("image", image);cvShowImage("image_r", image_rgb_r);cvShowImage("image_g", image_rgb_g);cvShowImage("image_b", image_rgb_b);//合并图像IplImage *image_rgb = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像cvMerge(image_b, image_g, image_r, NULL, image_rgb); //合并图像//显示合并后图像cvNamedWindow("image_rgb", 0);cvShowImage("image_rgb", image_rgb);cvWaitKey(0);//释放内存cvReleaseImage(&image);cvReleaseImage(&image_r);cvReleaseImage(&image_g);cvReleaseImage(&image_b);cvReleaseImage(&image_rgb_r);cvReleaseImage(&image_rgb_g);cvReleaseImage(&image_rgb_b);cvReleaseImage(&image_rgb);

实验图:

HSV通道:

用到cvCvtColor函数,稍微复用一下上面代码即可:

注意HSV颜色空间没有顺序问题,而RGB颜色空间Opencv使用的是BGR!

//加载图像到内存IplImage *image = cvLoadImage("D:\\1.jpg");  //将图像加载到内存if (image == NULL){     //判断是否加载成功printf("图像文件打开失败");}//创建存储HSV通道图像IplImage *image_H = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像IplImage *image_S = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像IplImage *image_V = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像//创建多通道的HSV图像IplImage *image_HSV_H = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像IplImage *image_HSV_S = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像IplImage *image_HSV_V = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像//RGB颜色空间到HSV颜色空间转换IplImage *image1 = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels);  //注意图像必须和输入图像的size,颜色位深度,通道一致  cvZero(image1); //清空image_data数据  cvCvtColor(image, image1, CV_BGR2HSV);//CV_BGR2HSV  //分离通道cvSplit(image1, image_H, image_S, image_V, NULL);    //注意Opencv中默认是BGR格式不是RGB!//合并图像cvMerge(image_H, 0, 0, NULL, image_HSV_H);    //合并图像cvMerge(0, image_S, 0, NULL, image_HSV_S);    //合并图像cvMerge(0, 0, image_V, NULL, image_HSV_V);    //合并图像//显示图像cvNamedWindow("image", 0);cvNamedWindow("image_H", 0);cvNamedWindow("image_S", 0);cvNamedWindow("image_V", 0);cvShowImage("image", image);cvShowImage("image_H", image_HSV_H);cvShowImage("image_S", image_HSV_S);cvShowImage("image_V", image_HSV_V);cvWaitKey(0);//释放内存cvReleaseImage(&image);cvReleaseImage(&image_H);cvReleaseImage(&image_S);cvReleaseImage(&image_V);cvReleaseImage(&image_HSV_H);cvReleaseImage(&image_HSV_S);cvReleaseImage(&image_HSV_V);

运行结果:

合成HSV也是一样,在CvWaiKey函数前面加上:

cvNamedWindow("image_HSV", 0);IplImage *image_HSV = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels);  //注意图像必须和输入图像的size,颜色位深度,通道一致  cvZero(image_HSV); //清空image_data数据  cvMerge(image_H, image_S, image_V, NULL, image_HSV);   //合并图像cvShowImage("image_HSV", image_HSV);

运行结果:

别忘记释放内存哦

cvReleaseImage(&image_HSV);

完整代码:

//加载图像到内存IplImage *image = cvLoadImage("D:\\1.jpg");  //将图像加载到内存if (image == NULL){     //判断是否加载成功printf("图像文件打开失败");}//创建存储HSV通道图像IplImage *image_H = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像IplImage *image_S = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像IplImage *image_V = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);//注意,必须是单通道图像//创建多通道的HSV图像IplImage *image_HSV_H = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像IplImage *image_HSV_S = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像IplImage *image_HSV_V = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//注意,必须是多通道图像//RGB颜色空间到HSV颜色空间转换IplImage *image1 = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels);  //注意图像必须和输入图像的size,颜色位深度,通道一致  cvZero(image1); //清空image_data数据  cvCvtColor(image, image1, CV_BGR2HSV);//CV_BGR2HSV  //分离通道cvSplit(image1, image_H, image_S, image_V, NULL);    //注意Opencv中默认是BGR格式不是RGB!//合并图像cvMerge(image_H, 0, 0, NULL, image_HSV_H);    //合并图像cvMerge(0, image_S, 0, NULL, image_HSV_S);    //合并图像cvMerge(0, 0, image_V, NULL, image_HSV_V);    //合并图像//显示图像cvNamedWindow("image", 0);cvNamedWindow("image_H", 0);cvNamedWindow("image_S", 0);cvNamedWindow("image_V", 0);cvShowImage("image", image);cvShowImage("image_H", image_HSV_H);cvShowImage("image_S", image_HSV_S);cvShowImage("image_V", image_HSV_V);cvNamedWindow("image_HSV", 0);IplImage *image_HSV = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels);  //注意图像必须和输入图像的size,颜色位深度,通道一致  cvZero(image_HSV); //清空image_data数据  cvMerge(image_H, image_S, image_V, NULL, image_HSV);    //合并图像cvShowImage("image_HSV", image_HSV);cvWaitKey(0);//释放内存cvReleaseImage(&image);cvReleaseImage(&image_H);cvReleaseImage(&image_S);cvReleaseImage(&image_V);cvReleaseImage(&image_HSV_H);cvReleaseImage(&image_HSV_S);cvReleaseImage(&image_HSV_V);cvReleaseImage(&image_HSV);

注意Opencv中有一个宏定义是cvCvtPixToPlane 其实就是cvSplit的别名!

原型:

#define cvCvtPixToPlane cvSplit

相关链接:使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图

使用Opencv分离图像通道/合并图像通道相关推荐

  1. OpenCV-利用图像金字塔合并图像

    目录 前言 操作步骤 原图 1.导入所需库 2.读取所需数据 进行图片处理 显示结果 最终结果 前言 图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构.一幅图像的金字 ...

  2. c++ opencv 分离r,g,b三通道

    今天学习了c++ opencv 分离通道的方法 ,操作很奇怪的... Mat bgr_res[3];Mat bgr[3];for( int j = 0 ; j < 3; j++){split(s ...

  3. opencv python3 找图片色块_Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理...

    前文传送门: 图像属性 图像属性包括行数,列数和通道数,图像数据类型,像素数等. 1. 形状:shape 图像的形状可以通过 shape 关键字进行获取,使用 shape 关键的后,获取的信息包括行数 ...

  4. 图像基础知识 —— 图像属性

    1.图像格式 BMP格式 Windows系统下的标准位图格式,未经压缩,一般图像文件会比较大,在很多软件中被广泛使用: JPEG格式 应用最广泛的图片格式之一,它采用一种特殊的有损压缩方法,达到较大的 ...

  5. python+OpenCV图像处理(二)图像像素的访问、通道的合并与分离

    图像像素的访问.通道的合并与分离 (一)像素访问 在第一篇博客中,向大家介绍了,所谓的图像在计算机看来就是一个矩阵,对于RGB图像矩阵一共有三层,分别代表着RGB通道,矩阵中每一个数的大小代表着不同通 ...

  6. OpenCV与图像处理学习一——图像基础知识、读入、显示、保存图像、灰度转化、通道分离与合并

    OpenCV与图像处理学习一--图像基础知识.读入.显示.保存图像.灰度转化.通道分离与合并 一.图像基础知识 1.1 数字图像的概念 1.2 数字图像的应用 1.3 OpenCV介绍 二.图像属性 ...

  7. OpenCV(九)—————图像通道合并与分离(C++)

    1.分离 将一张图像分别分成三个通道的图像. 使用split()函数,分离之后的数据存到一个Mat对象的容器中. #include <opencv2/opencv.hpp> #includ ...

  8. 转载:【OpenCV入门教程之五】 分离颜色通道多通道图像混合

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/21176257 作者:毛星云(浅墨) ...

  9. 【OpenCV入门教程之五】 分离颜色通道多通道图像混合(转)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/21176257 作者:毛星云(浅墨) ...

最新文章

  1. MATLAB与图像处理(一):图像中结构张量的求法(Structure Tensor)
  2. WEB技术架构的资源链接。
  3. c语言编写pdf,编写并运行C语言程序.pdf
  4. c ++ 链表_C ++程序查找两个单个链表的并集
  5. “一个人自修没感觉!”
  6. JDK1.8网盘链接
  7. Oracle分析函数简析
  8. FISCO BCOS 跨链WeCross ppt
  9. HeadFirstJava——13_网络与线程
  10. 平板电脑安装软件_手机象棋软件手机、平板、电脑三平台同时安装!学棋涨棋必备...
  11. 什么是计算机的超级用户账号,administrator是什么意思
  12. 不重装系统的情况下对C盘扩容
  13. 马哥教育42期第一周作业
  14. 百练_2801:填词
  15. 卡内基梅隆大学计算机科学博士,2020年卡内基梅隆大学博士专业设置
  16. matlab积分求解(定积分/不定积分)总结
  17. android10 三星升级计划,三星公布Android 10.0国行升级计划:规模庞大
  18. 钢笔墨水能否代替打印机墨水_uv打印机喷头波形和墨水关系
  19. 科幻大作明日边缘首曝预告
  20. 452页13万字现代智慧乡镇雪亮工程整体解决方案2022版

热门文章

  1. spring学习--JdbcTemplate-查询返回-批量操作
  2. sqlmap能测试java么_ibatis框架如何测试?ibatis入门解析
  3. win10新建管理员账户_电脑技巧|Win10家庭版如何开启超级管理员账户
  4. three轨迹线在mapbox地图上显示
  5. 计算机的软件及功能是什么意思,M1版MacBook能兼容啥软件?超详细的兼容测试
  6. gmat模考_第一次完整模考总结,GmatPrep~~
  7. mc1.8.1怎么局域网java_同一台电脑同时装jdk1.8和jdk1.7
  8. 在的微型计算机系统中 外设可和,微机原理第七章题库
  9. python ggplot为什么不能取代matplotlib_为什么geom_bar()不会像python ggplot中那样更改填充颜色?...
  10. java读取word文档内容_Python读取PDF信息插入Word文档