在图像颜色模型中不同的分量存放在不同的通道中,如果我们只需要颜色模型的某一个分量,例如只需要处理RGB图像中的红色通道,可以将红色通道从三通道的数据中分离出来再进行处理,这种方式可以减少数据所占据的内存,加快程序的运行速度。同时,当我们分别处理完多个通道后,需要将所有通道合并在一起重新生成RGB图像。针对图像多通道的分离与混合,OpenCV 4中提供了split()函数和merge()函数用于解决这些需求。

多通道分离函数split()

OpenCV 4中针对多通道分离函数split()有两种重载原型,在代码清单3-4中给出了这两种函数原型。

void cv::split(const Mat & src,Mat * mvbegin)
void cv::split(InputArray m,OutputArrayOfArrays mv)
  • src:待分离的多通道图像。
  • mvbegin:分离后的单通道图像,为数组形式,数组大小需要与图像的通道数相同
  • m:待分离的多通道图像
  • mv:分离后的单通道图像,为向量vector形式
    该函数主要是用于将多通道的图像分离成若干单通道的图像,两个函数原型中不同之处在于前者第二个参数输入的是Mat类型的数组,其数组的长度需要与多通道图像的通道数相等并且提前定义;第二种函数原型的第二个参数输入的是一个vector容器,不需要知道多通道图像的通道数。两个函数原型虽然输入参数的类型不同,但是通道分离的原理是相同的,可以用公式(3.4)表示。

多通道合并函数merge()

OpenCV 4中针对多通道合并函数merge()也有两种重载原型,在代码清单3-5中给出了两种原型。

void cv::merge(const Mat * mv,size_t  count,OutputArray dst)
void cv::merge(InputArrayOfArrays mv,OutputArray dst)
  • mv:需要合并的图像数组,其中每个图像必须拥有相同的尺寸和数据类型。
  • count:输入的图像数组的长度,其数值必须大于0.
  • mv:需要合并的图像向量vector,其中每个图像必须拥有相同的尺寸和数据类型。
  • dst:合并后输出的图像,与mv[0]具有相同的尺寸和数据类型,通道数等于所有输入图像的通道数总和。

该函数主要是用于将多个图像合并成一个多通道图像,该函数也具有两种不同的函数原型,每一种函数原型都是与split()函数相对应,两种原型分别输入数组形式的图像数据和向量vector形式的图像数据,在输入数组形式数据的原型中,还需要输入数组的长度。合并函数的输出结果是一个多通道的图像,其通道数目是所有输入图像通道数目的总和。这里需要说明的是,用于合并的图像并非都是单通道的,也可以是多个通道数目不相同的图像合并成一个通道更多的图像,虽然这些图像的通道数目可以不相同,但是需要所有图像具有相同的尺寸和数据类型。

图像多通道分离与合并例程

为了使读者更加熟悉图像多通道分离与合并的操作,同时加深对图像不同通道作用的理解,在代码清单3-6中实现了图像的多通道分离与合并的功能。程序中用两种函数原型分别分离了RGB图像和HSV图像,为了验证merge ()函数可以合并多个通道不相同的图像,程序中分别用两种函数原型合并了多个不同通道的图像,合并后图像的通道数为5,不能通过imshow()函数显示,我们用Image Watch插件查看了合并的结果。由于RGB三个通道分离结果显示时都是灰色且相差不大,因此图3-5没有给出其分离后的结果,只给出合并后显示为绿色的合并图像,同时给出HSV分离结果,其他结果读者可以自行运行程序查看。

#include<iostream>
#include<vector>
#include<string>
#include <opencv2/opencv.hpp>
#include "opencv/highgui.h"using namespace std;
using namespace cv;int main(int argc,char** argv) {cout<<"OpenCv Version: "<<CV_VERSION<<endl;Mat img=imread("/home/wyh/Documents/C++demo/699342568.jpg");if(img.empty()){cout<<"请确认输入图片的名称是否正确"<<endl;return -1;}Mat HSV,dst;resize(img,dst,Size(img.cols*0.5,img.rows*0.5));cvtColor(dst,HSV,COLOR_BGR2HSV);Mat imgs0,imgs1,imgs2;//用于存放数组类型的结果Mat imgv0,imgv1,imgv2;//用于存放vector类型的结果Mat result0,result1,result2;//多通道合并的结果//输入数组参数的多通道分离与合并Mat imgs[3];split(dst,imgs);imgs0=imgs[0];imgs1=imgs[1];imgs2=imgs[2];imshow("RGB-R通道",imgs0);//显示分离后R通道的像素值imshow("RGB-G通道",imgs1);//显示分离后G通道的像素值imshow("RGB-B通道",imgs2);//显示分离后B通道的像素值imgs[2]=dst;//将数组中的图像通道数变成不统一merge(imgs,3,result0);//合并图像Mat zero=Mat::zeros(dst.rows,dst.cols,CV_8UC1);imgs[0]=zero;imgs[2]=zero;merge(imgs,3,result1);//用于还原G通道的真实情况,合并结果为绿色imshow("result1",result1);//显示合并结果//输入vector参数的多通道分离与合并vector<Mat>imgv;split(HSV,imgv);imgv0=imgv.at(0);imgv1=imgv.at(1);imgv2=imgv.at(2);imshow("HSV-H通道",imgv0);//显示分离后H通道的像素值imshow("HSV-S通道",imgv1);//显示分离后S通道的像素值imshow("HSV-V通道",imgv2);//显示分离后V通道的像素值imgv.push_back(HSV);//将vector中的图像通道数变成不统一merge(imgv,result2);//合并图像waitKey(0);return 0;
}

