3

二值化后我有黑白图像。之后,我有如下图像:

http://ifotos.pl/zobacz/ipng_xhnxhrh.png/

如何使用 OpenCV 删除与长曲线平行的小线?我可以通过移除所有小物体来移除它们,但我只想移除小的平行线。

4

6 回答 6

2

对我来说,这看起来像是一个 Canny 人工制品(或某种振铃人工制品)。有几种方法可以删除它们。

一种经验丰富但计算量不大的方法是定位所有小特征,并将它们与移动了 [+/-]X、[+/-]Y 的相同图像叠加。如果特征与移位图像完全重合,即白色特征中的所有像素在移位图像中也是白色的,那么您可能正在查看伪影。

要评估特征的“小”,您可以使用基本的填充。这种方法很便宜,因为您可以使用指针模拟移位,而无需真正分配四个移位的图像。只要你真的有小的平行线,它就容易出现误报,如果伪影非常大,则容易出现误报。

另一种方法是用不同的阈值对原始图像进行两次后处理。虽然“真实”线条会保持在一起,但振铃伪影将具有不同的强度。此时,您评估图像差异,并考虑“伪影”所有距离图像轨道比给定阈值更远的特征。这需要更多的计算密集度,产生更好的结果,但取决于您对原始图像的了解,即您的工作流程是什么。

重新评估工作流程(更改边缘检测阶段)可能会完全避免创建工件。

于 2012-09-12T20:47:02.893 回答
2

使用cvBlobslib 库将白色补丁检测为 blob...cvBlobslib 库提供了一些函数,您可以通过这些函数找出 blob 的不同特征,例如 area 和 ellipticity ...因此,如果您只想要与长曲线平行的较小补丁...然后 ..

  1. 根据斑点覆盖的面积或周长(即斑点的轮廓长度)获得长曲线...
  2. 拟合椭圆后获取长曲线长轴的椭圆度或方向(cvBlobslib 库将为您执行此操作..!!)...
  3. 过滤所有那些在面积或轮廓方面小于阈值并且与长曲线具有相同方向的斑点......

希望这可能有效..

于 2012-09-13T13:33:46.290 回答
1

也许与其他人所说的相似,但用更简单的话来说:由于小线似乎大约是长线粗细的一半,如果你真的不关心保持长线的原样,你可以应用几个乘以“使线条变细”的简单算法,直到小线条消失。您需要做的是逐像素扫描图像,当您检测到黑色像素上方或下方或左侧或右侧的白色像素时,您将其坐标存储在矢量中。遍历整个图像后,将向量中坐标指定的所有像素设置为黑色。您可以根据经验为该算法的迭代次数定义一些阈值。

于 2012-09-12T21:46:55.993 回答
1

如果您事先知道线条的方向,则可以使用适合您需要的自定义结构元素进行形态闭合。

参见维基百科上的morphomat

见 opencv文档

于 2012-09-12T20:43:08.283 回答
1

以下是利用平行线增加边缘密度这一事实的步骤。

1)应用于adaptive Threshold灰度图像以获得许多边缘。

2)Erode3x3(或小实验)形态学操作。

3) 取Logical Not边缘密度。

4) 应用Dilate3x3 或 5x5。它将扩大边缘以合并并形成一个区域。

5)现在Erode7x7(或实验更高然后最后扩张)形态学操作。它将删除大部分不需要的区域、长线和小的杂散区域。

输出是去除区域的 MASK。您可以在原始图像上应用轮廓检测​​并移除轮廓对象以在掩模高精度移除中匹配位置。或者,如果您不需要仅And使用 mask 的高精度结果NOT

于 2014-10-27T14:11:11.443 回答
0

为什么不做类似的事情:

  1. 找到长曲线(使用findContours并按大小过滤)。
  2. 找到小曲线
  3. 对于每条长曲线,计算每条小曲线的每个点与长曲线之间的最小距离。
  4. 计算这些最小距离的平均值和标准差。
  5. 拒绝与长曲线的平均最小距离太大的小曲线,或最小距离的标准偏差大的小曲线。

如果您首先对图像进行骨架化,结果可能会更好(更快)。

祝你好运,

于 2012-09-13T07:09:43.047 回答