Выполнение растрового шумоподавления и сглаживания краев?

22

У меня есть растровое изображение, как этоРастровое изображение

Я хочу удалить изолированную точку шума и сгладить края (скажем, белые отдельные точки, и я хочу, чтобы края объекта выглядели гладкими). Как я могу сделать это в ArcGIS или в R?

Размер ячейки 30 * 30.

Видели
источник

Ответы:

15

Для этого вида обработки были созданы морфологические операции Expand и Shrink . Используйте ArcGIS (или GRASS или Mathematica ), потому что R«растровая» библиотека слишком медленная.


Часто это помогает немного поэкспериментировать с параметрами: вы должны решить, насколько необходимо увеличить или уменьшить изображение для очистки изображения; и обычно вы хотите сделать как можно меньше, потому что каждая операция имеет тенденцию сглаживать некоторые резкие детали. Вот последовательность, которая хорошо работает, чтобы устранить большую часть видимого «шума», сохраняя при этом большую часть деталей в «объектах». «Расширить» и «сжать» оба относятся к белым клеткам, так что расширение заставляет их расти наружу, а сокращение заставляет черные клетки проникать в белые области.

Таблица изображений

В столбце «Разница» используется цвет, чтобы выделить различия между начальным и конечным изображением на каждом шаге: синий для черного, который превратился в белый, и оранжевый для белого, который стал черным.

Если необходимо удалить оставшиеся фрагменты большего размера, лучше всего это сделать с помощью RegionGroup, чтобы идентифицировать их, после чего их можно уничтожить путем реклассификации. Это был вариант в самом начале, но немного первоначальная очистка с помощью Expandи Shrinkуменьшает работу и обеспечивает желаемое сглаживание.


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

i = Import["http://i.stack.imgur.com/umDg7.png"];
l = Dilation[k = Erosion[j = Dilation[i, 2], 3], 1];      (* This does all the work *)
delta = ColorCombine /@ {{i, j}, {j, k}, {k, l}, {i, l}}; (* Compares images *)

Рабочий процесс в ArcGIS такой же, но синтаксис будет длиннее. Если вы действительно хотите использовать R, загрузите «растровую» библиотеку и воспользуйтесь ей, focalFilterчтобы создать функции для расширения и сжатия. Затем подождите около минуты каждый для выполнения операций ....

Whuber
источник
Здравствуйте! Если вы не возражаете, не могли бы вы прислать мне свою контактную информацию? Я хотел бы поблагодарить вас в моих исследованиях. Поблагодарить! @whuber
видел
Вы знаете эквивалентные команды в GRASS?
Ричард
1
@Richard Я уверен, что в GRASS есть много творческих способов сделать эти операции, но r.neighbors выглядит вполне подходящим для этой задачи.
whuber
12

Используя расширение Spatial Analyst, вы можете использовать некоторые из инструментов обобщения . Некоторые из них выполняют похожие задачи, поэтому вам, возможно, придется поиграться с несколькими, чтобы получить результаты, которые вы хотите получить. Но я бы взглянул на инструмент Majority Filter и инструмент Boundary Clean .

Вот страница о понятиях этих двух инструментов.

Я не уверен, как выполнить эти задачи в R, но вот пост о том, как выполнить фильтр большинства с использованием GRASS GIS.

Фезтер
источник
2

Это в основном вариант ответа @ whuber и использует Евклидово расстояние, чтобы расширить и уменьшить границы растра, чтобы сгладить острые углы растра, что усиливается процессом расширения-сжатия, который использует количество ячеек для роста / вторжения. Хотя евклидово расстояние имитирует расширение, невозможно ввести отрицательное значение для посягательства / сжатия. Хитрость заключается в том, чтобы разработать итерационный процесс, чтобы взять отрицательный растр Евклидова расстояния и увеличить его. Ниже приведены шаги для данного образца изображения и снимки для пояснения.

  1. Переклассифицировать растр, чтобы сохранить только 1 с (белые ячейки)

  2. Применить евклидово расстояние для расстояния в две ячейки (в данном случае 60 метров) к реклассифицированному растру

  3. Возьмите отрицание расширенного растра с помощью Reclassify (ячейки со значением получат NODATA, а NODATA - 1) или операторы Con и IsNull Raster Calculator.

  4. Примените евклидово расстояние еще раз к этому отрицательному растру с тем же расстоянием (60 м)

  5. Возьмите отрицание этого, следуя тому же процессу, указанному выше

  6. Используйте Калькулятор растра или Переклассифицировать, чтобы присвоить ячейкам NODATA значение 0 в этом растре, чтобы вернуться к исходным значениям образца растра.

Развернуть Сжатие против Евклидова расстояния

Расширить и сжатьЕвклидово расстояние

Примечание: зеленый цвет показывает обработанные ячейки (белые ячейки в вопросах)

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

Основная проблема, тем не менее, это не удаляет шум так успешно, как расширение / сжатие, и это немного дольше, чем ответ.

fatih_dur
источник
Для всех, кто делает это и использует GRASS / QGIS - вы можете использовать r.grow и расти на положительном евклидовом расстоянии, за которым следует отрицательное евклидово расстояние
srha