C++版本OpenCv教程(十一)多通道分离与合并相关推荐

  1. C++版本OpenCv教程

    C++版本OpenCv教程(一)Mat-基本的图像容器 目标 我们有多种方法从现实世界获取数字图像:数码相机.扫描仪.计算机断层扫描和磁共振成像等等.在以上任何情况下,我们(人类)看到的都是图像.然而 ...

  2. 【OpenCV 4开发详解】多通道分离与合并

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  3. C++版本OpenCv教程(六)namedWindow函数imshow函数的使用

    目录 图像窗口函数namedWindow 图像显示函数imshow 图像窗口函数namedWindow 在我们之前的程序中并没有见到窗口函数,因为我们在显示图像时如果没有主动定义图像窗口,程序会自动生 ...

  4. C++版本OpenCv教程(四十三)直线拟合

    前面介绍的函数都是寻找图像或者点集中是否存在直线,而有时我们明确已知获取到的数据在一条直线上,此时需要将所有数据拟合出一条直线,但是由于噪声的存在,这条直线可能不会通过大多数的数据,因此需要保证所有的 ...

  5. C++版本OpenCv教程(四十二)霍夫变换原理及直线检测

    霍夫变换(Hough Transform)是图像处理中检测是否存在直线的重要算法,该算法是由Paul Hough在1962年首次提出,最开始只能检测图像中的直线,但是霍夫变换经过不断的扩展和完善已经可 ...

  6. C++版本OpenCv教程(二十七)图像中添加高斯噪声

    OpenCV 4中同样没有专门为图像添加高斯噪声的函数,对照在图像中添加椒盐噪声的过程,我们可以根据需求利用能够产生随机数的函数来完成在图像中添加高斯噪声的任务.在OpenCV 4中提供了fill() ...

  7. C++版本OpenCv教程(二十四)直方图匹配

    直方图均衡化函数可以自动的改变图像直方图的分布形式,这种方式极大的简化了直方图均衡化过程中需要的操作步骤,但是该函数不能指定均衡化后的直方图分布形式.在某些特定的条件下需要将直方图映射成指定的分布形式 ...

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

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

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

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

最新文章

  1. oracle中按指定条数批量处理的方法
  2. 设置虚拟机和本机时间同步方法
  3. erlang mnesia数据库简单应用
  4. 前端读取文件图片信息流;js读取图片不同信息流;js读取图片;前端就js读取二进制数据;前端js读取文件流使用FileReader对象的readAsDataURL方法来读取图像文件;
  5. java peer_Java PeerConnection.getStats方法代码示例
  6. c语言while跳不出来,这个while循环终止了却跳不出来为什么
  7. 5g的基础知识,发展及现状
  8. 状态压缩动态规划 - 总结【普及+,提高-】
  9. .ps是什么格式_用Word修图,真的比PS简单十倍不止!可惜知道的人太少了......
  10. Heartbeat介绍
  11. python 变量 fields_理解Python数据类:Dataclass fields 的概述(下)
  12. 酒香不怕巷子深,有心人才找得到的京都茶寮
  13. mysql解决模糊查询包含关系
  14. 类型类 V.S. 桥接模式:撞衫不可怕,谁丑谁尴尬
  15. 小程序发布测试版本步骤
  16. 联想微型计算机设置从u盘启动,联想bios设置u盘启动教程
  17. Spring事务管理的总结
  18. [设计分析]3-1 v0.1 教学辅助——点名册外观详细设计
  19. UE4 pbr概念理解
  20. 20170909深度学习solar测试日志

热门文章

  1. 教育培训行业使用CRM管理系统有什么好处
  2. js中常用的Math函数方法
  3. 红警2尤里的复仇中文完整PC版
  4. flacs 安装教程_002.Nginx安装及启动
  5. cas4.2登出后,跳转指定链接
  6. 综合布线施工工艺--
  7. 计算机的用户终端,计算机终端、客户端、服务端都是什么概念,他们之间的区别是什么?谢谢,大家,小弟是菜鸟...
  8. Android - 屏幕适配
  9. 王者荣耀入门技能树-解答
  10. 创建微服务架构的步骤_如何快速搭建一个微服务架构?