C++ OpenCV-BW图像PCA分析-面积与形状-是否已经实现?
在bw图像上检测对象的形状。对象为黑色连续形状,背景为白色。 我们使用PCA()获取对象方向并对齐对象。当前,形状本身(轮廓上的点)是opencv PCA实现的输入。这通常效果很好。但有时在对象边界上会有小的污垢,导致形状绕过污垢。这会在一侧产生更多的点和更多的权重,从而稍微转动对象 想法:我们使用物体的面积作为PCA分析的输入,而不是轮廓。这里的问题是,检查所有点是否在轮廓内,然后将其用于PCA会降低应用程序的速度。这部分速度将慢52352倍 新方法:我们在图像中随机选取点,检查它们是否在形状内,如果在形状内,则将它们用于PCA。我们必须看看是否能从这种方法中获得所需的一致质量 opencv中是否已经有类似的实现,它使用面积而不是形状? 另一种方法是在对象上放置网格,并使用对象内部的网格点进行PCA。 是否已经有类似的东西可以使用,或者是否需要快速实现类似的东西C++ OpenCV-BW图像PCA分析-面积与形状-是否已经实现?,c++,opencv,shape,pca,area,C++,Opencv,Shape,Pca,Area,在bw图像上检测对象的形状。对象为黑色连续形状,背景为白色。 我们使用PCA()获取对象方向并对齐对象。当前,形状本身(轮廓上的点)是opencv PCA实现的输入。这通常效果很好。但有时在对象边界上会有小的污垢,导致形状绕过污垢。这会在一侧产生更多的点和更多的权重,从而稍微转动对象 想法:我们使用物体的面积作为PCA分析的输入,而不是轮廓。这里的问题是,检查所有点是否在轮廓内,然后将其用于PCA会降低应用程序的速度。这部分速度将慢52352倍 新方法:我们在图像中随机选取点,检查它们是否在形状
在对象周围画直线不是一个选项。可以更改的参数很少,这可能会改进系统 首先是用于对图像进行二值化的阈值。我不知道你的应用程序是关于什么的,但是你可以使用其他的颜色系统,或者通过cromacity标准化你的图像,然后应用新的阈值 另一个方面是排除面积比预期大或小的形状(轮廓)
>加起来,在检测轮廓之前,你可以使用模糊滤镜。
< P>因为我们已经收到了关于你的问题的非常有限的信息(张贴图像会有很大帮助),而且你似乎不知道噪声的概率密度函数,你最好的办法是考虑噪声是高斯的。 因此,根据您的直觉,我建议的方法是取位于对象内部的几个随机点(我指的是统计相关但不会增加那么多的计算时间),然后计算PCA 在迭代循环中重复此过程,并将PCA应用于对象形状时得到的旋转角度存储在某处 一旦你们有了足够的点,停止,计算旋转角度的平均值:这是对真实角度的一个不错的估计。还要计算标准偏差,以获得估计质量的度量。通过“足够的点”,你可以认为,根据中心极限定理,30点通常被认为是代表底层人口的“足够”。如果您愿意,您可以在许多方面对该方法进行改进,例如,一旦收集了足够多的点,就可以对真实角度进行稳健估计。这一切都取决于你手头的数据……把我的建议作为一个起点。我不知道噪音看起来如何,但当你说“小污垢”时,我认为可能只有几个像素比物体本身小得多,但它可能附着在物体上。为了减少这种噪声,可以对二值图像执行打开(形态学)
您可以共享的任何样本图像?以及代码的相关部分获取轮廓的傅里叶描述符,将高于选定阈值的频率分量设置为零,然后进行傅里叶逆变换。通过这种方式,您可以获得轮廓的平滑版本,您可以对其应用PCA。请看一个很好的演示。