Opencv-C++笔记 (9) : opencv-多通道分离和合并

文章目录

  • 一、概论
  • 二、多通道分离函数split()
  • 三、多通道合并函数merge()
  • 四、图像多通道分离与合并例程

一、概论

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

  • 通道分离 - split() 通道合并
  • merge() 通道混合
  • mixChannels()

二、多通道分离函数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中给出了两种原型。多通道合并函数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形式的图像数据,在输入数组形式数据的原型中,还需要输入数组的长度。合并函数的输出结果是一个多通道的图像,其通道数目是所有输入图像通道数目的总和。这里需要说明的是,用于合并的图像并非都是单通道的,也可以是多个通道数目不相同的图像合并成一个通道更多的图像,虽然这些图像的通道数目可以不相同,但是需要所有图像具有相同的尺寸和数据类型

//函数定义
void channels_demo(Mat& image);

//函数实现—
void QuickDemo::channels_demo(Mat& image) {

	Mat mvt[3];
	/*
	第一种方式
		通过创建图像数组,存储每个单通道图像
	*/
	split(image, mvt);

	imshow("蓝色单通道", mvt[0]);
	imshow("绿色单通道", mvt[1]);
	imshow("蓝色单通道", mvt[2]);
}
void QuickDemo::channels_demo(Mat& image) {

	std::vector<Mat> mvt;
	/*
	第二种方式
		通过创建动态数组,存储每个单通道图像
	*/
	split(image, mvt);

	imshow("蓝色单通道", mvt[0]);
	imshow("绿色单通道", mvt[1]);
	imshow("红色单通道", mvt[2]);
}

这里我们进行一个演示,实现如下通道的混合

0通道→2通道
1通道不变
2通道→1通道

这个混合的意思是,彩色图像本来是bgr的顺序,经过通道混合就变成了rgb。

0通道的单通道图像,变成了2通道的单通道图像
1通道不变
2通道的单通道图像,变成了0通道的单通道图像

void QuickDemo::channels_demo(Mat& image) {

	Mat dst = Mat::zeros(image.size(), image.type());

	int from_to[] = { 0,2,1,1,2,0 };

	mixChannels(&image, 1, &dst, 1, from_to, 3);
	
	imshow("通道混合",dst);
}

在这里插入图片描述
在这里插入图片描述

Mat bgra( 100, 100, CV_8UC4, Scalar(255,0,0,255) );
Mat bgr( bgra.rows, bgra.cols, CV_8UC3 );
Mat alpha( bgra.rows, bgra.cols, CV_8UC1 );
// forming an array of matrices is a quite efficient operation,
// because the matrix data is not copied, only the headers
Mat out[] = { bgr, alpha };
// bgra[0] -> bgr[2], bgra[1] -> bgr[1],
// bgra[2] -> bgr[0], bgra[3] -> alpha[0]
int from_to[] = { 0,2, 1,1, 2,0, 3,3 };
mixChannels( &bgra, 1, out, 2, from_to, 4 );

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

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

void QuickDemo::channels_demo(Mat& image) {

	Mat mvt[3];
	
	split(image, mvt);

	imshow("蓝色单通道", mvt[0]);
	imshow("绿色单通道", mvt[1]);
	imshow("红色单通道", mvt[2]);

	Mat dst;
	
	merge(mvt,3,dst);
	/*
	这里的3指,共有3个单通道图像
	*/
	imshow("分离再合并",dst);

}
void QuickDemo::channels_demo(Mat& image) {

	std::vector<Mat> mvt;

	split(image, mvt);

	imshow("蓝色单通道", mvt[0]);
	imshow("绿色单通道", mvt[1]);
	imshow("红色单通道", mvt[2]);

	Mat dst;

	merge(mvt, dst);

	imshow("分离再合并",dst);

}
#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;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/31220.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法之堆排序

目录 堆排序概述代码实现时间复杂度堆排序概述 堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。…

基于SSM的电影院购票系统开源啦

大家好&#xff0c;今天给大家带来一款SSM的电影院售票系统&#xff0c;非常不错的一个项目&#xff0c;学习javaweb编程必备。 下载地址在文末 1.SpringMVC Spring MVC属于SpringFrameWork的后续产品&#xff0c;已经融合在Spring Web Flow 里面。Spring 框架提供了构建 Web …

香橙派4 2. 驱动usb2.0芯片cy7c68013

0. 环境 - 香橙派4&#xff08;Orangepi4_2.1.2_ubuntu_bionic_desktop_linux4.4.179.img&#xff09; - EZ-USB FX2LP CY7C68013A USB 核心板 1. 下载FX3_SDK_1.3.4_linux EZ-USB™ FX3 Software Development Kit https://www.infineon.com/cms/en/design-support/tools/sdk…

实时在线云消费机、考勤门禁控制器、网络读卡器服务端C# Socket源码

消费机UDP通讯协议介绍&#xff1a; 设备向服务器发送的指令格式&#xff0c;每个字段用半角逗号(,)分隔。序号指令名称指令格式指令说明示例1响应服务器的搜索100,包序列号,终端IP,子网掩码,网关IP,远程电脑主机IP,端口号,终端硬件号响应电脑发出的搜寻局域网内所有终端设备指…

VCL界面控件DevExpress VCL v23.1.3全新首发 - 支持Windows 11新主题

