如何获得填充算法以应对封闭的圆圈?

时间:2009-11-29 21:17:08

标签: algorithm image background

我有一个应用程序接受图像作为输入并删除拍摄图像的背景。例如,如果您在毯子上传递图书的图像,则生成的图像将只是具有透明背景的图书。

我遇到的问题是当你输入一个空间很大的图像时,例如一条松紧带。填充算法从图像的角落开始,并删除图片的背景,但当然它永远不会进入弹性带的内部。

有没有办法实现这一点,以便我可以在背景上拍摄一个封闭圆圈的图像,然后只回到循环本身,内部或外部没有背景?

3 个答案:

答案 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,其答案解决了一个非常类似的问题。