Страница 1 из 2
Обрезка Landsat
Добавлено: 03 авг 2012, 09:39
Nule
Здравствуйте!
Задача - пакетно обрезать снимки Landsat, с целью убрать артефакты с боков.
Т.е. надо наложить маску такого вида:

Причем маска должна быть "универсальной", т.е. не зависеть от координат обрабатываемой сцены.
Можно ли это реализовать в GRASS?
Спасибо!
Re: Обрезка Landsat
Добавлено: 03 авг 2012, 11:26
Александр Мурый
Может, и можно. Нужны примеры снимков с "артефактами" (устно не совсем понятно).
Re: Обрезка Landsat
Добавлено: 03 авг 2012, 11:32
Nule
amuriy писал(а):Может, и можно. Нужны примеры снимков с "артефактами" (устно не совсем понятно).
Примером может служить абсолютно любой снимок landsat.

Re: Обрезка Landsat
Добавлено: 03 авг 2012, 11:52
ericsson
Nule писал(а):Здравствуйте!
Причем маска должна быть "универсальной", т.е. не зависеть от координат обрабатываемой сцены.
А кто сказал, что маска может быть универсальной? Вот browse-файлы из архива GLCF, одного спутника и одного класса обработки. Похоже, но не совпадает:
ftp://ftp.glcf.umd.edu/glcf/Landsat/WRS ... browse.jpg
ftp://ftp.glcf.umd.edu/glcf/Landsat/WRS ... browse.jpg
ftp://ftp.glcf.umd.edu/glcf/Landsat/WRS ... browse.jpg
Я бы при решении задачи обрезки мусора сделал бы следующее:
Для каждой сцены извлек бы незначащие точки из каждого канала в композите (можно даже из уменьшенной в два или четыре раза копии), инвертировал, нашел бы пересечение получившихся масок значащих данных, инвертировал лезультат, (увеличил бы во столько раз во сколько уменьшал в начале), добавил бы некоторый threshold и по получившемуся - обрезал бы композит. GRASS не владею, но раз уж это можно сделать в ImageMagick (коим пользуюсь для обычной графики в т.ч. в подобных задачах), то и в GRASS, наверняка, можно.
Re: Обрезка Landsat
Добавлено: 03 авг 2012, 12:03
Nule
В ERDAS IMAGINE есть универсальная маска в инструментах Mosaic Pro (маску можно нарисовать вручную) и Mosaic Express (можно задать, сколько процентов срезать). Но это инструменты для создания мозаик и использовать их для обрезания отдельного снимка неудобно.
Я надеялся, что может есть аналогичные, но более гибкие инструменты в других пакетах.
Re: Обрезка Landsat
Добавлено: 03 авг 2012, 12:51
ericsson
Ну так а что может быть более гибким, чем пара-тройка булевых операций над растрами?
Re: Обрезка Landsat
Добавлено: 03 авг 2012, 14:03
Александр Мурый
ericsson писал(а):
Я бы при решении задачи обрезки мусора сделал бы следующее:
Для каждой сцены извлек бы незначащие точки из каждого канала в композите (можно даже из уменьшенной в два или четыре раза копии), инвертировал, нашел бы пересечение получившихся масок значащих данных, инвертировал лезультат, (увеличил бы во столько раз во сколько уменьшал в начале), добавил бы некоторый threshold и по получившемуся - обрезал бы композит.
Здорово было бы увидеть этот метод в действии с помощью IM. Хотя бы на примере приведённого выше увеличенного куска снимка. А самое интересное -- совмещение модулей GRASS + утилит IM.
Re: Обрезка Landsat
Добавлено: 03 авг 2012, 16:35
ericsson
Постараюсь сделать в ближайшие дни.
Re: Обрезка Landsat
Добавлено: 05 авг 2012, 15:30
ericsson
Ну собственно, как обещал...
Требуемые средства - listgeo, geotifcp (из Libgeotiff), convert (свежий ImageMagick).
1) Сделать дамп метаданных любого канала в отдельный текстовик через listgeo
2) Для каждого канала, который предполагается использовать в композите, выполняем команду такого вида:
Код: Выделить всё
convert L71169028_02820060620_B10.TIF -alpha set -channel RGBA -fuzz 5% -fill none -floodfill +0+0 black L71169028_02820060620_B10.withalpha.TIF
Параметр fuzz отвечает за то чтобы захватить не совсем черные края.
На выходе получаем тот же файл с убитыми метаданными (привязкой) но двухканальный - восьмибитный greyscale, плюс маска там, где был черный ±5%.
Примечание: если используются "дурные" данные с вырезанными полосами и прочим безобразием (которые с поврежденного спутника, если я не путаюсь в причине их возникновения), можно использовать другой код:
Код: Выделить всё
convert L71169028_02820060620_B10.TIF -transparent black L71169028_02820060620_B10.withalpha.TIF
Он пропишет прозрачность черным точкам не только по краям растра, но и изолированным незначащим точкам среди значащих.
3) Отделяем маску командой
Код: Выделить всё
convert.exe L71169028_02820060620_B10.withalpha.TIF -alpha extract L71169028_02820060620_B10.alpha.TIF
И получаем однобитные маски в виде отдельных файлов.
4) Попарно (1+2)+3 складываем маски командами типа
Код: Выделить всё
convert L71169028_02820060620_B10.alpha.TIF L71169028_02820060620_B20.alpha.TIF -compose Darken -composite L71169028_02820060620_B10_B20.alpha.TIF
convert L71169028_02820060620_B10_B20.alpha.TIF L71169028_02820060620_B30.alpha.TIF -compose Darken -composite L71169028_02820060620_B10_B20_B30.alpha.TIF
Наложение растров Darken эквивалентно логическому пересечению, если незначащие части - черные, значащие - белые.
5) Убиваем получившиеся файлы *_withalfa.TIF - они больше не нужны.
6) Через geotifcp вернуть файлу L71169028_02820060620_B10_B20_B30.alpha.TIF привязку из дампа, который был сделан на первом шаге. Далее эту маску можно использовать где угодно вместе с исходными растрами.
Re: Обрезка Landsat
Добавлено: 05 авг 2012, 16:05
Александр Мурый
Спасибо большое, ericsson. Будем пробовать

