opencv学习(十四)之图像颜色通道分离和融合

在图像处理时,我们接触到的彩色以RGB居多,为了分析图像在某一通道上的特性,需要将图像的颜色通道进行分离,或者是在对某一颜色通道处理后重新进行融合。opencv提供了split()函数来进行颜色通道的分离,提供了merge()函数来进行颜色通道的融合。

1.split()函数
颜色通道分离函数,其定义如下所示:

CV_EXPORTS void split(const Mat& src, Mat* mvbegin);
CV_EXPORTS void split(const Mat& m, vector<Mat>& mv );

其有两种定义形式。
.第一个参数是输入分离通道的图像
.第二个参数是一个Mat类型的vector容器,用来存放分离后的通道

2.merge()函数

CV_EXPORTS void merge(const Mat* mv, size_t count, OutputArray dst);
CV_EXPORTS void merge(const vector<Mat>& mv, OutputArray dst );

其定义也有两个定义形式,参数含义与split()函数基本相同。其OutputArray dst可以是一个Mat类型的数据。

示例程序:

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

using namespace std;
using namespace cv;

void addImage(Mat& image, Mat& logoImage, vector<Mat>channels, Mat imageChannel, String title);

int main()
{
    Mat srcImage = imread("七龙珠.jpg");
    Mat logoImage = imread("七龙珠logo.jpg", IMREAD_GRAYSCALE);

    //判断文件是否加载成功
    if (srcImage.empty() || logoImage.empty())
    {
        cout << "图像加载失败!" << endl;
        return false;
    }
    else
        cout << "图像加载成功!" << endl;

    //对加载的原图像进行通道分离
    vector<Mat>channels;
    split(srcImage, channels);
    Mat imageBlueChannel;
    imageBlueChannel = channels.at(0);  //提取蓝色通道

    //窗口名称,也可以用char数组,传入char*来指定窗口名称
    String imageBlueTitle = "蓝色通道叠加logo融合";     

    addImage(srcImage, logoImage, channels, imageBlueChannel, imageBlueTitle);

    return 0;
}

void addImage(Mat& image, Mat& logoImage, vector<Mat>channels, Mat imageChannel, String title)
{
    //在提取的蓝色通道上,指定ROI区域叠加logoImage
    addWeighted(imageChannel(Rect(50, 50, logoImage.cols, logoImage.rows)), 1.0, logoImage, 0.7,
        0.0, imageChannel(Rect(50, 50, logoImage.cols, logoImage.rows)));

    merge(channels, image); //将叠加logo后的蓝色通道与另外两个颜色通道重新融合
    imshow(title, image);
    waitKey(0);
}

程序分析:
. 通过前面几篇文章的介绍,我们已经了解到在图像中其RGB三通道的排列顺序不是我们所熟知的RGB,而是BGR,所以在得到channels后,可以通过at()函数来指定颜色通道,如在程序中

imageBlueChannel = channels.at(0);

即将蓝色通道提取出来,同样通过这种方法也可以将绿色和红色通道进行提取

. 在将logo叠加到图片上时用到了函数addWeighted()函数,这个函数在前面的文章有提到,可以点击查看该函数的用法。

程序运行结果
这里写图片描述


版权声明:本文为keith_bb原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。