opencv常用api简单分析: split()merge()

Posted arvik

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv常用api简单分析: split()merge()相关的知识,希望对你有一定的参考价值。

原型

split()和merge()方法是一对互逆操作,split()是对图像进行通道分离,merge()是进行通道合并,
灰度图像只有1个通道,一般RGB能分离出3个通道,RGBA图像能分理出4个通道(如.png格式图片)

void split(const Mat& src, Mat* mvbegin)
void split(InputArray m, OutputArrayOfArrays mv)
void merge(const Mat* mv, size_t count, OutputArray dst)
void merge(InputArrayOfArrays mv, OutputArray dst)

参数:
count 要合并的通道数
剩余参数都是cv::Mat类型

关系图

下图描绘了一个一般的RGB图像在opencv的Mat中像素数据存储结构以及通道分离/合并操作关系

例子

以下例子演示了怎么从一个原图像中分离出b通道,然后再和另外两个数据为0的通道合成一个新图像,以此显示出blue颜色的图像。同理可以提取并显示出g、r通道

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

using namespace cv;
using namespace std;
int main(int argc, char *argv[])

    cv::Mat src = imread("test3.jpg");
    cv::imshow("src", src);

    vector<Mat> channels;
    Mat channels_m[3];
    cv::Mat dst;

    split(src, channels); //分离色彩通道,0,1,2
    channels_m[0] = channels[0];  // b
    channels[1] = 0;
    channels[2] = 0; 
    merge(channels, dst);
    cv::imshow("b", dst);

    split(src, channels); 
    channels_m[1] = channels[0];  // g
    channels[0] = 0;
    channels[2] = 0; 
    merge(channels, dst);
    cv::imshow("g", dst);

    split(src, channels); 
    channels_m[2] = channels[0];  // r
    channels[0] = 0;
    channels[1] = 0; 
    merge(channels, dst);
    cv::imshow("r", dst);

    cv::waitKey();
    return 0;

效果图

以上是关于opencv常用api简单分析: split()merge()的主要内容,如果未能解决你的问题,请参考以下文章

opencv常用api简单分析:几个基本绘图操作(LineRectangleCircleEllipse...)

opencv常用api简单分析:几个基本绘图操作(LineRectangleCircleEllipse...)

OpenCV-通道分离cv::split

opencv类简单分析: Mat

利用OpenCV的函数split()和merge()实现通道的分离与合并

opencv学习-常用API使用方法汇总