Opencv(七)多通道分离与合并

       在图像颜色模型中不同的分量存放在不同的通道中,如果我们只需要处理RGB图像中的红色通道,可以将红色通道从三通道的数据中分离出来再进行处理,这种方式可以减少数据所占据的内存,加快程序的运行速度。同时,当我们分别处理完多个通道后,需要将所有通道合并在一起重新生成RGB图像。

1、多通道分离-----函数split()

作用 : 将多通道的图像分离成若干单通道的图像

(1)第一种形式

void cv::split(const Mat & src,
                 Mat * mvbegin
              )

src : 待分离的多通道图像

mvbegin : 分离后的单通道图像,为数组形式,数组大小需要与图像的通道数相同

(2)第二种形式

void cv::split(InputArray m,
               OutputArrayOfArrays mv
              )

m : 待分离的多通道图像

mv :分离后的单通道图像,为向量vector形式

前者第二个参数输入的是Mat类型的数组,其数组的长度需要与多通道图像的通道数相等并且提前定义;第二种函数原型的第二个参数输入的是一个vector<Mat>容器,不需要知道多通道图像的通道数。

例 :
split(img, imgs)
//将原始图像img的通道分离到imgs数组中

2、多通道合并-----函数merge()

作用 :将多个图像合并成一个多通道图像

(1)第一种形式

void cv::merge(const Mat * mv,
               size_t  count,
               OutputArray dst
              )

mv : 需要合并的图像数组,其中每个图像必须拥有相同的尺寸和数据类型

count : 输入的图像数组的长度,其数值必须大于0

dst : 合并后输出的图像,与mv[0]具有相同的尺寸和数据类型,通道数等于所有输入图像的通道数总和

(2)第二种形式

void cv::merge(InputArrayOfArrays mv,
               OutputArray dst
              )

mv : 需要合并的图像向量vector,其中每个图像必须拥有相同的尺寸和数据类型

dst:合并后输出的图像,与mv[0]具有相同的尺寸和数据类型,通道数等于所有输入图像的通道数总和
例:
merge(imgs, 3, result1)
//将数组imgs中的多个通道图像合并为单个图像,并将合并结果存储在result1中

imgs :是要合并的图像通道数组
3 :表示通道数量(在这种情况下是3)
result1 :是合并图像的输出变量

3、例子

#include <opencv2\opencv.hpp>
#include <iostream>
#include <vector>

using namespace std;
using namespace cv;

int main()
{

   Mat img = imread("lena.png");

   if (img.empty())
   {
   cout << "请确认图像文件名称是否正确" << endl;
   return -1;
   }

   Mat HSV;
   cvtColor(img, HSV, COLOR_RGB2HSV);
   Mat imgs0, imgs1, imgs2; //用于存放数组类型的结果
   Mat imgv0, imgv1, imgv2; //用于存放vector类型的结果
   Mat result0, result1, result2; //多通道合并的结果

   //输入数组参数的多通道分离与合并
   Mat imgs[3];
   split(img, 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] = img; //将数组中的图像通道数变成不统一
   merge(imgs, 3, result0); //合并图像
   //imshow("result0", result0); //imshow最多显示4个通道,因此结果在Image Watch中查看
   Mat zero = cv::Mat::zeros(img.rows, img.cols, CV_8UC1);//创建一个与原始图像 img 相同大小的全零单通道图像 zero
   imgs[0] = zero;//将全零图像 zero 赋值给 imgs 数组的第一个通道,即索引为0的元素
   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); //合并图像
   //imshow("result2", result2); /imshow最多显示4个通道,因此结果在Image Watch中查看
   waitKey(0);
   return 0;
 }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值