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

Posted

技术标签:

【中文标题】如何删除图像中的小平行线?【英文标题】:How can I remove small parallel line in image? 【发布时间】:2012-09-12 20:05:22 【问题描述】:

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

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

【问题讨论】:

你能在二值化之前发布图像吗?通过将其二值化,您会丢失信息。 【参考方案1】:

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

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

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

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

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

【讨论】:

【参考方案2】:

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

    根据 blob 所覆盖的面积或周长(即 blob 的轮廓长度)获取长曲线... 在拟合椭圆后获取长曲线长轴的椭圆度或方向(cvBlobslib 库会为您做到这一点..!!)... 过滤所有面积或轮廓小于阈值且与长曲线具有相同方向的斑点....

希望这可能有效..

【讨论】:

【参考方案3】:

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

查看wikipedia上的形态学

见opencvdocumentation

【讨论】:

是的,我可以使用形态学,但它会改变所有对象,但我只想用这些并行来做!!! 将形态学操作限制在靠近主对角线的 ROI【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

2) Erode 3x3(或小实验)形态学运算。

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

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

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

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

【讨论】:

【参考方案6】:

为什么不做类似的事情:

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

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

祝你好运,

【讨论】:

以上是关于如何删除图像中的小平行线?的主要内容,如果未能解决你的问题,请参考以下文章

怎样删除百度中的小程序

如何删除Word中的软回车(向下的小箭头)

pyqt - 如何从状态栏中的小部件中删除边框?

如果未动态添加,如何正确删除Kivy中的小部件

如何删除大量oracle中的小trace文件

如何删除存储在访问(.accdb)中的图像?