2009-11-29 2 views
0

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

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

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

+1

не понимаю ни слова. upvoted для компенсации – ldog

ответ

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

Если вы помните эту функцию, чтобы пропустить ранее просматриваемые (x, y) кортежи, это происходит намного быстрее. – PaulMcG

0

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

Смежные вопросы