我有一个应用程序接受图像作为输入并删除拍摄图像的背景。例如,如果您在毯子上传递图书的图像,则生成的图像将只是具有透明背景的图书。
我遇到的问题是当你输入一个空间很大的图像时,例如一条松紧带。填充算法从图像的角落开始,并删除图片的背景,但当然它永远不会进入弹性带的内部。
有没有办法实现这一点,以便我可以在背景上拍摄一个封闭圆圈的图像,然后只回到循环本身,内部或外部没有背景?
答案 0 :(得分:2)
您可以在每次填充洪水后重新取样,并在找到与原始背景相匹配的颜色时重新启动它。
洪水填充算法设计为从一个点开始,并从那里填充约束区域,类似颜色的区域。圆圈与背景颜色不匹配,因此填充算法不会“跳”它以找到其他颜色。
解决方案是淹没不同的区域。
这是一个非常粗糙的,递归的,慢速泛洪填充算法(来自内存,未经测试):
public void floodfill(Image img, int x, int y, Color oldColor, Color newColor) {
// Check boundary
if (img.contains(x, y)) {
// Get current pixel color
Color currentColor = img.getColor(x, y);
// Check color match
if (currentColor.equals(oldColor)) {
// Set to new color
img.setColor(x, y, newColor);
// Start again on each of the neighbors
floodFill(img, x - 1, y, oldColor, newColor);
floodFill(img, x + 1, y, oldColor, newColor);
floodFill(img, x, y - 1, oldColor, newColor);
floodFill(img, x, y + 1, oldColor, newColor);
}
}
}
答案 1 :(得分:0)
你可以弄清楚背景的主要颜色是什么(你应该能够做到这一点,因为你能够从角落开始移除背景)并在图像的其他地方寻找那种颜色。
答案 2 :(得分:0)
This question,其答案解决了一个非常类似的问题。