Opencv多通道分离函数split()和多通道合并函数merge的使用

多通道分离函数split()

功能:把一个多通道队列分离成几个单通道的队列。

如果你需要提取一个单通道或者做一些其他的复杂的通道排列组合,使用mixChannels。

函数原型1:

CV_EXPORTS void split(const Mat& src, Mat* mvbegin);

参数说明:

  • 参数1 src 输入多通道数组

  • 参数2 mvbegin 输出数组,数组的大小必须与src.channels()匹配,如果需要的话,数组自身重新分配。

    参考: merge, mixChannels, cvtColor

函数原型2:

CV_EXPORTS_W void split(InputArray m, OutputArrayOfArrays mv);

参数说明:

  • 参数1 m 输入多通道数组

  • 参数2 mv 输出数组,如果需要的话,数组自身重新分配。

代码示例:

#include "pch.h"
#include <iostream>
#include <opencv2\opencv.hpp>
​
int main()
{
    cv::Mat img;
    img = cv::imread("F:/openCV/images/juice.jpg");     // 读取图像
​
    if (img.empty())    // 判断是否读取成功
    {
        std::cout << "导入图像失败!";
        std::cin.get();     // 读取错误时,为了能在控制台dos窗口看到输出的信息,而不是一闪而过
        return -1;
    }
    else
    {
        std::cout << "导入图像成功!";
    }
​
    cv::Mat imgSplit[3];
    cv::split(img, imgSplit);
​
    cv::imshow("RGB-B通道像素值", imgSplit[0]);    // B通道像素值
    cv::imshow("RGB-G通道像素值", imgSplit[1]);    // G通道像素值
    cv::imshow("RGB-R通道像素值", imgSplit[2]);    // R通道像素值
​
    cv::waitKey(0);    // 一直显示图像直到摁下任意键
}

运行结果如下图:

多通道合并函数merge()

功能:从几个单通道数组里合并成一个多通道的数组

函数 cv::merge合并几个数组到一个包含多通道的数组. 也就是说,每个输出数组的元素将会是输入数组元素的结合,其中的第i个输入数组的元素被当做mv[i].channels()元素的向量,合并后生成的新矩阵行数和列数与输入矩阵的相同。

函数cv::split 是做的相反的操作. 如果你需要使用其他先进的方式打乱通道,使用cv::mixChannels.

函数原型1

CV_EXPORTS void merge(const Mat* mv, size_t count, OutputArray dst);

参数说明

  • 参数1 mv 将要合并的输入矩阵数组,mv里的所有矩阵必须大小和深度一致。

  • 参数2 count ,当mv是一个空白的C数组时代表的是输入矩阵的个数;他的值必须大于零。

  • 参数3 dst 和mv[0]一样大小和深度的输出数组;通道个数和参数个数相等。

@参考 mixChannels, split, Mat::reshape

函数原型2

CV_EXPORTS_W void merge(InputArrayOfArrays mv, OutputArray dst);

参数说明

  • 参数1 mv 将要合并的输入矩阵数组,mv里的所有矩阵必须大小和深度一致。

  • 参数12 dst 和mv[0]一样大小和深度的输出数组; 通道个数是矩阵数组里的通道数的总和.

代码示例

以下代码实现了把RGB图像分离后又合并,把HSV分离后又合并,把HSV中的H和RGB中的G、R合并。

#include "pch.h"
#include <iostream>
#include <opencv2\opencv.hpp>
​
int main()
{
    cv::Mat img;
    img = cv::imread("F:/openCV/images/juice.jpg");     // 读取图像
​
    if (img.empty())    // 判断是否读取成功
    {
        std::cout << "导入图像失败!";
        std::cin.get();     // 读取错误时,为了能在控制台dos窗口看到输出的信息,而不是一闪而过
        return -1;
    }
    else
    {
        std::cout << "导入图像成功!";
    }
​
    cv::Mat imgSplit[3];
    cv::Mat imgMerge;
    cv::Mat imgMergeHsv;
    cv::Mat hsv;
    cv::Mat hsvSplit[3];
​
    cv::Mat mergeHsvRgb[3];
    cv::Mat mergeResult;;
​
    cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV);
​
    cv::split(img, imgSplit);
    cv::split(hsv, hsvSplit);
​
​
    mergeHsvRgb[0] = hsvSplit[0];
    mergeHsvRgb[1] = imgSplit[1];
    mergeHsvRgb[2] = imgSplit[2];
​
    cv::merge(imgSplit, 3, imgMerge);
    cv::merge(hsvSplit, 3, imgMergeHsv);
    cv::merge(mergeHsvRgb, 3, mergeResult);
​
    cv::imshow("HSV", hsv);               // hsv像素值
    cv::imshow("Merge RGB", imgMerge);    // RGB合并像素值
    cv::imshow("Merge HSV", imgMergeHsv);    // HSV合并像素值
    cv::imshow("Merge HSV RGB", mergeResult);    // HSV中的H和RGB中的G、R合并
​
    cv::waitKey(0);    // 一直显示图像直到摁下任意键
}

运行结果如下图:

猜你喜欢

转载自blog.csdn.net/jndingxin/article/details/108169886