注:文档摘至《OpenCV3编程入门》毛星云版
<1>通道分离: split()函数
split函数用于将一个多通道数组分离成几个单通道数组。这里的array 按语境翻译为数组或者阵列。split函数的C++版本有两个原型, 分别是:
• c ++: void split( const Mat& src, Mat*mvbegin);
• C++ : void split(InputArray m ,Outpu从nayOfArrays mv);
变量介绍如下:
· 第一个参数, InputArray 类型的m 或者const Mat&类型的src ,填我们需要进行分离的多通道数组。
· 第二个参数, OutputArrayOfArrays 类型的mv , 填函数的输出数组或者输出
的vector 容器。
split 函数分割多通道数组转换成独立的单通道数组,公式如下:
mv[c] (I)= src(I )c

<2>通道合并: merge()函数
merge() 函数是split() 函数的逆向操作将多个数组合并成一个多通道的数组。它通过组合一些给定的单通道数组,将这些孤立的单通道数组合并成一个多通道的数组,从而创建出一个由多个单通道阵列组成的多通道阵列。它有两个基于C十+的函数原型如下。
• C++: void merge(const Mat* mv, size_tcount, Ou阳山rray dst)
• C++: void merge( In putArrayO队rrays mv,OutputArray dst)
变量介绍如下。
· 第一个参数, mv 。填需要被合井的输入矩阵或vector 容器的阵列,这个mv 参数中所有的矩阵必须有着一样的尺寸和深度。
· 第二个参数, count。 当mv 为一个空白的C 数组时,代表输入矩阵的个数,这个参数显然必须大于1。
· 第三个参数, dst。即输出矩阵,和mv[0]拥有一样的尺寸和深度,井且通道的数量是矩阵阵列中的通道的总数。
函数解析如下。
merge 函数的功能是将一些数组合并成一个多通道的数组。关于组合的细节,输出矩阵中的每个元素都将是输出数组的串接。其中, 第i 个输入数组的元素被视为mv[i] 。 C 一般用其中的Mat: :at()方法对某个通道进行存取,也就是这样用:channels.at(0) 。
这里的Mat: :at()方法返回一个引用到指定的数组元素。注意是引用,相当于两者等价,也就是修改其中一个,另一个也会随之改变。
<实例>
头文件包含及命名空间

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;

实现多通道的图像混合

bool  MultiChannelBlending()
{//【0】定义相关变量Mat srcImage;Mat logoImage;vector<Mat> channels;Mat  imageBlueChannel;//=================【蓝色通道部分】=================//    描述:多通道混合-蓝色分量部分//============================================// 【1】读入图片logoImage= imread("dota_logo.jpg",0);srcImage= imread("dota_jugg.jpg");if( !logoImage.data ) { printf("Oh,no,读取logoImage错误~! \n"); return false; }if( !srcImage.data ) { printf("Oh,no,读取srcImage错误~! \n"); return false; }//【2】把一个3通道图像转换成3个单通道图像split(srcImage,channels);//分离色彩通道//【3】将原图的蓝色通道引用返回给imageBlueChannel,注意是引用,相当于两者等价,修改其中一个另一个跟着变imageBlueChannel= channels.at(0);//【4】将原图的蓝色通道的(500,250)坐标处右下方的一块区域和logo图进行加权操作,将得到的混合结果存到imageBlueChannel中addWeighted(imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows)),1.0,logoImage,0.5,0,imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows)));//【5】将三个单通道重新合并成一个三通道merge(channels,srcImage);//【6】显示效果图namedWindow(" <1>游戏原画+logo蓝色通道");imshow(" <1>游戏原画+logo蓝色通道",srcImage);//=================【绿色通道部分】=================//   描述:多通道混合-绿色分量部分//============================================//【0】定义相关变量Mat  imageGreenChannel;//【1】重新读入图片logoImage= imread("dota_logo.jpg",0);srcImage= imread("dota_jugg.jpg");if( !logoImage.data ) { printf("读取logoImage错误~! \n"); return false; }if( !srcImage.data ) { printf("读取srcImage错误~! \n"); return false; }//【2】将一个三通道图像转换成三个单通道图像split(srcImage,channels);//分离色彩通道//【3】将原图的绿色通道的引用返回给imageBlueChannel,注意是引用,相当于两者等价,修改其中一个另一个跟着变imageGreenChannel= channels.at(1);//【4】将原图的绿色通道的(500,250)坐标处右下方的一块区域和logo图进行加权操作,将得到的混合结果存到imageGreenChannel中addWeighted(imageGreenChannel(Rect(500,250,logoImage.cols,logoImage.rows)),1.0,logoImage,0.5,0.,imageGreenChannel(Rect(500,250,logoImage.cols,logoImage.rows)));//【5】将三个独立的单通道重新合并成一个三通道merge(channels,srcImage);//【6】显示效果图namedWindow("<2>游戏原画+logo绿色通道");imshow("<2>游戏原画+logo绿色通道",srcImage);//=================【红色通道部分】=================// 描述:多通道混合-红色分量部分//============================================//【0】定义相关变量Mat  imageRedChannel;//【1】重新读入图片logoImage= imread("dota_logo.jpg",0);srcImage= imread("dota_jugg.jpg");if( !logoImage.data ) { printf("Oh,no,读取logoImage错误~! \n"); return false; }if( !srcImage.data ) { printf("Oh,no,读取srcImage错误~! \n"); return false; }//【2】将一个三通道图像转换成三个单通道图像split(srcImage,channels);//分离色彩通道//【3】将原图的红色通道引用返回给imageBlueChannel,注意是引用,相当于两者等价,修改其中一个另一个跟着变imageRedChannel= channels.at(2);//【4】将原图的红色通道的(500,250)坐标处右下方的一块区域和logo图进行加权操作,将得到的混合结果存到imageRedChannel中addWeighted(imageRedChannel(Rect(500,250,logoImage.cols,logoImage.rows)),1.0,logoImage,0.5,0.,imageRedChannel(Rect(500,250,logoImage.cols,logoImage.rows)));//【5】将三个独立的单通道重新合并成一个三通道merge(channels,srcImage);//【6】显示效果图namedWindow("<3>游戏原画+logo红色通道 ");imshow("<3>游戏原画+logo红色通道 ",srcImage);return true;
}

