Importing image in Grass

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Importing image in Grass

Сообщение Александр Мурый » 11 ноя 2011, 14:44

Граф. интерфейс и терминал могут работать параллельно, модули в "граф. виде" можно запускать как из меню, так и из терминала простым набором имени модуля. Граф. интерфейс можно запускать из терминала командой "g.gui имя_графич_интерфейса", например, "g.gui tcltk" или "g.gui wxpython".

Интерфейс wxGUI исп-ть я пока не рекомендовал бы (он на ранней стадии разработки, очень сырой), лучше уж Tcl/Tk, а идеально --- старые-добрые "графические мониторы" (d.mon).
Редактор материалов, модератор форума

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Importing image in Grass

Сообщение Александр Мурый » 12 ноя 2011, 14:25

Ripsime, полезно почитать главу пособия "Работа с растровыми данными", там описаны все типичные действия с растрами в терминале. Есть несколько специальных учебных наборов данных: Spearfish, NC (данные по Сев.Каролине)
Редактор материалов, модератор форума

Ripsime
Интересующийся
Сообщения: 27
Зарегистрирован: 03 ноя 2011, 04:51
Репутация: 0

Re: Importing image in Grass

Сообщение Ripsime » 12 ноя 2011, 22:57

Добрый вечер !!!
Я всё сделала как вы сказали и у меня всё получилось... :D за что вам очень благодарна !!! теперь как мне сделать какое нибудь действие с этой картиной??? самое примитивное... :roll:

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Importing image in Grass

Сообщение Александр Мурый » 13 ноя 2011, 10:26

Для примера будет использоваться это изображение (без географической привязки, размер 2048x2048).

Часто после импорта растра (например, JPG) в наборе получаются растры типа raster.red, raster.green, raster.blue. Для отображения на экране полноцветного растра в RGB можно исп-ть модуль d.rgb, либо сделать композитный растр с помощью r.composite и иметь дело уже с ним.

Код: Выделить всё

GRASS 6.4.2svn (globe_east):~ > g.list rast
----------------------------------------------
raster files available in mapset <PERMANENT>:
globe_east.blue     globe_east.green    globe_east.red
Для вывода на экран RGB-растра пишем (вначале запускаем графический терминал):

Код: Выделить всё

d.mon x0
d.rgb r=globe_east.red g=globe_east.green b=globe_east.blue
Сделаем RGB-растр:

Код: Выделить всё

r.composite r=globe_east.red g=globe_east.green b=globe_east.blue out=globe_east.rgb
Разную информацию о растре можно посмотреть с пом. модуля r.info:

Код: Выделить всё

GRASS 6.4.2svn (globe_east):~ > r.info globe_east.rgb
 +----------------------------------------------------------------------------+
 | Layer:    globe_east.rgb                 Date: Sun Nov 13 09:25:56 2011    |
 | Mapset:   PERMANENT                      Login of Creator: user            |
 | Location: globe_east                                                       |
 | DataBase: /home/user/Work/grassdata                                        |
 | Title:     ( globe_east.rgb )                                              |
 | Timestamp: none                                                            |
 |----------------------------------------------------------------------------|
 |                                                                            |
 |   Type of Map:  raster               Number of Categories: 32767           |
 |   Data Type:    CELL                                                       |
 |   Rows:         2048                                                       |
 |   Columns:      2048                                                       |
 |   Total Cells:  4194304                                                    |
 |        Projection: x,y                                                     |
 |            N:       2048    S:          0   Res:     1                     |
 |            E:       2048    W:          0   Res:     1                     |
 |   Range of data:    min = 0  max = 32767                                   |
 |                                                                            |
 |   Data Description:                                                        |
 |    generated by r.composite                                                |
 |                                                                            |
 |   Comments:                                                                |
 |    r.composite red="globe_east.red" green="globe_east.green" blue="glob\   |
 |    e_east.blue" levels=32 output="globe_east.rgb"                          |
 |                                                                            |
 +----------------------------------------------------------------------------+
