若要对Opencv中(BGR)颜色通道进行单一处理,那必然会涉及到通道分离(split)与合并(merge)。那么本篇博客笔者记录了两个方法的使用方法和案例。案例来源于《Opencv3编程入门学习》。

0. 环境

系统:Windows 10
平台:VS 2013
OpenCV版本:Opencv 3.0

1. split()通道分离函数

void split(const Mat& src, Mat* mvbegin);
void split(InputArray m, OutputArrayOfArrays mv);

第一个参数:即是原图像;
第二个参数:mvbegin,是一个Mat类型的一个数组,通常这个数组都是[3]的大小,这个数组大小表示的是通道个数,mvbegin就是指的将原图像按照(BGR)通道顺序逐一进行存储的单通道数组。通常可以用vector mvbegin的方式进行定义。

2. merge()通道合并函数

void merge(const Mat* mv, size_tcount, OutputArray dst);
void merge(InputArrayOfArrays mv, OutputArray dst);

第一个参数:mv,单通道图像数组,在split函数的第二个参数有解释;
第二个参数:size_tcoutn,当mv为一个空白的C数组时,代表输入矩阵的个数,参数要大于1;
第三个参数:dst,合并后的图像。

3. 使用案例

#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
//#include <opencv2\opencv.hpp>
#include<iostream>using namespace cv;
using namespace std;bool MultiChannelBlending()
{Mat srcImage;Mat logoImage;vector<Mat> channels;Mat imageBlueChannel, imageGreenChannel, imageRedChannel;//channels.resize(3);//=====================蓝色通道=====================//描述:多通道混合-蓝色分量部分//==================================================srcImage = imread("dota_jugg.jpg");logoImage = imread("dota_logo.jpg", 0);if (!srcImage.data){ printf("读取srcImage图像错误!\n"); return false; }if (!logoImage.data){ printf("读取logoImage图像错误!\n"); return false; }split(srcImage, channels);//分离色彩通道imageBlueChannel = channels.at(0);addWeighted(imageBlueChannel(Rect(500, 250, logoImage.cols, logoImage.rows)),1.0,logoImage,0.5,0,imageBlueChannel(Rect(500, 250, logoImage.cols, logoImage.rows)));merge(channels, srcImage);//合并色彩通道namedWindow("【多通道混合-蓝】");imshow("【多通道混合-蓝】", srcImage);//=====================绿色通道=====================//描述:多通道混合-绿色分量部分//==================================================srcImage = imread("dota_jugg.jpg");logoImage = imread("dota_logo.jpg", 0);if (!srcImage.data){ printf("读取srcImage图像错误!\n"); return false; }if (!logoImage.data){ printf("读取logoImage图像错误!\n"); return false; }split(srcImage, channels);//分离色彩通道imageGreenChannel = channels.at(1);addWeighted(imageGreenChannel(Rect(500, 250, logoImage.cols, logoImage.rows)),1.0,logoImage,0.5,0,imageGreenChannel(Rect(500, 250, logoImage.cols, logoImage.rows)));merge(channels, srcImage);namedWindow("【多通道混合-绿】");imshow("【多通道混合-绿】", srcImage);//=====================红色通道=====================//描述:多通道混合-红色分量部分//==================================================srcImage = imread("dota_jugg.jpg");logoImage = imread("dota_logo.jpg", 0);if (!srcImage.data){ printf("读取srcImage图像错误!\n"); return false; }if (!logoImage.data){ printf("读取logoImage图像错误!\n"); return false; }split(srcImage, channels);//分离色彩通道imageRedChannel = channels.at(2);addWeighted(imageRedChannel(Rect(500, 250, logoImage.cols, logoImage.rows)),1.0,logoImage,0.5,0,imageRedChannel(Rect(500, 250, logoImage.cols, logoImage.rows)));merge(channels, srcImage);namedWindow("【多通道混合-红】");imshow("【多通道混合-红】", srcImage);return true;
}void main()
{system("color 9F");//控制台背景色设置if (MultiChannelBlending()){cout << endl << "\n运行成功,得出了需要的图像!";}waitKey(0);
}

4. 效果

5. 注意

在使用split函数过程中,如果是Debug版本运行极有可能碰到“0xC0000005内存访问冲突问题”,若遇到可参考笔者上篇blog进行解决。

6. 结束语

本次博客源于《Opencv3编程入门》一书中5.3分离颜色通道、多通道图像混合一小节内容的总结,大部分离不开书上内容,对于两个函数,笔者部分做出了个人的理解,如理解有误,望大家指出。