Re: Обрезка Landsat
Добавлено: 06 авг 2012, 08:31
Александр Мурый
Создание подобной маски для всех каналов собственно в GRASS (взято с
отсюда):
Код: Выделить всё
BASE=L71074092_09220040924
g.region rast=$BASE.1
r.series in=`g.mlist pat="$BASE.[0-8]*" sep=,` -n out=$BASE.thresh method=threshold thresh=1
r.mapcalc "$BASE.mask = if(isnull($BASE.thresh))"
g.remove $BASE.thresh
Проверено -- работает, причём довольно шустро.
На заметку: надо следить за именами растров (КО: они могут быть не как в примере).
P.S. А вот как вообще обрезать "бахрому" на автомате?
Re: Обрезка Landsat
Добавлено: 06 авг 2012, 08:42
ericsson
Ну еще можно вооружиться полигонами сетки path/row (где-то в недрах архива GLCF такие шейпы были), извлекать соответствующие номера из имен файлов или сопутствующих метаданных и обрезать по этим полигонам.
Re: Обрезка Landsat
Добавлено: 06 авг 2012, 09:06
Nule
Странно, казалось бы для такой массовой вещи как ландсат должна быть куча разнообразнейших тулзовин.
Что-нибудь типа: находим самый верхний пиксель, отличный от noData, потом нижний, правый и левый, по ним строим векторный прямоугольник, уменьшаем его на 10%, обрезаем по шейпу.
Re: Обрезка Landsat
Добавлено: 06 авг 2012, 09:24
rhot
amuriy писал(а):Создание подобной маски для всех каналов собственно в GRASS (взято с
отсюда):
Код: Выделить всё
BASE=L71074092_09220040924
g.region rast=$BASE.1
r.series in=`g.mlist pat="$BASE.[0-8]*" sep=,` -n out=$BASE.thresh method=threshold thresh=1
r.mapcalc "$BASE.mask = if(isnull($BASE.thresh))"
g.remove $BASE.thresh
Проверено -- работает, причём довольно шустро.
На заметку: надо следить за именами растров (КО: они могут быть не как в примере).
P.S. А вот как вообще обрезать "бахрому" на автомате?
Объясните, пожалуйста, что это за метод threshold?
Nule писал(а):Странно, казалось бы для такой массовой вещи как ландсат должна быть куча разнообразнейших тулзовин.
А зачем? Таких задач бывает так же много, как пользователей ландсат. ИМХО, программа не должна быть перегружена всякими примочками и тулзовинами. GRASS в этом смысле очень позитивно смотрится; исходники - чуть больше 20 Мб.
Хочешь, качай и устанавливай доп. модули, а хочешь, сам пиши на питоне - свобода

Re: Обрезка Landsat
Добавлено: 06 авг 2012, 11:25
Александр Мурый
rhot писал(а):
Объясните, пожалуйста, что это за метод threshold?
Честно говоря, для меня это тоже не до конца прояснилось. Кроме мануала, пояснения от автора модуля (Glynn Clements) есть, например,
здесь.