【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操作和图像混合的方法。在未来的学习和工作中,读者可以根据自己的需求,灵活地运用这些方法,以实现更复杂和高级的图像处理任务。

相关推荐
我不是代码教父12 分钟前
[原创](Modern C++)现代C++的关键性概念: 流格式化
c++·字符串格式化·流格式化·cout格式化
kakaZhui13 分钟前
【llm对话系统】大模型源码分析之 LLaMA 位置编码 RoPE
人工智能·深度学习·chatgpt·aigc·llama
利刃大大29 分钟前
【回溯+剪枝】找出所有子集的异或总和再求和 && 全排列Ⅱ
c++·算法·深度优先·剪枝
子燕若水1 小时前
mac 手工安装OpenSSL 3.4.0
c++
来恩10031 小时前
C# 类与对象详解
开发语言·c#
*TQK*1 小时前
ZZNUOJ(C/C++)基础练习1041——1050(详解版)
c语言·c++·编程知识点
struggle20251 小时前
一个开源 GenBI AI 本地代理(确保本地数据安全),使数据驱动型团队能够与其数据进行互动,生成文本到 SQL、图表、电子表格、报告和 BI
人工智能·深度学习·目标检测·语言模型·自然语言处理·数据挖掘·集成学习
佛州小李哥1 小时前
通过亚马逊云科技Bedrock打造自定义AI智能体Agent(上)
人工智能·科技·ai·语言模型·云计算·aws·亚马逊云科技
komo莫莫da1 小时前
寒假刷题Day19
java·开发语言
追求源于热爱!1 小时前
记5(一元逻辑回归+线性分类器+多元逻辑回归
算法·机器学习·逻辑回归