OpenCV 4.13.0
开源计算机视觉库 (Open Source Computer Vision)
正在加载...
正在搜索...
未找到匹配项
矩阵上的掩膜操作

上一篇教程: 如何使用 OpenCV 扫描图像、查找表和时间测量
下一篇教程: 图像操作

原作者Bernát Gábor
兼容性OpenCV >= 3.0

矩阵上的掩膜操作非常简单。其思想是,我们根据一个掩膜矩阵(也称为核)重新计算图像中每个像素的值。这个掩膜包含的值将调整相邻像素(和当前像素)对新像素值的影响程度。从数学角度看,我们用指定的值进行加权平均。

我们的测试用例

让我们考虑图像对比度增强方法的问题。基本上,我们想对图像的每个像素应用以下公式

\[I(i,j) = 5*I(i,j) - [ I(i-1,j) + I(i+1,j) + I(i,j-1) + I(i,j+1)]\]

\[\iff I(i,j)*M, \text{其中 } M = \bordermatrix{ _i\backslash ^j & -1 & 0 & +1 \cr -1 & 0 & -1 & 0 \cr 0 & -1 & 5 & -1 \cr +1 & 0 & -1 & 0 \cr }\]

第一种表示法是使用公式,而第二种是通过使用掩膜对第一种进行压缩。使用掩膜的方法是:将掩膜矩阵的中心(在上图中由零-零索引表示)放在要计算的像素上,然后将像素值与重叠的矩阵值相乘并求和。它们是同一个东西,但在大型矩阵的情况下,后一种表示法更容易查看。

代码

基本方法

现在让我们看看如何通过使用基本像素访问方法或使用 filter2D() 函数来实现这一点。

这是一个执行此操作的函数

我们创建一个与输入图像大小和类型相同的输出图像。正如您在存储部分所看到的,根据通道数,我们可能有一个或多个子列。

filter2D 函数

在图像处理中,应用此类滤波器非常常见,因此 OpenCV 中有一个函数可以处理掩膜(在某些地方也称为核)的应用。为此,您首先需要定义一个保存掩膜的对象

然后调用 filter2D() 函数,指定输入图像、输出图像和要使用的核

该函数甚至有第五个可选参数来指定核的中心,第六个用于在将过滤后的像素存储到 K 中之前添加一个可选值,第七个用于确定在操作未定义区域(边界)中执行什么操作。

这个函数更短,更简洁,并且由于存在一些优化,它通常比手写方法更快。例如,在我的测试中,第二个只用了 13 毫秒,而第一个用了大约 31 毫秒。这差距相当大。

例如