OpenCV 学习笔记-day 11(split() 通道分离函数与merge() 通道合并函数)
OpenCV 学习笔记day10-通道分离与合并函数split() 通道分离函数merge() 通道合并函数代码day10-通道分离与合并首先建立Mat类型容器用来存放分离之后的数据std::vector<Mat>mv;//Mat类型的容器用split函数将RGB图像三个通道分离,并存放到mv中,其中mv[0],mv[1],mv[2] 分别代表BGR的数据,此时分离成功,若要显示单个通
·
day11-通道分离与合并
首先建立Mat类型容器用来存放分离之后的数据
std::vector<Mat>mv;//Mat类型的容器
用split函数将RGB图像三个通道分离,并存放到mv中,其中mv[0],mv[1],mv[2] 分别代表BGR的数据,此时分离成功,若要显示单个通道中的颜色(比如显示B通道的颜色),不能直接imshow(因为mv[0]此时是单通道,单通道显示为灰度图像),要将它转换成三通道在显示。方法:将G通道和R通道的数据清零,再将三个通道通过merge函数合并。
函数
//定义
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个通道被的数据
参数 | 说明 |
---|---|
mv | 待合并的数据的容器(mv中的所有矩阵都必须相等 |
大小和深度相同) | |
dst | 与mv[0]相同大小和深度的DST输出数组; 频道的数量会 |
为矩阵数组中信道的总数 |
例2
merge(mv, dst);//通道合并函数merge
//合并mv中所有矩阵数组(通常为三个信道的三个数据矩阵)
//定义
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通道 | |
npairs | from_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通道的显示
显示结果5
更多推荐
已为社区贡献1条内容
所有评论(0)