OpenCV3 之 图像叠加&图像混合
发布日期:2021-07-01 03:59:40 浏览次数:2 分类:技术文章

本文共 3167 字,大约阅读时间需要 10 分钟。

文章目录

1. 图像叠加

通过一个图像掩膜(mask),直接将插入处的像素设置为logo图像的像素值

//----------------------------------【ROI_AddImage( )函数】----------------------------------// 函数名:ROI_AddImage()//	描述:利用感兴趣区域ROI实现图像叠加//----------------------------------------------------------------------------------------------bool  ROI_AddImage(){
// 【1】读入图像 Mat srcImage1 = imread("dota_pa.jpg"); Mat logoImage = imread("dota_logo.jpg"); if (!srcImage1.data) {
printf("读取srcImage1错误~! \n"); return false; } if (!logoImage.data) {
printf("读取logoImage错误~! \n"); return false; } // 【2】定义一个Mat类型并给其设定ROI区域 Mat imageROI = srcImage1(Rect(200, 250, logoImage.cols, logoImage.rows)); // 【3】加载掩模(必须是灰度图) Mat mask = imread("dota_logo.jpg", 0); //【4】将掩膜拷贝到ROI logoImage.copyTo(imageROI, mask); // 【5】显示结果 namedWindow("<1>利用ROI实现图像叠加示例窗口"); imshow("<1>利用ROI实现图像叠加示例窗口", srcImage1); return true;}

在这里插入图片描述

在这里插入图片描述

2. 图像混合

2.1 线性混合操作

该效果使两幅图像或两段视频产生时间上的画面叠化效果,类似于电影画面过渡的叠加效果。

g ( x ) = ( 1 − α ) f 1 ( x ) + α f 2 ( x ) + β \mathrm{g}(x)=(1-α) f_{1}(x)+α f_{2}(x)+β g(x)=(1α)f1(x)+αf2(x)+β

通过改变α的值,α∈[0,1],我们可以得到不同程度的混合效果。

在OpenCV中主要通过数组加权和 addWeighted函数实现。

void addWeighted(InputArray src1,double alpha,InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);

  • 参数1:表示需要加权的第一个数组,通常写入Mat型数据
  • 参数2:表示第一个数组的权重,α
  • 参数3:表示第二个数组,需要与第一个数组有相同的尺寸和通道数
  • 参数4:表示第二个数组的权重,(1-α)
  • 参数5:加到权重总和上的标量值 ,β
  • 参数6:输出的数组,同输入的数组相同尺寸和通道数
  • 参数7:输出阵列的可选深度,默认值为-1;当两个输入数组具有相同深度时,参数设置为-1
//---------------------------------【LinearBlending()函数】-------------------------------------// 函数名:LinearBlending()// 描述:利用cv::addWeighted()函数实现图像线性混合//--------------------------------------------------------------------------------------------bool  LinearBlending(){
//【0】定义一些局部变量 double alphaValue = 0.5; double betaValue; Mat srcImage2, srcImage3, dstImage; // 【1】读取图像 ( 两幅图片需为同样的类型和尺寸 ) srcImage2 = imread("mogu.jpg"); srcImage3 = imread("rain.jpg"); if (!srcImage2.data) {
printf("读取srcImage2错误! \n"); return false; } if (!srcImage3.data) {
printf("读取srcImage3错误! \n"); return false; } // 【2】进行图像混合加权操作 betaValue = (1.0 - alphaValue); addWeighted(srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage); // 【3】显示原图窗口 imshow("<2>线性混合示例窗口【原图】", srcImage2); imshow("<3>线性混合示例窗口【效果图】", dstImage); return true;}

在这里插入图片描述

2.2 ROI区域的图像混合

//---------------------------------【ROI_LinearBlending()】-------------------------------------// 函数名:ROI_LinearBlending()// 描述:线性混合实现函数,指定区域线性图像混合.利用cv::addWeighted()函数结合定义//			  感兴趣区域ROI,实现自定义区域的线性混合//--------------------------------------------------------------------------------------------bool  ROI_LinearBlending(){
//【1】读取图像 Mat srcImage4 = imread("dota_pa.jpg", 1); Mat logoImage = imread("dota_logo.jpg"); if (!srcImage4.data) {
printf("读取srcImage4错误~! \n"); return false; } if (!logoImage.data) {
printf("读取logoImage错误~! \n"); return false; } //【2】定义一个Mat类型并给其设定ROI区域 Mat imageROI; //方法一 //imageROI = srcImage4(Rect(200, 250, logoImage.cols, logoImage.rows)); //方法二 imageROI= srcImage4(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols)); //【3】将logo加到原图上 addWeighted(imageROI, 0.5, logoImage, 0.3, 0., imageROI); //【4】显示结果 imshow("<4>区域线性图像混合示例窗口", srcImage4); return true;}

在这里插入图片描述


参考书籍《OpenCV3编程入门》

转载地址:https://miracle.blog.csdn.net/article/details/100577226 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:OpenCV3 之 通道分离与合并
下一篇:OpenCV3 之 ROI区域的定义方法

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月24日 00时38分59秒