考虑到我有一个彩色图像,如this,其中轮廓不完整(线之间有间隙)。我希望能够用一种颜色或另一种颜色填充线条之间的区域。这实际上是我在相应的灰度图像上应用canny边缘检测器后得到的二值图像。
我尝试首先扩大图像然后侵蚀图像,但结果不够好。我希望能够保留根的厚度
非常感谢任何帮助
原始图片
边缘检测后的图像和一些手动删除像素
使用边缘图像中的信息,我想我会尝试从某种颜色的原始图像中提取像素。对于编辑图像中的每个白色像素,我在原始图像中沿着相同的水平线使用了搜索空间。我对R,G和B使用了不同的阈值,我最终得到了这个
答案 0 :(得分:1)
我不确定你的原始图片是什么样的。看看会很有帮助。
线条之间有间隙,因为原始图像中的线条有两条边,每边一条。 canny算法正在检测它们。 Canny边缘检测算法的核心是应用两个Sobel核来计算梯度,一个用于检测水平边缘,另一个用于检测垂直边缘。
-1 0 +1
-2 0 +2
-1 0 +1
and
+1 +2 +1
0 0 0
-1 -2 -1
这些内核将为线的两侧呈现峰值。一个高峰正面和一个负面。您可以通过排除相应的峰值来排除该行的一侧。在取每个方向的梯度后,截断零以下的任何值(将值设置为零)以移除第二个峰值。然后像往常一样继续Canny边缘检测。这将导致每行仅检测到一条边,而不是您现在看到的两条边。
答案 1 :(得分:0)
您可以尝试使用线扫描方法。从侧面开始并水平扫描。当你到达边缘时,你假设你在一个根,你开始将体素设置为白色。当你碰到另一个边缘时,你会认为你正在离开一个根并开始。会有一些边缘情况,您可能需要添加其他检查,例如限制根的允许厚度。
您还可以执行填充样式算法,在该算法中,您可以在根中获取种子点并向上移动填充它的根。
不确定它们的效果如何,因为它取决于图像,我没有测试它。
答案 2 :(得分:0)
我现在已经看到了第三种方法。看起来大部分信息都在绿色通道中。
绿色通道图片
如果您只是应用阈值,此图像会给您一个不错的结果。 具有某种任意阈值的阈值图像
然后,您可以自行清理此图像或使用边缘图像。要使用您生成的边缘图像清除它,请删除距离您检测到的边缘一定距离的任何白色像素(从边缘图像创建欧几里德距离贴图,并使用该图像设置大于特定距离的任何白色像素)从边缘到黑色)。
如果您仍然在收集图像,您可能需要尝试将相机放置在避开罐子底部的位置(或者不管是什么)。