Очистим экран и выведем теперь RGB-растр:

Код: Выделить всё

d.erase
d.rast globe_east.rgb
globe_east_rgb.png
globe_east_rgb.png (165.4 КБ) 10419 просмотров
Посмотрим значения растра "методом тыка" --- d.what.rast

Код: Выделить всё

d.what.rast
Чёрный космос вокруг Земли на картинке имеет значение "0" :)
Чтобы вывести на экран одну Землю, укажем, какие именно значения растра надо показать.
Сначала посмотрим, как распределяются значения (r.describe):

Код: Выделить всё

GRASS 6.4.2svn (globe_east):~ > r.describe -r globe_east.rgb --q
0
32 thru 32767
Видно, что после "0" идёт группа значений 32-32767, которая, видимо, нам и нужна.

Очистим экран и выведем RGB-растр с выбором значений от 32 до 32767:

Код: Выделить всё

d.erase
d.rast globe_east.rgb catlist=32-32767
globe_east_rgb_2.png
globe_east_rgb_2.png (166.56 КБ) 10419 просмотров
Можно также указать значение "0" как NULL, т.е. "нет данных" с помощью модуля r.null:

Код: Выделить всё

r.null globe_east.rgb setnull=0

Теперь чёрное окружение не будет выводиться даже при простом отображении растра (d.rast globe_east.rgb)

Далее оцифруем векторный полигон и сделаем по нему растровую маску (маска используется для того, чтобы все действия с растром производились только в её пределах):
-- Создадим произвольный векторный полигон (v.digit):

Код: Выделить всё

v.digit -n mask bgcmd="d.rast globe_east.rgb"
globe_east_vector_mask.png
globe_east_vector_mask.png (292.08 КБ) 10419 просмотров
Появится 2 окошка для оцифровки, нарисуем какую-либо границу, в центре неё поставим центроид, в конце нажмём "Save and exit" в правом верхнем углу окна оцифровщика.

*** Продолжение в след. сообщении ***
Последний раз редактировалось Александр Мурый 13 ноя 2011, 20:19, всего редактировалось 6 раз.
Редактор материалов, модератор форума

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Importing image in Grass

Сообщение Александр Мурый » 13 ноя 2011, 11:36

*** Продолжение ***

-- Выведем созданный полигон <mask> на экран:

Код: Выделить всё

d.vect mask
-- Растеризуем наш векторный полигон (сделаем растр с единственным значением) с помощью v.to.rast:

Код: Выделить всё

v.to.rast in=mask out=mask use=cat
-- Выведем на экран растр <mask> (с <d.rast> исп-ся флаг "-o", чтобы наложить один растр на тот, который уже показан на экране):

Код: Выделить всё

d.rast -o mask
Получается примерно так:
globe_east_mask_view.png
globe_east_mask_view.png (138.96 КБ) 10483 просмотра
-- Укажем растр <mask> в качестве растровой маски (r.mask:

Код: Выделить всё

GRASS 6.4.2svn (globe_east):~/Work/grassdata/globe_east > r.mask in=mask
[Raster MASK present]
Как видно, в приглашении командной строки появилась строка [Raster MASK present].
-- Теперь очистим экран и попробуем снова вывести на экран растр <globe_east.rgb>. Увидим, что растр как бы "обрезан" по оцифрованной нами границе:
globe_east_mask_view_cut.png
globe_east_mask_view_cut.png (63.94 КБ) 10483 просмотра
-- Чтобы увеличить до "обрезанного" участка, нужно задать текущий регион по этому же растру (globe_east.rgb), но с учётом маски и только ненулевых значений (в общем, увеличить до отображаемых сейчас данных) [модуль g.region, опция "zoom"]:

Код: Выделить всё

g.region rast=globe_east.rgb zoom=globe_east.rgb -p
-- Обновим экран (d.redraw) и увидим ... кусок Индийского океана :)
globe_east_mask_view_cut_zoom.png
globe_east_mask_view_cut_zoom.png (223.59 КБ) 10483 просмотра
Как вариант, можно увеличить до нужного участка "мышкой" --- модуль d.zoom с флагом "-f" позволит перемещаться по экрану и интерактивно изменять текущий регион.