DevExpress VCL Controls是Devexpress公司旗下最老牌的用户界面套包&#xff0c;所包含的控件有&#xff1a;数据录入、图表、数据分析、导航、布局等。该控件能帮助您创建优异的用户体验&#xff0c;提供高影响力的业务解决方案&#xff0c;并利用您现有的VCL技能为未来构建下…

设计模式之模板方法模式笔记

设计模式之模板方法模式笔记 说明Template Method(模板方法)目录模板方法模式示例类图抽象类包菜类菜心类测试类 说明 记录下学习设计模式-模板方法模式的写法。JDK使用版本为1.8版本。 Template Method(模板方法) 意图:定义一个操作中的算法骨架&#xff0c;而将一些步骤延…

LeetCode - #81 搜索旋转排序数组 II

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

redis缓存设计-Redis(八)

上篇文章介绍了redis缓存设计&#xff0c;热点key&#xff0c;bigkey注意事项。 原创 redis缓存设计-Redis&#xff08;七&#xff09;https://blog.csdn.net/ke1ying/article/details/131268967 命令使用 hgetall&#xff0c;lrange&#xff0c;smembers&#xff0c;zrange…

兼容性测试如何提高网站的安全性?

兼容性测试如何提高网站的安全性? 在今天的互联网时代&#xff0c;随着各种网络攻击和黑客活动的频繁发生&#xff0c;网站的安全性问题越来越引起人们的关注。而在提高网站安全性方面&#xff0c;兼容性测试是一个非常重要的环节。本文将从什么是兼容性测试、为什么兼容性测试…

Excel 2021入门指南:详细解读常用功能

软件安装&#xff1a;办公神器office2021安装教程&#xff0c;让你快速上手_正经人_____的博客-CSDN博客 一、 新建工作表 打开Excel 2021后&#xff0c;可以看到左上角的“文件”选项&#xff0c;在弹出的菜单中选择“新建”选项&#xff0c;然后可以选择使用空白工作表或者…

软考A计划-系统集成项目管理工程师-一般补充知识-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

django新手教程

Django简介 Django是开源的、大而且全的Web应用框架。 它独具特色&#xff0c;采用了MTV设计模式。 它也是一款用来构建服务器的框架。这一概念如何理解呢&#xff1f; 应用程序有两种模式&#xff1a;C/S、B/S。 C/S是客户端与服务器端&#xff0c;这类程序一般能独立运行…

搭建环境【2】windows主机和ubuntu互传文件的4种方法

我的ubuntu系统是安装在 VMware 虚拟机中的&#xff0c;两者之间经常要互传文件&#xff0c;下面介绍4种常用的互传文件方法。 1. 共享文件夹方式互传 在虚拟机中需要开启共享文件夹的功能。首先虚拟机中的ubuntu要求是已经开机了的状态&#xff0c;然后进行设置&#xff1a;…

浅谈【AI、算力赋能】“大算力”时代的到来

&#x1f53b;一、【&#x1f4a3; 话题引入&#xff1a;“AI算力最强龙头”&#xff0c;你怎么看&#xff1f;】 &#x1f648; AI人工智能是否可以取代人类&#xff1f;    &#x1f648; 应不应该限制人工智能的发展&#xff1f;      &#x1f648; AI研究及龙头行业迎…

【ARM AMBA AXI 入门 9 - AXI 总线 AxPROT 与安全之间的关系 】

文章目录 介绍ARM Trustzone的安全扩展简介 1.1 AXI AxPROT 介绍1.1.1 AXI 对 Trustzone的支持 介绍 ARMv8 架构中的AXI&#xff08;Advanced eXtensible Interface&#xff09;总线与NS&#xff08;Non-Secure&#xff09;位密切相关。NS位是指在ARM TrustZone安全扩展中定义…

养老院人员跌倒检测识别算法

养老院人员跌倒检测识别预警系统通过yolov5python网络模型技术&#xff0c;养老院人员跌倒检测识别预警算法对跌倒事件进行识别和分析&#xff0c;当检测到有人员跌倒时&#xff0c;将自动发出警报提示相关人员及时采取措施。YOLOv5是一种单阶段目标检测算法&#xff0c;该算法…

ASP.NET Core MVC 从入门到精通之日志管理

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…

归一化详细推导

1. 一组数减去平均数的差的和为0。 一组数:a1,a2,a3,……,an, 平均数:a=(a1+a2+……+an)/n, 则 a1+a2+……+an=n*a, 从而,每一个数减去平均数的差的和为 (a1-a)+(a2-a)+……+(an-a) =(a1+a2+……+an)-n*a =0 2. 设原始数据均值及标准差为,将原始数组经过变换后得到使得均…

【好书精读】网络是怎样连接的 向 DNS 服务器查询 Web 服务器的 IP 地址

&#xff08;该图由AI制作 学习AI绘图 联系我&#xff09; 目录 IP 地址的基本知识 实际的 IP 地址 域名和 IP 地址并用的理由 Socket 库提供查询 IP 地址的功能 通过解析器向 DNS 服务器发出查询 解析器的内部原理 IP 地址的基本知识 生成 HTTP 消息 根据域名查询 …

C++笔记之extern关键字

C笔记之extern关键字 code review! 文章目录 C笔记之extern关键字0.前言1.extern是C语言的关键字还是C中的关键字&#xff1f;2.extern关键字和全局变量3.ChatGpt讲述extern的用法4.extern一般用法4.1.在本模块中使用4.2.跨模块中使用 5.标准定义使用extern关键字的步骤7.ext…