OpenCV - BW图像的PCA分析 - 区域与形状 - 是否已经实现?

时间:2017-03-22 14:46:36

标签: c++ opencv shape pca area

在bw图像上检测物体的形状。物体是黑色连续形状,背景是白色。 我们使用PCA(http://docs.opencv.org/3.1.0/d1/dee/tutorial_introduction_to_pca.html)来获取对象方向并对齐对象。目前,形状本身(轮廓上的点)是opencv PCA实现的输入。这通常很有效。但物体边界上不时有小污垢,导致形状绕过污垢。这会在一侧产生更多的点和更多的重量,稍微转动物体。

想法:我们使用对象的区域作为PCA分析的输入,而不是轮廓。那里的问题,检查所有点是否在轮廓内,然后将它们用于PCA会减慢应用程序的速度。这部分将慢大约52352倍。

新方法:我们在图像中采用随机点,检查它们是否在形状内,如果是,请将它们用于我们的PCA。我们必须看看我们是否能够从这种方法中获得所需的一致质量。

在opencv中是否已经有类似的实现使用区域而不是形状? 另一种方法是在对象上放置一个网格,并使用对象内部的网格点进行PCA。 是否已经可以使用类似的东西,或者很快就需要实现这样的东西?

在对象周围寻找直线不是一种选择。

3 个答案:

答案 0 :(得分:2)

鉴于我们收到的关于您的问题的信息非常有限(发布图片会有很多帮助),而您似乎并不知道噪声的概率密度函数,您最好的选择是将噪声视为高斯噪声。 / p>

因此,并且遵循你的直觉,我建议的方法是采取一些(通过一些我的意思是统计相关但不会提高计算时间那么多)随机点位于对象内部并计算PCA。

在迭代循环中重复此过程,并将从PCA应用程序获得的旋转角度存储到对象形状。

一旦你有足够的点就停止,计算旋转角度的平均值:这是对真实角度的合理估计。计算标准偏差以衡量您的估计质量。通过"足够的分数"你可以认为~30分通常被认为是足够的"根据中心极限定理来代表基础人口。

如果您愿意,可以通过多种方式改进此方法,例如,一旦收集到足够的点,就可以对真实角度进行稳健估计。这一切都取决于你手边的数据......把我的建议作为一个起点。

答案 1 :(得分:1)

您可以更改几个参数,这些参数可能会改善您的系统。

首先是用于对图像进行二值化的阈值。我不知道您的应用程序是什么,但您可以使用其他颜色系统,或通过cromacity标准化您的图像,然后应用新的阈值。

其他方面是排除具有您所期望的更大或更小面积的形状(轮廓)。

要相加,您可以在检测轮廓之前使用模糊滤镜。

答案 2 :(得分:1)

我不知道噪音是怎么看的,但是当你说“小污垢”时,我认为它可能只有几个像素比它自身的物体小很多,但它可能附着在物体上。为了减少这种噪声,可以在二值图像上执行开口(形态学)。

http://docs.opencv.org/2.4/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.html