在图像处理时,我们接触到的彩色以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版权协议,转载请附上原文出处链接和本声明。