文章目录
前言
在计算机视觉和图像处理中,我们经常需要对图像的某一部分(也就是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)
其中:
src1
和src2
是输入的两幅图像alpha
和beta
是对应的权重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操作和图像混合的方法。在未来的学习和工作中,读者可以根据自己的需求,灵活地运用这些方法,以实现更复杂和高级的图像处理任务。