Как мне получить алгоритм заливки, чтобы справиться с замкнутыми кругами? - PullRequest
0 голосов
/ 30 ноября 2009

У меня есть приложение, которое принимает изображения в качестве входных данных и удаляет фон, на котором было сделано изображение. Например, если передать изображение книги на одеяле, полученное изображение будет просто книгой с прозрачным фоном.

Проблема в том, что вы вводите изображение с большим пустым пространством, например, резинка. Алгоритм заливки запускается в углах изображения и удаляет фон изображения, но, конечно, он никогда не попадает внутрь резинки.

Есть ли способ реализовать это так, чтобы я мог сделать изображение замкнутого круга на фоне и получить обратно только сам цикл, без фона внутри или снаружи?

Ответы [ 3 ]

2 голосов
/ 30 ноября 2009

Вы всегда можете повторно сэмплировать изображение после каждой заливки и перезапускать его всякий раз, когда найдете цвет, соответствующий исходному фону.

Алгоритмы заполнения Flood предназначены для запуска в одном месте, а оттуда заполняют ограниченную область, область аналогичных цветов. Круг не соответствует этому цвету фона, поэтому алгоритм заливки не «прыгает» на него, чтобы найти другие.

Решение заключается в затоплении различных областей.

Вот очень грубый, рекурсивный, медленный алгоритм заполнения потока (из памяти, не проверенный):

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);
        }
    }
}
0 голосов
/ 30 ноября 2009

Этот вопрос и ответы на него решают очень похожую проблему.

0 голосов
/ 30 ноября 2009

вы можете выяснить, какой преобладающий цвет фона (что вы должны делать, так как вы можете удалить фон, начиная с углов), и искать этот цвет повсюду в изображении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...