2010-10-26 4 views
10

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

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

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

11111 
10101 
10101 
11111 

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

11111 
10001 
10101 
11111 

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

Уточнение: диагонали не считаются смежными, только вопросы со стороны смежности.

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

+0

Почему этот запах домашней работы или кода-гольфа? @Florin, спасибо за обновление. Пожалуйста, рассмотрите это замечание «отменено». Мы возьмем ваше слово. – jcolebrand

+0

это ВКУСЫ, как домашнее задание! – Luiscencio

+1

Это не домашнее задание, но это не имеет значения. Я пытаюсь решить большую проблему, и это просто подзадача. – florin

ответ

17

Вам необходимо сделать connected component labeling на Ваше изображение. Вы можете использовать Two-pass algorithm, описанные в статье I Википедии, приведенной выше. Учитывая небольшой размер вашей проблемы, может быть достаточно One-pass algorithm.

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

+1

Да, связанная маркировка компонентов должна делать трюк. Кроме того, поздравляю 10k, @Jacob (или почти - я думаю, вы нанесли репутацию на сегодняшний день). – Jonas

+0

@ Джонас: Я знаю! Надеюсь, Флорин примет этот ответ сегодня :) – Jacob

+0

@Jonas: Я могу признать поздравления сейчас: D – Jacob

5

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

затем просто посчитать количество комплектов

+0

~ это именно то, с чем уже связался @Jacob. – jcolebrand

+0

Я написал этот ответ, прежде чем смотреть на него. –

0

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

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

+0

Я только начал строить свою таблицу поиска 2^64, но у меня закончился бюджет на год для ОЗУ 8 ^) – florin

+0

florin: Используйте распределенные вычисления! =) – Vovanium

+0

Я нашел эту загадку очень интересной, и я потратил некоторое свободное время, чтобы составить эскиз алгоритма «по строкам» с поиском и побитовыми операциями, используя только 560 байт таблиц (для 8-битных шаблонов). Вот код: http://dl.dropbox.com/u/13343791/holecount2.c Извините, если код не задокументирован. – Vovanium