Алгоритм различения воды и земли

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

Прямо сейчас все черные области представлены как 0, а все серые области как 1. Таким образом, на картинке зеленые и синие точки представлены как одно и то же. Мне нужно, чтобы некоторые черные области (вода) были представлены как 2 вместо этого. Как это сделать? Лучшее, что я придумал до сих пор, — это рассчитать площадь каждого черного пятна и позволить только областям выше определенного порога быть водой. Я думаю, что есть лучшие способы, и мне интересно, что вы, ребята, думаете.

введите здесь описание изображения


person theDazzler    schedule 10.04.2012    source источник
comment
Шаг 1: установите все 0 и только 0 в качестве соседей для воды. Шаг 2: установите все 0 с любой водой в качестве соседа для воды.   -  person Joel Cornett    schedule 10.04.2012
comment
Вероятно, вы можете использовать этот алгоритм Flood_fill в качестве отправной точки.   -  person Bakudan    schedule 10.04.2012
comment
Джоэл, я подумал о первом шаге, о котором ты сказал, но не подумал о втором. Единственное, что в нем плохо, это то, что он также превращает небольшие участки в воду. (Зеленое пятно, которое я закрасил, или маленький квадрат 3x3 слева от него)   -  person theDazzler    schedule 10.04.2012
comment
Я собираюсь объединить оба предложенных вами алгоритма. Я отмечу 0, которые окружены 3 или более 0 в каждом направлении, а затем заливаю эту область.   -  person theDazzler    schedule 10.04.2012
comment
Вероятно, вам следует начать с установления более определенных условий для того, что считать землей и что считать водой. Говорить о малых областях очень и очень условно. Например, я не смог бы сказать, должна ли черная область к югу от самого западного края синей области быть землей или водой.   -  person Alderath    schedule 10.04.2012
comment
Высказывание областей, которые являются маленькими, закончилось тем, что работало. Проверьте ответ, который я разместил   -  person theDazzler    schedule 11.04.2012


Ответы (2)


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

Возможно также порог обеих этих мер.

person daveb    schedule 10.04.2012
comment
Я нашел решение, объединив предыдущие предложения, но я буду помнить об этом, так как это будет полезно позже для других вещей, которые я планирую делать. Спасибо - person theDazzler; 10.04.2012

Объединив первые два предложения, я смог прийти к решению. Сначала я ищу тайлы с водой, которые окружены произвольным количеством тайлов с водой (т.е. 4 в каждом направлении), а затем использую алгоритм заливки, чтобы сделать весь водоем фактически водой. Вот фото результата. Я также добавил береговую линию для красоты. Как видите, меньшие круглые тела по-прежнему являются землей, чего я и хотел. введите здесь описание изображения

person theDazzler    schedule 10.04.2012