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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月24日 00时38分59秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java判断字符串是否为数字(浮点类型也包括)
2019-05-01
ubuntu opencv-python 安装很慢问题
2019-05-01
MySQL5.7版本修改了my.ini配置文件后mysql服务无法启动问题
2019-05-01
【大数据开发】Java基础 -总结21-Hashmap和HashTable的区别
2019-05-01
Azkaban体系结构
2019-05-01
机器学习之重头戏-特征预处理
2019-05-01
synchronized底层实现及锁的升级、降级
2019-05-01
PermGen space-永久区内存溢出
2019-05-01
Maven继承和聚合
2019-05-01
Apache Kafka:优化部署的 10 种最佳实践
2019-05-01
Leetcode 35. 搜索插入位置 c#
2019-05-01
[9] JMeter-常用函数的使用
2019-05-01
[12] JMeter-结果分析之图形图表
2019-05-01
使用aspose.words 18.6实现pdf文档转换
2019-05-01
Java数组详解
2019-05-01
vs中动态DLL与静态LIB工程中加入版本信息的方法
2019-05-01
大数据分析技术与应用一站式学习(值得收藏)_v20200418
2019-05-01