Страница 1 из 1

Определение границ растрового изображения

Добавлено: 18 июл 2011, 15:43
Dorofeev
Помогите решить задачу массовой обрезки растров. Нужно в пакетном режиме определить границы занятые "значимыми" пикселями в растровоом изображении и сохранить их в shapefile. Причем чтобы в качестве Nodata, можно было задавать диапазон значений.
Какой софт можно применить?

Re: Определение границ растрового изображения

Добавлено: 18 июл 2011, 16:11
Григорий Степанов
Можно увидеть пример растра с нанесёнными векторными контурами?

Re: Определение границ растрового изображения

Добавлено: 18 июл 2011, 16:27
Dorofeev
Ну как-то так

Re: Определение границ растрового изображения

Добавлено: 18 июл 2011, 16:52
Григорий Степанов
То есть в примере черный и белый цвета относятся к незначимым (NODATA) пикселам? И это действительно чистые цвета или как в примере диапазоны оттенков близких к белому и чёрному цветам?

Re: Определение границ растрового изображения

Добавлено: 19 июл 2011, 08:56
Dorofeev
Да, черное и белое - это разные NoData, цвета могут быть не чистые, возможны небольшие отклонения, особенно в JPG

Re: Определение границ растрового изображения

Добавлено: 19 июл 2011, 10:04
Григорий Степанов
Собственно, основная проблема, как раз и лежит в "не чистоте" цветов в областях NoData. Судя по всему, эти области изначально состояли из чистых цветов, однако, алгоритмы сжатия с потерями, используемые в JPEG породили целый спектр оттенков цвета на границах чёрных и белых областей. Причём, многие из этих оттенков присутствуют и в самом информативном изображении.

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

Я не специалист в обработке снимков, но первое что приходит в голову это:

1. выделение полигональных областей подбором порогов яркостей сверху и снизу;
2. оконтуривание выделенных областей;
3. отсев полученных полигонов по критерию площади;
4. линеаризация контуров (так как изначально, все отрезки границ это прямые линии).

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

P.S. Как всегда, экономия на объёмах растровых файлов (JPEG!!!), неизбежно выливается в значительные потери времени при их обработке...

Re: Определение границ растрового изображения

Добавлено: 20 июл 2011, 13:51
Александр Мурый
Поигрался с картинкой в GRASS (импорт *jpg--> композит RGB (8 уровней) --> задаем NULL по выбранным значениям растра --> разделяем растр на 2 категории (NULL и не-NULL) --> вытаскиваем границы не-NULL растра в вектор --> удаляем автоматом весь мусор, оставляем единственную нужную границу.
Дальше можно вынуть в SHP.

Результат: (слева -- не-NULL растр, справа -- вект. полигон)
map_bounds.png
map_bounds.png (131.52 КБ) 8533 просмотра
Позже распишу модули / команды, если интересно. Просьба выложить какой-нибудь "рабочий" растр с привязкой (или хотя бы кусок).

P.S. Да, по идее, все это можно делать автоматом (надо писать спец. скрипт). Но только в случае, если у растров надо "занулить" одни и те же значения.

Re: Определение границ растрового изображения

Добавлено: 20 июл 2011, 15:08
Григорий Степанов
1) Отсечение по яркости. Инструмент Выделение тематических слоёв
Изображение
2) Преобразование к ч.б. Инструмент Бинаризация
Изображение
3) Оконтуривание Утилита Автоматическое оконтуривание
(если указать "Сохранять контура = Только внешние", то можно не указывать размеры минимальных контуров)
Изображение
4) Оптмизация контура Утилита Оптимизация формы линий
Изображение

Время - 1 мин 40 сек

P.S. Но руками построить контур ещё быстрее...

Re: Определение границ растрового изображения

Добавлено: 20 июл 2011, 15:30
Александр Мурый
ET, как всегда, хорош, но не "скриптабелен" (понимаю, что такова специфика...)
Вообще первая мысль у меня была насчет ImageMagick ("обрезание" ненужных пикселей) + GDAL (векторизация в gdal_polygonize), но как-то не вышло.