二值化后我有黑白图像。之后我有如下图像:
如何使用OpenCV删除与长曲线平行的小线?我可以通过删除所有小对象来删除它们,但我想只删除小的并行 线。
答案 0 :(得分:2)
对我来说,这看起来像一个Canny神器(或某种振铃神器)。有几种方法可以删除它们。
经验但不太计算密集的方法是定位所有小特征,并将它们与移动了[+/-] X,[+/-] Y的相同图像叠加。如果该特征与移位的图像完全一致,即白色特征中的所有像素在移位的图像中也是白色的,那么您可能正在查看一个工件。
要评估功能的“小”,您可以使用基本的填充。这种方法很便宜,因为你可以用指针模拟移位,而不需要真正分配四个移位的图像。无论你有什么小的平行线,它都容易出现误报,如果伪像非常大,则容易出现假阴性。
另一种方法是将具有不同阈值的原始图像两次分色。虽然“真实”线条将保持在一起,但是振铃文物将具有不同的强度。此时,您将评估图像差异,并将“工件”视为远的所有要素,而不是来自图像轨迹的给定阈值。这需要更多的计算量,产生更好的结果,但取决于您对原始图像的拥有,即您的工作流程。
重新评估工作流程(改变边缘检测阶段)可能会完全避免产生工件。
答案 1 :(得分:2)
使用cvBlobslib library将白色斑块检测为blob ... cvBlobslib库提供了一些函数,通过这些函数可以找到斑点的不同特征,如区域和椭圆度...所以如果你只想要更小的平行于长曲线的补丁...然后..
希望这可行..
答案 2 :(得分:1)
答案 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)
为什么不这样做:
findContours
并按尺寸过滤)。结果可能会更好(并且更快)您首先对图像进行骨架化。
祝你好运,