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;
}

效果图
这里写图片描述

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值