OpenCV中七个Hu不变矩函数的含义

18

我了解七个Hu不变矩是用于目标的平移、旋转和缩放变化,以便独立识别这些因素。

这就是为什么我使用了OpenCV中的“moments”函数来提取中心矩,然后使用“HuMoments”函数获取以下二值化图像的七个不变矩:

enter image description here

我的第一个问题与OpenCV中“moments”函数的使用有关。第二个参数是“binaryImage”,我将其设置为true,因为它是二值化图像,这样可以吗?

我的第二个疑问是关于“HuMoments”函数的输出:七个Hu不变矩。我不理解这些数据。哪些数据与旋转有关,哪些数据与平移有关,哪些数据与缩放变化有关?

非常感谢!干杯!


当使用几何矩时,远离主要对象的噪声像素(例如左下角或右上角的像素)将在计算中给您相对较大的误差,这些误差将传播到不变量计算中。 - Leonidas K
谢谢你的信息,Leonidas。你推荐我使用什么样的滤波器来消除图像中的噪声? - andrestoga
一个简单而粗略的解决方案是使用形态学腐蚀和膨胀,如果你预计噪声对象非常小。但这也会影响你的主要对象。 - Leonidas K
是的,这就是问题所在,我不想影响主要对象。 - andrestoga
那么我认为您最好的选择是找到对象并丢弃非常小的对象。我不知道在OpenCV中如何完成这项工作,但在他的回答中@Abid提到了轮廓。一旦您拥有对象,就只需要根据像素数量设置合理的阈值(根据图像大小大约为10-20)来丢弃非常小的对象。我还会选择一个简单的非线性滤波器,在一个大邻域(15x15)内检查非零元素的数量。如果它低于10,则将像素置零。 - Leonidas K
2个回答

16

第一个问题:

如果图像中只有一个物体,那么这样做是可以的。如果有多个物体,想要为每个物体找到矩时,则需要使用轮廓。请访问:http://opencvpython.blogspot.in/2012/06/contours-3-extraction.html

第二个问题:

(看到你的问题后,我也在思考这个)

Hu矩是由胡明贵先生在1962年发表的论文“Visual Pattern Recognition by Moment Invariants”中提出的。

在论文中,他使用高级数学内容解释了它们。如果需要,您可以查看该论文。

他指出:

定理:中心矩在平移下是不变的。

当您使用moments()函数找到矩时,它会返回三种类型的矩,包括空间矩(Mji)、 中心矩(MUji)和中心归一化矩(NUji)。请查看文档了解更多信息。

在第4-C节的结尾,Hu指出,在七个关系中(请访问这里),前六个关系在平移、大小和旋转下是不变的,而第七个关系是倾斜不变的,可以用于区分镜像图像。

我搜索了很多关于Hu矩的值代表什么的资料,但所有的论文都说了同一句话:"从不随着大小、位置和方向变化的中心矩计算出七个Hu矩"。他们并没有说明每个矩代表什么。

而OpenCV经典书籍《Learning OpenCV》作者Gary Bradsky先生给了我们一些启示,告诉我们要继续探索。(请参见第254页)


2
感谢 @Abid。我真的惊讶于在互联网上找不到一些示例图片以说明什么时刻对应于何种视觉效果。似乎很容易制作一些说明它们的图片。可以为一组点计算矩并使用任何优化算法调整它们的位置,直到找到一个配置,在该配置中,例如,一个特定时刻为1,而其他时刻为0等。例如, hu [0] 不像椭圆的离心率吗?可以用形成等腰三角形的3个点或菱形的4个点来说明它。有人可以做一下吗? - Stéphane Gourichon

4
回答你的第二个问题:
我认为Hu 不变矩没有任何意义。它们仅仅是保证对于给定的形状,在移动、旋转或者缩放时始终保持不变。
您似乎希望了解的有关数据是:
"哪些数据与旋转有关,哪些与平移有关,哪些与比例变化有关?"
这个问题并没有什么意义,因为按照定义,它们都与旋转、平移和比例变化无关。但是,我们可以很容易地提出类似的问题,例如:
"哪些数据与角落数量、圆度或宽高比相关?"
在这里,我想这些矩并不与我们想要相关的任何属性相关,因此答案是没有任何意义。
那么,这让我们怎么办呢?如果我们想比较两个对象是否具有相似的“形状”,(通过“形状”我们指的是我们不关心旋转、平移和比例变化),我们可以计算Hu不变矩并进行比较。如果这些值“近似”相等,那么你可以希望说这些形状“近似”相同。然后,我们希望这些矩在不同形状之间有很大的差异——这是否成立,是别人可以回答的有趣问题。
例如,假设我们计算正方形的一些矩(仅显示三个和范围为0到1以简化):
(0.5, 0.5, 0.5)

我们希望圆圈能够呈现出类似的东西:
(0.5, 1, 0.5)

还有一个椭圆形:

(0.5, 1, 0.7)

这可以帮助你比较这些形状。如果你计算一个未知形状的矩并得到:
(0.51, 0.98, 0.47)

希望这是一个圆形,但如果星星给了你:


(0.2, 0.6, 0.9)

如果一个月牙形状也提供了同样的东西,那就不是那么有用了。但如果有七个矩阵,这些矩阵中至少有几个会对形状的重要特征产生显著差异,这种可能性就比较大。

希望这能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接