如何删除图像中的小平行线?

时间:2012-09-12 20:05:23

标签: c++ image-processing opencv graphics computer-vision

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

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

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

6 个答案:

答案 0 :(得分:2)

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

经验但不太计算密集的方法是定位所有小特征,并将它们与移动了[+/-] X,[+/-] Y的相同图像叠加。如果该特征与移位的图像完全一致,即白色特征中的所有像素在移位的图像中也是白色的,那么您可能正在查看一个工件。

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

另一种方法是将具有不同阈值的原始图像两次分色。虽然“真实”线条将保持在一起,但是振铃文物将具有不同的强度。此时,您将评估图像差异,并将“工件”视为的所有要素,而不是来自图像轨迹的给定阈值。这需要更多的计算量,产生更好的结果,但取决于您对原始图像的拥有,即您的工作流程。

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

答案 1 :(得分:2)

使用cvBlobslib library将白色斑块检测为blob ... cvBlobslib库提供了一些函数,通过这些函数可以找到斑点的不同特征,如区域和椭圆度...所以如果你只想要更小的平行于长曲线的补丁...然后..

  1. 根据斑点或预测仪覆盖的区域获得长曲线,即斑点的轮廓长度......
  2. 在拟合椭圆后获取长曲线的长轴的椭圆度或方向(cvBlobslib库将为您做到!! !!)...
  3. 根据面积或轮廓过滤所有小于阈值的斑点,与长曲线具有相同的方向 ....
  4. 希望这可行..

答案 2 :(得分:1)

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

请参阅wikipedia

上的morphomat

请参阅opencv documentation

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

1)在灰色图像上应用adaptive Threshold以获得许多边缘。

2)Erode 3x3(或实验但很小)形态学操作。

3)取Logical Not获得边缘密度。

4)应用类似3x3或5x5的Dilate。它会扩大边缘以合并并形成一个区域。

5)现在Erode 7x7(或实验为高于最后一次扩张)形态学操作。它将删除大部分非必需区域,长线和小杂散区域。

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

答案 5 :(得分:0)

为什么不这样做:

  1. 查找长曲线(使用findContours并按尺寸过滤)。
  2. 找到小曲线
  3. 对于每条长曲线,计算每条小曲线的每个点与长曲线之间的最小距离。
  4. 计算这些最小距离的平均值和标准差。
  5. 拒绝与长曲线的平均最小距离过大的小曲线,或最小距离的标准偏差较大的小曲线。
  6. 结果可能会更好(并且更快)您首先对图像进行骨架化。

    祝你好运,