OpenCV学习之多通道图像的混合

在学习《OpenCV3编程入门》这本书中的5.3节分离颜色通道、多通道图像混合时,发现了几个值得注意的点,因为书上没有说明或强调,稍有不慎可能还是会出错,然后让你气cry!所以我在此记录一下,至于其它书籍有没有提或者你早就知道噜,本人都NBCS嘻嘻,看看就好!

分离色彩通道的效果

书中只给了关键代码,且没有效果图,所以不测试一下的人不一定能理解这个分离的作用,所以本人花了个13分钟完整了一下代码,如下:

#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
void main()
{
	vector<Mat> channels; //必须有命名空间std
	Mat imageBlueChannel,imageGreenChannel,imageRedChannel;
	Mat srcImage = imread("RGB测试.png");
	imshow("【原图】", srcImage);
	//把一个3通道图像转换成3个单通道图像
	split(srcImage, channels);
	imageBlueChannel = channels.at(0);
	imageGreenChannel = channels.at(1);
	imageRedChannel = channels.at(2);

	imshow("【蓝色】", imageBlueChannel);
	imshow("【绿色】", imageGreenChannel);
	imshow("【红色】", imageRedChannel);
	waitKey(0);
}

如果你和我刚开始一样,随便找个RGB图像测试一下,不一定能看懂那个结果。所以努力的本人为了搞懂效果,亲自画了张图,红绿蓝分离开来,使得效果更明显。效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到引用哪个颜色分离,首先原图变为单通道灰度图,然后相应的颜色会变浅色,而其余的颜色会变深,这就是分离成单通道的效果。至于具体原理是什么,我也就不清楚噜,毕竟我的opencv也才1.3级。

多通道图像混合

这个主要是注意一下5.3.3的示例程序,它是将多通道图像分离,然后将三种颜色分别进行图像混合,得出的结果就是让你混合的logo图变成相应的颜色,NBCS的用处罢了。但是,在我把其函数部分改进的时候还是吃了苦呕,气死噜!
因为时间有限,只测试了温暖潮湿的蓝色部分嘻嘻!其余颜色测试只需改掉一个参数即可,书上都有,自己去看噜!改进的代码如下:

bool MultiChannelBlending(Mat srcImage, Mat logoImage)
{
	vector<Mat> channels;
	Mat imageBlueChannel;
	//分离色彩通道
	split(srcImage, channels);
	//将蓝色通道引用赋值
	imageBlueChannel = channels.at(0);
	//在蓝色通道中设定ROI区域,位置依旧选择左下角
	Mat imageROI = imageBlueChannel(Rect(0, srcImage.rows - logoImage.rows, logoImage.cols, logoImage.rows));
	imshow("ROI", imageROI);
	//加权线性混合
	addWeighted(imageROI, 1.0, logoImage, 0.5, 0, imageROI);
	//合并通道
	merge(channels, srcImage);

	imshow("【游戏原画+logo蓝色通道】", srcImage);
	return true;
}
void main()
{
	Mat image = imread("modao.bmp");
	Mat logo = imread("dnf_logo.jpg");
	if(MultiChannelBlending(image,logo))
		cout << "运行成功,得出你所需的图像!" << endl;
	waitKey(0);
}

首先又是那个恶熏的错误:Microsoft C++ 异常: cv::Exception,调用堆栈那里提示的错误的代码是

addWeighted(imageROI, 1.0, logoImage, 0.5, 0, imageROI);

我以为不能这样该,换成书上的那种还是不行,,又是弄了130分钟,最终才发现真正出错的是这一行

Mat logo = imread(“dnf_logo.jpg”);

简直气鼠,原来是忘了在后面加个0,变成灰度图

Mat logo = imread(“dnf_logo.jpg”,0);

不过也能说得通,从之前分离色彩通道的结果可以看出,分离后引用单个颜色分量部分的图是单通道灰度图,而我使用的logo图是彩色的,就这么加权混合确实不合理,何况最后还得呈现出logo图变成蓝色的效果,所以在进行加权混合前要确保是灰度图,当然书上没有说我有什么办法,清者自清噜!顺便吐槽这个报错真是够了,报了也看不出问题所在,真想说一句“柠檬酸了”呕!效果图如下,本质的蓝色:
在这里插入图片描述

发布了17 篇原创文章 · 获赞 3 · 访问量 1811

猜你喜欢

转载自blog.csdn.net/weixin_43350361/article/details/88363844