OpenCV 学习笔记-day 11(split() 通道分离函数与merge() 通道合并函数)

day11-通道分离与合并

首先建立Mat类型容器用来存放分离之后的数据

std::vector<Mat>mv;//Mat类型的容器

用split函数将RGB图像三个通道分离,并存放到mv中,其中mv[0],mv[1],mv[2] 分别代表BGR的数据,此时分离成功,若要显示单个通道中的颜色(比如显示B通道的颜色),不能直接imshow(因为mv[0]此时是单通道,单通道显示为灰度图像),要将它转换成三通道在显示。方法:将G通道和R通道的数据清零,再将三个通道通过merge函数合并。

函数

  1. split() 通道分离函数
//定义
CV_EXPORTS_W void split(InputArray m, OutputArrayOfArrays mv);
参数说明
m输入图像
mv用来接收分离后数据的容器(可根据需要分配容器本身)

例1

std::vector<Mat>mv;//Mat类型的容器
split(image, mv);//通道分离函数split
//此时根据需要mv分成mv[0],mv[1],mv[2]3个部分,
//分别存放BGR3个通道被的数据
  1. merge() 通道合并函数
参数说明
mv待合并的数据的容器(mv中的所有矩阵都必须相等
大小和深度相同)
dst与mv[0]相同大小和深度的DST输出数组; 频道的数量会
为矩阵数组中信道的总数

例2

merge(mv, dst);//通道合并函数merge 
//合并mv中所有矩阵数组(通常为三个信道的三个数据矩阵)
  1. mixChannels() 通道混合函数
//定义
CV_EXPORTS void mixChannels(const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts,
                            const int* fromTo, size_t npairs);
                           
参数说明
src输入图像地址,所有矩阵的大小和深度必须相同
nsrcs输入图像src 矩阵的数量
dst输出图像地址,大小和深度必须与src[0]相同
fromTo定被复制通道与要复制到的位置组成的索引对 例:int from_to[] = { 0,2, 1,1, 2,0, 3,3 }
将0通道复制到1通道,1通道复制到1通道,2通道复制到0通道,3通道复制到3通道
npairsfrom_to中索引对的数目 此时是 4

例3

	int form_to[] = { 0, 2, 1, 1, 2, 1 };
	mixChannels(&image,1,&dst,1,form_to,3);
	//1张输入图像,1张输出图像,3个索引对

代码

quickopencv.h

#pragma once

#include <opencv2\highgui.hpp>

#include <opencv2\imgproc.hpp>

using namespace cv;
//定义类
class QuickDemo{
public:
	void colorSpace_Demo(Mat &image);//色彩空间转换函数2021-12-24
	void mat_creation_demo(Mat &image);//Mat对象与创建2021-12-27
	void pixel_vist_Demo(Mat &image);//图像像素的读写操作2022-1-3
	void operators_demo(Mat &image);//图像像素的算数操作2022-1-4
	void tracking_bar_demo(Mat &image);//滚动条操作演示2022-1-7
	void key_demo(Mat &image);//键盘响应操作2022-1-12
	void color_style_demo(Mat &image);//OpenCV自带颜色表操作2022-1-12
	void bitwise_demo(Mat &image);//位操作(逻辑操作)2022-1-17
	void channels_demo(Mat &image);//通道分离与合并2022-1-17
};

QuickDemo.cpp

void QuickDemo::channels_demo(Mat &image)
{
	//通道分离
	std::vector<Mat>mv;//Mat类型的容器
	split(image, mv);//通道分离函数split
	imshow("Blue",mv[0]);//此时显示的是单通道图像,需合并陈三通道后才能显示B通道的蓝色
	//显示结果1
	imshow("Green", mv[1]);
	//显示结果2
	imshow("Red", mv[2]);
	//显示结果3
    //通道合并
	Mat dst;
	mv[1] = 0;//将G通道的值置零
	mv[2] = 0;//将R通道的值置零
	merge(mv, dst);//通道合并函数merge 
	imshow("Blue",dst);//dst三通道可以显示蓝色 G,R同理
	//显示结果4
	
    //mixChannels()函数
	int form_to[] = { 0, 2, 1, 1, 2, 1 };
	mixChannels(&image,1,&dst,1,form_to,3);
	//micChannels(input array,input arrary 矩阵的数量,output array,output arrary 矩阵的数量,
	//指定被复制通道与要复制到的位置组成的索引对int from_to[] = { 0,2, 1,1, 2,0, 3,3 };,from_to中索引对的数目 此时是 4)
	imshow("通道混合",dst);//显示结果5
}
#include <iostream>
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
#include<quickopencv.h>

using namespace cv;
using namespace std;


int main()
{
	Mat scr = imread("...\\image\\3.jfif");//打开一张图
	if (!scr.data == 1)//判空
		return -1;
	namedWindow("窗口1", WINDOW_NORMAL);//创建 WINDOW_FREERATIO窗口
	imshow("窗口1",scr);//在创建的窗口显示
	//显示结果 原图
	QuickDemo qd;
	qd.channels_demo(scr);
	waitKey(0);
	return 0;
}

原图
原图
显示结果1 分离后的B通道显示
在这里插入图片描述
显示结果2 分离后的G通道显示
在这里插入图片描述
显示结果3 分离后的R通道显示
在这里插入图片描述
显示结果4 合并成三通道图像后B通道的显示
Blue

显示结果5
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值