Подсчитайте количество "дырок" в растровом изображении

рассмотрим растровое изображение MxN, где ячейки равны 0 или 1. "1" означает заполненный, а " 0 " означает пустой.

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

например, это имеет два отверстия:

11111  
10101  
10101  
11111  

... и это имеет только одно:

11111  
10001  
10101  
11111

каков самый быстрый способ, когда M и N находятся между 1 и 8?

уточнение: диагонали не считаются смежное, только боковое соседство имеет значение.

Примечание: я ищу что-то, что использует формат данных. Я знаю, как преобразовать это в график и [BD]FS, но это кажется излишним.

3 ответов


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

вы также можете использовать BFS/DFS но я бы рекомендовал вышеуказанные алгоритмы.


Это похоже на хорошее использование структуры данных непересекающихся наборов.
Преобразование растрового изображения в 2d массив
цикл через каждый элемент
если текущий элемент равен 0, объедините его с набором его "предыдущих" пустых соседей (уже посещенных)
если у него нет пустых соседей, добавьте его в свой собственный набор

тогда просто посчитайте количество наборов


могут быть преимущества, полученные с помощью поиска таблиц и побитовых операций.

например, вся строка из 8 пикселей может быть просмотрена в таблице 256 элементов, поэтому количество отверстий в поле 1xN получается одним поиском. Затем может быть некоторая таблица поиска элементов 256xK, где K-количество конфигураций отверстий в предыдущей строке, число полных отверстий и следующая конфигурация отверстий. Это просто идея.