【发布时间】:2020-04-02 01:28:32
【问题描述】:
到目前为止,我已经实现了一个 Floodfill 算法。我想调整它,这样它就不会出现边缘了。为了证明这一点,我上传了一张图片:
图像 1 是我要修改的图像。图 3 是我的算法应该做的。 图 2 是我目前的结果。
所以在这种情况下,targetColor 是白色,replacementColor 是绿色;
这是我到目前为止所做的伪代码。
doFloodFill(x,y,targetColor,replacementcolor) {
if (x and y not in bounds of image) {
return
}
if (color(x,y) IS NOT targetColor) {
return
}
if (color(x+1, y) IS NOT targetColorOfFloodFill AND color(x+1, y) IS NOT replacementColor OR
color(x-1, y) IS NOT targetColorOfFloodFill AND color(x-1, y) IS NOT replacementColor OR
color(x, y+1) IS NOT targetColorOfFloodFill AND color(x, y+1) IS NOT replacementColor OR
color(y, y-1) IS NOT targetColorOfFloodFill AND color(x, y-1) IS NOT replacementColor) {
return;
}
image.setColor(x, y, replacementColor)
doFloodFill(x+3,y,targetcolor,replacementcolor)
doFloodFill(x-3,y,targetcolor,replacementcolor)
doFloodFill(x,y+3,targetcolor,replacementcolor)
doFloodFill(x,y-3,targetcolor,replacementcolor)
}
此调整已实施到我的洪水填充中。将其排除在外会导致正常工作的 floodFill 算法没有任何问题。实际的问题是:如何区分边缘像素和区域内不同颜色的像素?
P.S: 我们可以假设 x, y 从区域内开始
【问题讨论】:
-
什么是
color(x+1)?你可能打算写color(x+1,y)? -
是的,就是这个意思,我要编辑它
-
如果您发布实际、工作和完整的代码,您将获得最佳回复。伪代码和代码片段很难使用。见minimal reproducible example。
-
您说图像 2 是预期结果,图像 3 是实际结果。你的意思可能是相反的吗?并不是说是这样,但似乎这样可能更有意义(尽管我可能只是误解了)。此外,如上所述,一个独立的示例会有所帮助。 (您也许可以将输出打印到控制台以最小化依赖关系。)
-
一种可能的解决方案可能是对感兴趣区域之外的区域(示例中的外部黑色区域)进行泛洪填充。每当泛光填充停止时(例如,通过白色像素),将停止泛光填充的像素标记为边缘像素。然后洪水填充内部并在到达标记为边缘像素的像素时停止。也许其他人会提供更好的方法,但这是我首先想到的。
标签: image algorithm image-processing