Код: Выделить всё

d.zoom -f
Модуль выводит подсказку по использованию.

*** Продолжение в след. сообщении ***
Последний раз редактировалось Александр Мурый 13 ноя 2011, 20:27, всего редактировалось 1 раз.
Редактор материалов, модератор форума

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Importing image in Grass

Сообщение Александр Мурый » 13 ноя 2011, 12:28

*** Продолжение ***

-- Чтобы из растра <globe_east.rgb> создать новый, обрезанный по границе, применим растровую алгебру -- модуль r.mapcalc:

Код: Выделить всё

r.mapcalc "globe_east_cut = globe_east.rgb"
При необходимости можно изменить цвета растра ("цветовую карту"), например, на градацию серого. Для этого:
-- Создадим текстовый файл "rules.txt" и впишем туда:

Код: Выделить всё

0 black
32767 white

-- Теперь изменим цвета растра с помощью модуля r.colors:

Код: Выделить всё

r.colors map=globe_east.rgb color=rules rules=rules.txt
В результате изображение выглядит так:
globe_east_mask_view_cut_zoom_grey.png
globe_east_mask_view_cut_zoom_grey.png (137.78 КБ) 10477 просмотров
Можно реклассифицировать значения растра, например, <globe_east_cut> со значений <167,32767> на значения <0,255>

Код: Выделить всё

r.rescale input=globe_east_cut from=167,32767 output=globe_east_cut.255 to=0,255
Получаем такую картину:
globe_east_mask_view_cut_zoom_reclass.png
globe_east_mask_view_cut_zoom_reclass.png (155.62 КБ) 10477 просмотров
Ну и последнее упражнение: сделаем на базе исходного изображения векторный контур Земли.
-- Удалим растровую маску:

Код: Выделить всё

r.mask -r
-- Зададим текущий регион по растру <globe_east.rgb>:

Код: Выделить всё

g.region rast=globe_east.rgb -p

-- Создадим растр со одним значением (пусть будет "1") на основе растра <globe_east.rgb> при его значениях "больше или равно 32", значения меньше 32 отнесём к NULL.

Код: Выделить всё

r.mapcalc "globe_mask = if(globe_east.rgb >= 32,1,null())"
-- Векторизуем полученный растр <globe_mask>:

Код: Выделить всё

r.to.vect -s in=globe_mask out=globe_mask feature=area
-- Выводим на экран вектор <globe_mask>

Код: Выделить всё

d.vect globe_mask type=boundary col=yellow width=3
Получается следующее (слева -- растр <globe_mask>, справа -- исходное изображение с жёлтым векторным контуром Земли):
globe_mask_vect.png
globe_mask_vect.png (92.24 КБ) 10477 просмотров
Если есть вопросы/предложения и т.п. --- пожалуйста :)
Редактор материалов, модератор форума

Ripsime
Интересующийся
Сообщения: 27
Зарегистрирован: 03 ноя 2011, 04:51
Репутация: 0

Re: Importing image in Grass

Сообщение Ripsime » 13 ноя 2011, 15:33

Спосибо ВАМ ОГРОМНОЕ !!!!
Пока всё не успела посмотреть... думаю вопросы обязательно возникнут... :shock:
теперь вопрос такой : сейчас когда включаю grass показывает вот это
Cleaning up temporary files ...
Starting GRASS ...

