algorithm - 我如何获得洪水填充算法来应对封闭的圆圈?

标签 algorithm image background

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

我遇到的问题是当您输入的图像中有很大的空白区域时,例如松紧带floodfill 算法从图像的角落开始并移除图片的背景,但当然它永远不会进入松紧带的内部。

有没有一种方法可以实现这一点,这样我就可以在背景下拍摄一个闭合圆圈的图像,然后只返回循环本身,而内部或外部都没有背景?

最佳答案

您始终可以在每次颜色填充后对图像重新采样,并在您找到与原始背景匹配的颜色时重新开始。

洪水填充算法设计为从一个点开始,然后从那里填充一个受限区域,一个颜色相似的区域。圆圈与该背景颜色不匹配,因此填充算法不会“跳转”它来寻找其他颜色。

解决方案是对不同区域进行淹没。

这是一个非常粗糙的、递归的、缓慢的洪水填充算法(来自内存,未经测试):

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);
        }
    }
}

关于algorithm - 我如何获得洪水填充算法来应对封闭的圆圈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1816809/

相关文章:

javascript - 用单一路径填充二维网格

image - 将 DICOM 中的体素转换为 mm^3

html - CSS 模块继承图像高度 100% 问题

image - 在 div 内滚动的整页背景图像

arrays - 计算 DAG 中所有长度的路径数

java - 为什么我的帕斯卡三角代码不起作用?

python - 写优化函数

image - JavaFX中的有效图像裁剪

css - 有没有办法覆盖 HTML5 表单验证消息的默认 CSS

ios - 在后台收集加速度计数据