二值化后我有黑白图像。之后,我有如下图像:
如何使用 OpenCV 删除与长曲线平行的小线?我可以通过移除所有小物体来移除它们,但我只想移除小的平行线。
二值化后我有黑白图像。之后,我有如下图像:
如何使用 OpenCV 删除与长曲线平行的小线?我可以通过移除所有小物体来移除它们,但我只想移除小的平行线。
对我来说,这看起来像是一个 Canny 人工制品(或某种振铃人工制品)。有几种方法可以删除它们。
一种经验丰富但计算量不大的方法是定位所有小特征,并将它们与移动了 [+/-]X、[+/-]Y 的相同图像叠加。如果特征与移位图像完全重合,即白色特征中的所有像素在移位图像中也是白色的,那么您可能正在查看伪影。
要评估特征的“小”,您可以使用基本的填充。这种方法很便宜,因为您可以使用指针模拟移位,而无需真正分配四个移位的图像。只要你真的有小的平行线,它就容易出现误报,如果伪影非常大,则容易出现误报。
另一种方法是用不同的阈值对原始图像进行两次后处理。虽然“真实”线条会保持在一起,但振铃伪影将具有不同的强度。此时,您评估图像差异,并考虑“伪影”所有距离图像轨道比给定阈值更远的特征。这需要更多的计算密集度,产生更好的结果,但取决于您对原始图像的了解,即您的工作流程是什么。
重新评估工作流程(更改边缘检测阶段)可能会完全避免创建工件。
使用cvBlobslib 库将白色补丁检测为 blob...cvBlobslib 库提供了一些函数,您可以通过这些函数找出 blob 的不同特征,例如 area 和 ellipticity ...因此,如果您只想要与长曲线平行的较小补丁...然后 ..
希望这可能有效..
也许与其他人所说的相似,但用更简单的话来说:由于小线似乎大约是长线粗细的一半,如果你真的不关心保持长线的原样,你可以应用几个乘以“使线条变细”的简单算法,直到小线条消失。您需要做的是逐像素扫描图像,当您检测到黑色像素上方或下方或左侧或右侧的白色像素时,您将其坐标存储在矢量中。遍历整个图像后,将向量中坐标指定的所有像素设置为黑色。您可以根据经验为该算法的迭代次数定义一些阈值。
以下是利用平行线增加边缘密度这一事实的步骤。
1)应用于adaptive Threshold
灰度图像以获得许多边缘。
2)Erode
3x3(或小实验)形态学操作。
3) 取Logical Not
边缘密度。
4) 应用Dilate
3x3 或 5x5。它将扩大边缘以合并并形成一个区域。
5)现在Erode
7x7(或实验更高然后最后扩张)形态学操作。它将删除大部分不需要的区域、长线和小的杂散区域。
输出是去除区域的 MASK。您可以在原始图像上应用轮廓检测并移除轮廓对象以在掩模高精度移除中匹配位置。或者,如果您不需要仅And
使用 mask 的高精度结果NOT
。
为什么不做类似的事情:
findContours
并按大小过滤)。如果您首先对图像进行骨架化,结果可能会更好(更快)。
祝你好运,