测试一下

int main(   )
{system("color 9F");if(MultiChannelBlending( )){cout<<endl<<"\n运行成功,得出了需要的图像~! ";}waitKey(0);return 0;
}

效果图如下:

基于openCV3的颜色通道分离及多通道图像混合相关推荐

  1. OpenCV系列四 --- 颜色通道分离与多通道图像混合

    今天呢,我们一起来学习彩色图像的颜色通道分离与多通道图像混合,一般情况下,我们大多数看到的图像都是基于RGB颜色通道的图像,因此要实现颜色通道的分离,即要将R.G.B三个通道分离,而多通道图像混合,即 ...

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

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

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

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

  4. 【OpenCV C++】分离颜色通道多通道图像混合

    分离颜色通道&多通道图像混合 一.分离颜色通道 <1>split函数详解 <2>merge函数详解 二.多通道图像混合示例程序 本系列文章由@浅墨_毛星云 出品,转载请 ...

  5. 【OpenCV(C++)】分离颜色通道、多通道图像混合

    [OpenCV(C++)]分离颜色通道.多通道图像混合 通道分离:split()函数 通道合并:merge()函数 多通道图像混合实例 为了更好地观察一些图像材料的特征,需要对RGB三个颜色通道的分量 ...

  6. pythpn实现bgr颜色通道分离,并分别显示一副彩色图片的BGR通道图片

    分别显示一副彩色图片的B,G,R通道图片 要实现这个功能,原理很简单. 一张彩图有三个颜色通道,显示哪个就将另外两个通道置0 代码 import cv2 as cv img = cv.imread(' ...

  7. 【计算机视觉】EmguCV学习笔记(4)分离颜色通道以及多通道图像混合

    如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习. If you like the content here, you can give me the greates ...

  8. OpenCV开发笔记(十):OpenCV图像颜色通道分离和图像颜色多通道混合

    若该文为原创文章,未经允许不得转载 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/101420314 各位读者,知识无穷而人力有穷, ...

  9. 三通道图像转化为三通道,并将多通道图像混合

    #include<cv.h> #include<highgui.h> #include<iostream> using namespace cv; using na ...

最新文章

  1. 神经网络参数量的计算:以UNet为例
  2. 大受褒扬,BCH中国开发者走向世界!
  3. 南京大学「自然指数」超越清华北大,位列全国高校第一、世界第七,突显学术实力...
  4. C++拷贝构造函数(深拷贝,浅拷贝)
  5. Java中的内存泄露的几种可能
  6. LIMIT M,N分页性能优化方案
  7. python读取xml文件内容显示不全_python读取xml文件时的问题
  8. php 声音文件链 处理,PHP 三种方式实现链式操作
  9. 《MATLAB R2012a超级学习手册》一第1章 MATLAB概述
  10. 大数据可视化的方法和价值
  11. 树莓派4B Ubuntu20.04 ROS2 ORB-SLAM3
  12. mybaits.xml文件约束,头部
  13. 冒泡排序(java)——3种方法
  14. 2020年《时间的朋友》跨年演讲金句集锦
  15. springboot毕设项目东莞汉庭酒店的酒店管理系统的设计与实现4ccnv(java+VUE+Mybatis+Maven+Mysql)
  16. Vue.js框架简介(1)
  17. miui11升级鸿蒙,这就是MIUI 11的升级机型名单?还挺给力!
  18. python贴吧数据可视化软件_Python数据可视化工具之Pyecharts初体验
  19. IMS QTI 实践指南 | 01 简单题型 Simple Items
  20. poj 2480 python_python-pptx:是一个python处理ppt的库

热门文章

  1. 分布式文件系统HDFS
  2. Hadoop MapReduce八大步骤以及Yarn工作原理详解
  3. 修改Android10系统源码支持手机永不休眠
  4. ecif在银行的意思,国结概念
  5. SPL MTC MK2新一代监听控制器已发布
  6. KYLIN_HOME is set to /home/lqs/module/kylin
  7. 【有奖互动】2019 最难忘的三行代码
  8. Java_JDK动态代理学习笔记
  9. 计算机基础-查看与电脑相连设备的IP地址
  10. 侯捷 C++面向对象高级开发(下)笔记整理