Opencv3编程入门学习笔记(五)之通道分离(split)与合并(merge)相关推荐

  1. Opencv3编程入门学习笔记(四)之split通道分离Debug过程中0xC0000005内存访问冲突问题

    这是笔者学习<Opencv3编程入门>的第四篇博客,这篇博客主要是解决在Windows系统下VS 2013中Debug含有split分离通道色彩函数时报出的0xC0000005内存访问冲突 ...

  2. 原创 OpenCV3编程入门 学习笔记(总)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_36163358/article/ ...

  3. OpenCV3编程入门 学习笔记(总)

    OpenCV3编程入门 学习笔记 2018.12.12-2018.12.29 此博客为在看过毛星云版<OpenCV3编程入门>后所总结的一本笔记,可供复习使用. 文章目录 OpenCV3编 ...

  4. 【OpenCV3编程入门学习笔记】——第3章 HighGUI图形用户界面初步

    文章目录 前言 3.1 图形的载入.显示和输出到文件 3.1.1 OpenCV的命名空间 3.1.2 Mat类简析 3.1.3 图像的载入与显示概述 3.1.4 图像的载入:imread()函数 3. ...

  5. 【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV

    邂逅OpenCV 文章目录 邂逅OpenCV 前言 1.1 OpenCV周边概念认知 1.1.1 图像处理.计算机视觉与OpenCV 1.1.2 OpenCV概述 1.1.3 起源及发展 1.1.4 ...

  6. Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

    访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...

  7. Opencv3编程入门学习笔记(二)之显式创建Mat对象

    以下总结是基于<Opencv3编程入门>一书4.1节总结的内容进行验证与总结,验证环境均为Windows10 ---VS2013 C++环境,验证Opencv3.0提供的开发包. 1. 方 ...

  8. Python快速编程入门#学习笔记03# |第二章 :Python基础(代码格式、标识符关键字、变量和数据类型、数字类型以及运算符)

    全文目录 ==先导知识== 学习目标: 2.1 代码格式 2.1.1 注释 2.1.2 缩进 2.1.3 语句换行 2.2 标识符和关键字 2.2.1 标识符 2.2.2 关键字 2.3 变量和数据类 ...

  9. 01.Java 编程入门学习笔记20210307

    Java 编程入门学习笔记-day01 第0章:编程入门 1.计算机的概述 计算机 = 硬件 + 软件 1.1硬件:冯诺依曼体系 CPU: CPU的衡量标准:速度的计量单位是赫兹(Hz),1Hz相当于 ...

最新文章

  1. python填写excel-python读写Excel
  2. ElasticSearch学习笔记(二)—结构了解和索引文档增删改
  3. QML基础类型之vector4d
  4. C语言能否写windows应用程序,C语言能写windows的窗口吗?
  5. 3,进程间通信IPC机制,线程,线程通信,互斥锁
  6. Python机器学习:逻辑回归001什么是逻辑回归
  7. Hadoop大数据技术课程设计说明
  8. 2021深圳杯数学建模D题分析见解
  9. 二叉树非递归遍历思路总结
  10. win10 小娜搜索空白
  11. 三国志战略版360区S4服务器合并信息,三国志战略版s3赛季服务器合并与规则一览...
  12. 高中上计算机专业用买电脑吗,我是高中毕业生,要上大学该买什么电脑?
  13. 计算机网络 计算路由表
  14. 面对流氓软件,是逃避还是反击?(连载三、未来的流氓软件)
  15. 1248码转换成ABCD
  16. 上顿号符号_标点符号(1):谈谈顿号的用法
  17. 服务器 php 版本低,php 版本过低 怎么修改?
  18. 如何做好建筑行业的信息化建设?
  19. 7-1 求两点之间距离
  20. 中职计算机教学游戏化,中职美术游戏化学习的设计与应用研究

热门文章

  1. php防止恶意充值,php防止恶意刷新与刷票的方法
  2. http java ssl_使用HttpClient通过HTTPS信任所有证书
  3. Linux就应该这么学第七课-文件的特殊权限
  4. Matplotlib基础全攻略
  5. 初识面向对象(理论1)
  6. 前端常用linux命令
  7. 配置View桌面时找不到域的解决方法
  8. Spring 2.0技术手册 下载
  9. 分享我做的博客园Skin(目前12个,最后更新时间2006-5-10 PM)
  10. html中两个标签上对齐,css将两个元素水平对齐的方法(兼容IE8)