如何删除图像中的小平行线?
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
并按大小过滤)。
寻找小曲线
对于每条长曲线,计算每条小曲线的每个点与长曲线之间的最小距离。
计算这些最小距离的平均值和标准差。
拒绝与长曲线的平均最小距离过大的小曲线,或最小距离的标准偏差较大的小曲线。
如果您先对图像进行骨架化,结果可能会更好(更快)。
祝你好运,
【讨论】:
以上是关于如何删除图像中的小平行线?的主要内容,如果未能解决你的问题,请参考以下文章