Opencv3编程入门学习笔记(五)之通道分离(split)与合并(merge)
若要对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)相关推荐
- Opencv3编程入门学习笔记(四)之split通道分离Debug过程中0xC0000005内存访问冲突问题
这是笔者学习<Opencv3编程入门>的第四篇博客,这篇博客主要是解决在Windows系统下VS 2013中Debug含有split分离通道色彩函数时报出的0xC0000005内存访问冲突 ...
- 原创 OpenCV3编程入门 学习笔记(总)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_36163358/article/ ...
- OpenCV3编程入门 学习笔记(总)
OpenCV3编程入门 学习笔记 2018.12.12-2018.12.29 此博客为在看过毛星云版<OpenCV3编程入门>后所总结的一本笔记,可供复习使用. 文章目录 OpenCV3编 ...
- 【OpenCV3编程入门学习笔记】——第3章 HighGUI图形用户界面初步
文章目录 前言 3.1 图形的载入.显示和输出到文件 3.1.1 OpenCV的命名空间 3.1.2 Mat类简析 3.1.3 图像的载入与显示概述 3.1.4 图像的载入:imread()函数 3. ...
- 【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV
邂逅OpenCV 文章目录 邂逅OpenCV 前言 1.1 OpenCV周边概念认知 1.1.1 图像处理.计算机视觉与OpenCV 1.1.2 OpenCV概述 1.1.3 起源及发展 1.1.4 ...
- Opencv3编程入门学习笔记(三)之访问图像像素的三种方法
访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...
- Opencv3编程入门学习笔记(二)之显式创建Mat对象
以下总结是基于<Opencv3编程入门>一书4.1节总结的内容进行验证与总结,验证环境均为Windows10 ---VS2013 C++环境,验证Opencv3.0提供的开发包. 1. 方 ...
- Python快速编程入门#学习笔记03# |第二章 :Python基础(代码格式、标识符关键字、变量和数据类型、数字类型以及运算符)
全文目录 ==先导知识== 学习目标: 2.1 代码格式 2.1.1 注释 2.1.2 缩进 2.1.3 语句换行 2.2 标识符和关键字 2.2.1 标识符 2.2.2 关键字 2.3 变量和数据类 ...
- 01.Java 编程入门学习笔记20210307
Java 编程入门学习笔记-day01 第0章:编程入门 1.计算机的概述 计算机 = 硬件 + 软件 1.1硬件:冯诺依曼体系 CPU: CPU的衡量标准:速度的计量单位是赫兹(Hz),1Hz相当于 ...
最新文章
- python填写excel-python读写Excel
- ElasticSearch学习笔记(二)—结构了解和索引文档增删改
- QML基础类型之vector4d
- C语言能否写windows应用程序,C语言能写windows的窗口吗?
- 3,进程间通信IPC机制,线程,线程通信,互斥锁
- Python机器学习:逻辑回归001什么是逻辑回归
- Hadoop大数据技术课程设计说明
- 2021深圳杯数学建模D题分析见解
- 二叉树非递归遍历思路总结
- win10 小娜搜索空白
- 三国志战略版360区S4服务器合并信息,三国志战略版s3赛季服务器合并与规则一览...
- 高中上计算机专业用买电脑吗,我是高中毕业生,要上大学该买什么电脑?
- 计算机网络 计算路由表
- 面对流氓软件,是逃避还是反击?(连载三、未来的流氓软件)
- 1248码转换成ABCD
- 上顿号符号_标点符号(1):谈谈顿号的用法
- 服务器 php 版本低,php 版本过低 怎么修改?
- 如何做好建筑行业的信息化建设?
- 7-1 求两点之间距离
- 中职计算机教学游戏化,中职美术游戏化学习的设计与应用研究