и не чего не могу делать, командной строки нет, что делать? :(

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Importing image in Grass

Сообщение Александр Мурый » 13 ноя 2011, 16:43

Ripsime, как включаете / выключаете GRASS? Через граф. интерфейс или терминал?

Надёжнее запускать через командную строку. Я почти всегда запускаю так:

Код: Выделить всё

LANG=en_US.UTF-8 grass642 -text ~/Work/grassdata/globe_east/PERMANENT/
, где:
LANG=en_US.UTF-8 --- прямое указание языка и локали;
grass642 -text --- запуск в текстовом режиме;
~/Work/grassdata/globe_east/PERMANENT/ --- полный(!) путь к каталогу данных / области / набору
Перед запуском постарайтесь выключить до этого все действующие процессы GRASS (дело в том, что грасс можно запускать сколько угодно раз, если НЕ в одном наборе, так что вполне реально запутаться).

На крайний случай сделайте скриншот с окном терминала и выложите здесь, а также напишите все ошибки.
Редактор материалов, модератор форума

Ripsime
Интересующийся
Сообщения: 27
Зарегистрирован: 03 ноя 2011, 04:51
Репутация: 0

Re: Importing image in Grass

Сообщение Ripsime » 25 ноя 2011, 12:18

Добрый день !!!

1. импортировала с помощью команды in.gdal изображение типа .tif , но как было в примере выше :

GRASS 6.4.2svn (globe_east):~ > g.list rast
----------------------------------------------
raster files available in mapset <PERMANENT>:
globe_east.blue globe_east.green globe_east.red

blue, green, red не было,a только: raster files available in mapset <PERMANENT>:
так и далжно быть? или может это потому, что всего один спектр мультиспектрального изображения???


2. Можно ли растрное изображение разделить на части (например на 2) и с каждым из них работать отдельно? (для вектрных, кажется это команда v.split , а для растрных не могу найти??) :roll:

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Importing image in Grass

Сообщение Александр Мурый » 25 ноя 2011, 20:48

1. Вы правы, так может быть, если спектр один (в моём примере было три канала JPG-картинки: R/G/B)
Так у вас импортировался один растр или вообще ничего?
2. Вам хочется сделать новые растры из этих кусков? Или достаточно просто, чтобы все действия производились в пределах части изображения?
Если второе, надо просто задать текущий регион по границам нужного куска (g.region или вручную выделить "мышкой" d.zoom), можно также сохранить регион для быстрого доступа (g.region -s). ВСЕ растровые операции будут происходить только в пределах заданного текущего региона.
Если первое, после задания региона надо сделать:

Код: Выделить всё

r.mapcalc "raster_cut = raster" 
, где raster_cut -- вырезанный кусок, raster -- исходный растр.
Редактор материалов, модератор форума

Ripsime
Интересующийся
Сообщения: 27
Зарегистрирован: 03 ноя 2011, 04:51
Репутация: 0

Re: Importing image in Grass

Сообщение Ripsime » 28 ноя 2011, 10:31

1. Да я получила это: http://www.freeimagehosting.net/a0f41
2. Моя задача разделить рисунок на части, и сделать какое- нибудь действие со всеми честями (может классификацию, если возможно ). Потом,то же самое действие сделать с целым рисунком, и посмотреть разницу (если она есть). :roll:
Я не знаю, можно ли это вообще сделать, или нужно васпользоваться GRID-ом!!! :shock:

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Importing image in Grass

Сообщение Александр Мурый » 28 ноя 2011, 14:15

Ripsime писал(а):2. Моя задача разделить рисунок на части
Попробуйте сделать, как показано здесь
Ripsime писал(а):Я не знаю, можно ли это вообще сделать, или нужно васпользоваться GRID-ом!!! :shock:
Что вы имеете в виду под "воспользоваться GRID-ом"? Построить регулярную сетку, а затем вырезать по ней части растра?
По идее, надо написать небольшой shell-скрипт, типа того, какой написан здесь в конце страницы.

P.S. к себе, скорее: надо бы накатать небольшой аддон-скрипт для этой задачи, пригодится.
Редактор материалов, модератор форума

Ответить

Вернуться в «GRASS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 14 гостей