本文首发于“小白学视觉”微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究!


经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

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

多通道分离函数split()

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

代码清单3-4 split()函数原型
1.  void cv::split(const Mat &  src,
2.                   Mat *  mvbegin
3.                    )
4.
5.  void cv::split(InputArray   m,
6.                   OutputArrayOfArrays  mv
7.                   )
  • src:待分离的多通道图像。
  • mvbegin:分离后的单通道图像,为数组形式,数组大小需要与图像的通道数相同
  • m:待分离的多通道图像
  • mv:分离后的单通道图像,为向量vector形式

该函数主要是用于将多通道的图像分离成若干单通道的图像,两个函数原型中不同之处在于前者第二个参数输入的是Mat类型的数组,其数组的长度需要与多通道图像的通道数相等并且提前定义;第二种函数原型的第二个参数输入的是一个vector容器,不需要知道多通道图像的通道数。两个函数原型虽然输入参数的类型不同,但是通道分离的原理是相同的,可以用公式(3.4)表示。
mv[c](I)=src(I)c(3.4)mv\left[ c \right](I) = src{(I)_c} \tag{3.4}mv[c](I)=src(I)c​(3.4)

多通道合并函数merge()

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

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

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

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

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

代码清单3-6 mySplitAndMerge.cpp实现图像分离与合并
1.  #include <opencv2\opencv.hpp>
2.  #include <iostream>
3.  #include <vector>
4.
5.  using namespace std;
6.  using namespace cv;
7.
8.  int main()
9.  {10.     Mat img = imread("lena.png");
11.     if (img.empty())
12.     {13.         cout << "请确认图像文件名称是否正确" << endl;
14.         return -1;
15.     }
16.     Mat HSV;
17.     cvtColor(img, HSV, COLOR_RGB2HSV);
18.     Mat imgs0, imgs1, imgs2;  //用于存放数组类型的结果
19.     Mat imgv0, imgv1, imgv2;  //用于存放vector类型的结果
20.     Mat result0, result1, result2;  //多通道合并的结果
21.
22.     //输入数组参数的多通道分离与合并
23.     Mat imgs[3];
24.     split(img, imgs);
25.     imgs0 = imgs[0];
26.     imgs1 = imgs[1];
27.     imgs2 = imgs[2];
28.     imshow("RGB-R通道", imgs0);  //显示分离后R通道的像素值
29.     imshow("RGB-G通道", imgs1);  //显示分离后G通道的像素值
30.     imshow("RGB-B通道", imgs2);  //显示分离后B通道的像素值
31.     imgs[2] = img;  //将数组中的图像通道数变成不统一
32.     merge(imgs, 3, result0);  //合并图像
33.     //imshow("result0", result0);  //imshow最多显示4个通道,因此结果在Image Watch中查看
34.     Mat zero = cv::Mat::zeros(img.rows, img.cols, CV_8UC1);
35.     imgs[0] = zero;
36.     imgs[2] = zero;
37.     merge(imgs, 3, result1);  //用于还原G通道的真实情况,合并结果为绿色
38.     imshow("result1", result1);  //显示合并结果
39.
40.     //输入vector参数的多通道分离与合并
41.     vector<Mat> imgv;
42.     split(HSV, imgv);
43.     imgv0 = imgv.at(0);
44.     imgv1 = imgv.at(1);
45.     imgv2 = imgv.at(2);
46.     imshow("HSV-H通道", imgv0);  //显示分离后H通道的像素值
47.     imshow("HSV-S通道", imgv1);  //显示分离后S通道的像素值
48.     imshow("HSV-V通道", imgv2);  //显示分离后V通道的像素值
49.     imgv.push_back(HSV);  //将vector中的图像通道数变成不统一
50.     merge(imgv, result2);  //合并图像
51.      //imshow("result2", result2);  /imshow最多显示4个通道,因此结果在Image Watch中查看
52.     waitKey(0);
53.     return 0;
54. }

图3-5 splitAndMerge.cpp运行部分结果

