【Qt+opencv】ROI与图像混合

文章目录


前言

在计算机视觉和图像处理中,我们经常需要对图像的某一部分(也就是ROI,Region of Interest)进行操作。这些操作可能包括滤波、缩放、旋转等。同时,我们也可能需要将处理后的ROI与原图像进行混合,以达到特定的视觉效果。本文将介绍如何在Qt和OpenCV的环境下进行ROI的提取和操作,以及如何将ROI与原图像进行混合。


ROI

ROI是什么

ROI是"Region of Interest"的缩写,中文可以翻译为"感兴趣区域"。在图像处理和计算机视觉中,ROI通常指的是我们需要关注或处理的图像的一部分。

比如说,如果你正在使用面部识别技术,那么人脸部分就是你的ROI,因为你的主要任务是在这个区域内识别人脸。同样,如果你正在进行道路识别,那么道路部分就是你的ROI。

通过定义ROI,我们可以将注意力集中在图像中最重要的部分,从而提高处理效率并减少不必要的干扰。

如何提取ROI

方法一:使用构造函数

cpp 复制代码
//创建宽度为 320,高度为 240 的 3 通道图像
Mat img(Size(320, 240), CV_8UC3);
//roi 是表示 img 中 Rect(10, 10, 100, 100)区域的对象
Mat roi(img, Rect(10, 10, 100, 100));

方法二:使用括号运算符

cpp 复制代码
Mat roi2 = img(Rect(10, 10, 100, 100));
// 用括号运算符
Mat roi3 = img(Range(10, 100), Range(10, 100)); 
// 用构造函数
Mat roi4(img, Range(10, 100), Range(10, 100));

图像混合

整体混合

线性混合

在OpenCV中,线性混合(Linear Blending)是一种常见的图像处理操作,它的公式如下:

g ( x ) = ( 1 − α ) f 0 ( x ) + α f 1 ( x ) g(x) = (1 - α)f_{0}(x) + αf_{1}(x) g(x)=(1−α)f0(x)+αf1(x)

其中:

  • g(x) 是输出图像
  • f_{0}(x)f_{1}(x) 是输入的两幅图像
  • α 是一个在0到1之间的参数

这个公式的含义是,对于每一个像素位置x,输出图像g(x)的像素值是输入图像f_{0}(x)f_{1}(x)在该位置的像素值的加权平均。权重由参数α决定。

α从0变化到1时,这个操作可以用来在两幅图像或者两段视频之间进行时间上的交叉溶解(cross-dissolve),就像在幻灯片放映和电影制作中看到的那样。

在OpenCV中,你可以使用addWeighted()函数来实现线性混合。这个函数的原型如下:

cpp 复制代码
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)

其中:

  • src1src2 是输入的两幅图像
  • alphabeta 是对应的权重
  • gamma 是一个可选的标量,添加到加权和中
  • dst 是输出的图像
  • dtype 是输出图像的深度,-1表示与src1相同

所以,addWeighted()函数实现的操作是:

d s t = α ⋅ s r c 1 + β ⋅ s r c 2 + γ dst = α ⋅ src1 + β ⋅ src2 + γ dst=α⋅src1+β⋅src2+γ

这里,γ对应于上面代码中被设为0.0的参数。这样,我们就可以通过调整αβ的值来控制两幅图像的混合程度。注意,αβ的和通常为1,以保持图像的亮度不变。如果γ不为0,那么它会被添加到混合后的图像中,可以用来调整图像的亮度。这就是OpenCV线性混合的公式以及其中参数的作用。

局部混合

局部混合其实就是把ROI提取出来,使用addWeighted函数即可


总结

通过本文,我们了解了如何在Qt和OpenCV的环境下进行ROI的提取和操作,以及如何将ROI与原图像进行混合。我们首先介绍了如何定义和提取ROI,然后介绍了如何对ROI进行各种操作,最后我们介绍了如何将处理后的ROI与原图像进行混合。希望本文能帮助读者更好地理解和掌握在Qt和OpenCV环境下进行ROI操作和图像混合的方法。在未来的学习和工作中,读者可以根据自己的需求,灵活地运用这些方法,以实现更复杂和高级的图像处理任务。

相关推荐
机器之心8 分钟前
VAE时代终结?谢赛宁团队「RAE」登场,表征自编码器或成DiT训练新基石
人工智能·openai
勤奋菲菲9 分钟前
Vue3+Three.js:requestAnimationFrame的详细介绍
开发语言·javascript·three.js·前端可视化
机器之心9 分钟前
Sutton判定「LLM是死胡同」后,新访谈揭示AI困境
人工智能·openai
大模型真好玩12 分钟前
低代码Agent开发框架使用指南(四)—Coze大模型和插件参数配置最佳实践
人工智能·agent·coze
jerryinwuhan13 分钟前
基于大语言模型(LLM)的城市时间、空间与情感交织分析:面向智能城市的情感动态预测与空间优化
人工智能·语言模型·自然语言处理
要天天开心啊24 分钟前
Java序列化和反序列化
java·开发语言
落雪财神意27 分钟前
股指10月想法
大数据·人工智能·金融·区块链·期股
中杯可乐多加冰27 分钟前
无代码开发实践|基于业务流能力快速开发市场监管系统,实现投诉处理快速响应
人工智能·低代码
渣渣盟28 分钟前
解密NLP:从入门到精通
人工智能·python·nlp
新智元29 分钟前
万亿级思考模型,蚂蚁首次开源!20 万亿 token 搅局开源 AI
人工智能·openai