【OpenCV】—分离颜色通道、多通道图像混合

简介: 【OpenCV】—分离颜色通道、多通道图像混合

补充:

上一个博客:我们主要介绍了如何使用addWeighted函数进行图像混合操作,以及如何将ROI和addWeighted函数结合起来,对指定区域进行图像混合操作。为了更好地观察一些图像材料的特征,需要对RGB三个颜色通道的分量进行分别显示和调整。

1、通道分离:split()函数

说明:split函数用于将一个多通道数组分离 成几个单通道数组。

split函数的C++版本有两个原型。分别是:

void split(const Mat& src,Mat*mvbegin);
void split(InputArray m,OutArrayOfArrays mv);
split(srcImage4, channels);
  • 3
  • 第一个参数:InputArray类型的m或者const Mat&类型的src,填写我们需要进行分离的多通道数组
  • 第二个参数:OutArrayOfArrays 类型mv,填函数的输出数组或者输出的vector容器

split函数分割多通道数组转换成独立的单通道数组,公式如下:

mv[c](I)=src(I)c

示例展示:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

void main() {
  vector<Mat> channels;
  Mat imageBlueChannel;
  Mat imageGreenChannel;
  Mat imageRedChannel;
  Mat srcImage4 = imread("D:\\mogu.jpg");
  imshow("【原始图】", srcImage4);

  //把一个3通道图像转换成3个单通道图像
  split(srcImage4, channels);
  imageBlueChannel = channels.at(0);
  imageGreenChannel = channels.at(1);
  imageRedChannel = channels.at(2);

  //显示单通道图像
  imshow("【BlueChannel】", imageBlueChannel);
  imshow("【GreenChannel】", imageGreenChannel);
  imshow("【RedChannel】", imageRedChannel);

  waitKey(0);
}

原图

通道分离


2、通道合并:merge()函数

说明:merge()函数是split()函数的逆向操作—将多个数组合并成一个多通道的数组。它通过组合一些给定的单通道数组,将这些孤立的单通道数组合并成一个多通道的数组,从而创建出一个由多个单通道阵列组成的多通道阵列。

void merge(const Mat* mv,size_tcount,OutputArray dst);
void merge(InputArrayOfArrays mv,OutputArray dst)
    merge(channels, mergeImage);
  • 第一个参数:mv,需要合并的输入矩阵或vector容器的阵列,这个mv参数中所有的矩阵必须有着一样的尺寸和深度。
  • 第二个参数:count。当mv为一个空白的C数组时,代表输入矩阵的个数,这个参数显然必须大于1.
  • 第三个参数:dst,即输出矩阵,和mv[0]拥有一样的尺寸和深度,并且通道的数量是矩阵阵列中的通道的总数。

说明:下面的代码,先做相关的类型声明,然后把载入的3通道图像转换成3个单通道图像,放到vector类型的channels中,节奏进行引用赋值。其中,channels.at(0)表示引用取出chanels中的蓝色分量,channels.at(1)表示引用取出channels中的绿色分量,channels.at(2)表示引用取出channels中的红色分量。

vector<Mat> channels;
Mat imageBlueChannel;
Mat imageGreenChannel;
srcImage4=imread("dota.jpg");
//把一个3通道图像转换成3个单通道图像
split(srcImage4,channels);//分离色彩通道
imageBlueChannel=channels.at(0);
imageBlueChannel=channels.at(1);
imageBlueChannel=channels.at(2);
//对拆分的通道数据合并
Mat mergeImage;  //定义合并的输出矩阵
merge(channels, mergeImage);

相关文章
|
12天前
|
计算机视觉 Python
轻松掌握opencv的8种图像变换
轻松掌握opencv的8种图像变换
|
13天前
|
算法 计算机视觉
【OpenCV】- 图像修复
【OpenCV】- 图像修复
|
13天前
|
Serverless 计算机视觉
【OpenCV】-图像的矩
【OpenCV】-图像的矩
|
13天前
|
编解码 物联网 计算机视觉
【OpenCV】—图像金子塔与图片尺寸缩放
【OpenCV】—图像金子塔与图片尺寸缩放
|
13天前
|
API 计算机视觉
【OpenCV】—图像对比度、亮度值调整
【OpenCV】—图像对比度、亮度值调整
|
13天前
|
计算机视觉 索引
【OpenCV】—ROI区域图像叠加&图像混合
【OpenCV】—ROI区域图像叠加&图像混合
|
13天前
|
存储 算法 C语言
OpenCV—访问图像中的像素
OpenCV—访问图像中的像素
|
1月前
|
编解码 计算机视觉 Python
opencv 图像金字塔(python)
opencv 图像金字塔(python)
|
1月前
|
边缘计算 算法 计算机视觉
opencv 图像梯度(python)
opencv 图像梯度(python)
|
2月前
|
存储 计算机视觉
OpenCV(三十九):积分图像
OpenCV(三十九):积分图像
20 0