OpenCV 4开发详解
往期推荐
【OpenCV 4开发详解】Windows系统中安装OpenCV 4
【OpenCV 4开发详解】Ubuntu系统中安装OpenCV 4
【OpenCV 4开发详解】opencv_contrib扩展模块的安装
【OpenCV 4开发详解】Image Watch插件的使用
【OpenCV 4开发详解】安装过程中问题解决方案
【OpenCV 4开发详解】了解OpenCV的模块架构
【OpenCV 4开发详解】Mat类介绍
【OpenCV 4开发详解】Mat类构造与赋值
【OpenCV 4开发详解】4种读取Mat类元素的的方法
【OpenCV 4开发详解】图像的读取与显示
【OpenCV 4开发详解】视频加载与摄像头调用
【OpenCV 4开发详解】图像与视频的保存
【OpenCV 4开发详解】保存和读取XML和YMAL文件
【OpenCV 4开发详解】颜色模型与转换
经过几个月的努力,市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》将春节后由人民邮电出版社发行。如果小伙伴觉得内容有帮助,希望到时候多多支持!
关注小白的小伙伴可以提前看到书中的内容,我们创建了学习交流群,欢迎各位小伙伴添加小白微信加入交流群,添加小白时请备注“学习OpenCV 4”。

【OpenCV 4开发详解】多通道分离与合并相关推荐

  1. 【OpenCV 4开发详解】图像二值化

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

  2. 【OpenCV 4开发详解】形态学应用

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

  3. 【OpenCV 4开发详解】Laplacian算子

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

  4. 【OpenCV 4开发详解】Scharr算子

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

  5. 【OpenCV 4开发详解】Sobel算子

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

  6. 【OpenCV 4开发详解】边缘检测原理

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

  7. 【OpenCV 4开发详解】中值滤波

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

  8. 【OpenCV 4开发详解】可分离滤波

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

  9. 【OpenCV 4开发详解】高斯滤波

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

最新文章

  1. 第三代基因测序技术革新 云计算的应用
  2. 没有数据的MySql导出架构
  3. Python 学习笔记 (8)—— sys模块
  4. 环境复制_PostgreSQL热备之流复制环境搭建以及常见问题处理
  5. Python3——JSON
  6. 8.霍夫变换:线条——基本的霍夫变换算法、霍夫变换的复杂性、霍夫例子_3
  7. 前端智勇大闯关-第二季-第三题
  8. php 检测 变量是否设置,php如何判断变量是否有设置的函数
  9. C#积木游戏(改编自DevExpress GridTetris)
  10. 怎样维修无图纸电路板?
  11. dB,dBm W之换算关系
  12. 计算机室教师使用制度,[最新]教师计算机室管理制度
  13. 【PCL】PCL点云库介绍及VS环境配置
  14. uniapp使用plus.sqlite实现图片、视频缓存到手机本地
  15. 哈尔滨计算机管理,哈尔滨戴斯酒店计算机管理完整系统.doc
  16. python的io模块
  17. 超详细的WMS仓储管理系统介绍——补货篇
  18. 太棒了!CSS颜色基本样式
  19. 修改svn服务器默认端口号,svn服务器地址 不要端口号
  20. 白天嗜睡很可能是表观遗传变化的结果

热门文章

  1. 工程实践也能拿KDD最佳论文?解读Embeddings at Airbnb
  2. AI一分钟 | 南大用算法匹配室友,降低矛盾概率;丰田向Uber投5亿美元
  3. 前沿 | DeepMind 最新研究——神经算术逻辑单元,有必要看一下!
  4. Space X的火箭上天,Tesla的业绩落地
  5. 一周AI回顾 | 特斯拉AI负责人说神经网络正在改变编程,机器学习大神Bengio新论文专注RNN优化
  6. RabbitMQ 延迟队列,太实用了!
  7. 后端必备 Git 分支开发:规范指南
  8. 拼手速抢红包!送大家现金红包!
  9. 吴 恩 达 教 你 做 机 器 学 习 职 业 规 划
  10. 最新汇总!这些高校已确定开学时间!