计算机视觉算法:基于OpenCV的计算机应用开发》 —3.4.4 数学函数

网友投稿 866 2022-05-30

3.4.4 数学函数

跟本章前面的内容不同,本节将要学习的数学计算函数和算法都不是基于元素的。它们包括简单函数,例如均值、求和,以及更复杂的运算,例如离散傅里叶变换。让我们通过实例浏览一些最重要的内容。

3.4.4.1 矩阵求逆

invert函数可用于计算矩阵的逆。不要与bitwise_not函数混淆,bitwise_not会反转图像像素中的每一位。invert 函数不是基于元素的函数,需要提供反转方法作为该函数的参数。见下例:

枚举DecompTypes包含可在invert 函数中用作为分解类型的所有条目。具体如下:

如果你对每种分解方法的详细描述感兴趣,请参阅OpenCV文档以获取Decomp

Types枚举的说明。

3.4.4.2 元素的平均值及求和

《计算机视觉算法:基于OpenCV的计算机应用开发》 —3.4.4 数学函数

你可以使用mean函数计算矩阵中元素的平均值。下面的例子显示如何读取图像、计算并显示其所有通道的平均值:

你可以用完全相同的方式使用sum函数来计算矩阵中元素的总和:

OpenCV中还有一个meanStdDev函数,用于同时计算矩阵中所有元素的平均值和标准差。下面是一个例子:

与mean函数类似,meanStdDev函数也分别计算每个通道的结果。

3.4.4.3 离散傅里叶变换

一维或二维数组(二维数组即图像)的离散傅里叶变换,是在计算机视觉中分析图像的众多方式之一。结果的解释完全取决于使用它的领域,这不是本书中的重点,但我们将在本节中学习如何进行离散傅里叶变换。

简单地说,你可以使用dft函数来计算图像的傅里叶变换。但是,在安全地调用dft功能之前,需要做一些准备工作,这同样适用于傅里叶变换的结果。让我们用一个示例代码并通过计算和显示之前使用过的示例图像的傅里叶变换,来理解这个问题。

dft函数可以更有效地处理某些尺寸的矩阵(2的幂,例如2、4和8),这就是为什么在调用dft函数之前,最好将矩阵的尺寸增加到最接近的2的幂并用零填充它。这样可以使用getOptimalDFTSize函数来完成。假设我们想要计算输入图像的离散傅里叶变换,可以编写如下代码来计算并调整其大小为dft函数的最佳大小:

如你所见,对于行和列,必须分别调用getOptimalDFTSize函数。现在,你应该已经熟悉了copyMakeBorder函数。调整图像大小并用零(或其他值)填充新像素是copyMakeBorder函数的无数用法之一。

剩下的很简单,我们需要形成一个双通道图像并将其传递给dft函数,并在同一个矩阵中得到复数结果(实部和虚部)。这将简化显示结果的过程。代码如下:

我们学过如何使用merge函数。在前面的代码中唯一需要注意的地方是结果与输入保存在同一图像中。complexImage现在包含两个通道,分别是离散傅里叶变换结果的实部和虚部。就是这样!我们现在得到结果了,但是为了能够显示它,我们必须计算结果的幅值。代码如下:

在前面的代码中,我们将复杂的结果拆分为通道,然后使用magnitude函数计算了其幅度。从理论上讲,mag是一个可显示的结果,但实际上,它的值远远高于OpenCV可以显示的范围,因此我们需要在显示它之前执行几次转换。首先,我们需要通过执行以下转换来确保结果采用对数量度:

接下来,我们必须确保将结果值缩放并标准化以使其介于0.0~1.0之间,以便通过OpenCV中的imshow函数显示。因此,你需要使用normalize函数:

现在你可以尝试使用imshow函数显示结果了。下面是显示离散傅里叶变换结果的示例:

该结果的问题在于,在结果的原点位于图像的中心之前,需要交换象限。下图描绘了在结果的中心位置之前,必须如何交换结果的四个象限:

以下是交换傅里叶变换结果的四个象限所需的代码:首先找到结果的中心,然后创建四个感兴趣区域(ROI)矩阵,然后交换它们:

dft函数接受一个附加参数用于进一步自定义其行为,此参数可以是DftFlags枚举值的组合。例如,要执行傅里叶变换的逆变换,需要在调用dft函数时使用DFT_INVERSE参数:

这也可以通过idft函数来完成:

请查看DftFlags枚举和dft函数文档,以获取有关如何在OpenCV中实现离散傅里叶变换的更多信息。

3.4.4.4 生成随机数

随机数生成是计算机视觉中使用最广泛的算法之一,尤其是在用给定范围的随机数测试现有算法时。使用OpenCV库时,可以使用以下函数生成随机数或随机数矩阵:

randn函数可以用来生成具有给定平均值和标准差的随机数矩阵或数组。以下是此函数的使用方法:

randu函数类似于randn函数,使用随机数填充数组,但是,此函数使用上限和下限(包括两者)来生成随机值,而不是均值和标准差。下面是一个例子:

randShuffle函数,从函数名就能猜出,可用于随机重组数组或矩阵的元素。它的用法很简单,见下例:

OpenCV

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:性能测试入门01
下一篇:华为软件开发云使用分享:秒杀现有研发团队协作工具
相关文章