Создание прозрачной горки?


34

Я получаю элегантные прозрачные горки с помощью комбинации gdalи convert. По сравнению с обычно используемыми оттенками серого, такие прозрачные оттенки очень крутые, потому что их можно разместить между фоном карты и другими верхними слоями (дороги, здание), чтобы обеспечить трехмерное ощущение независимо от типа и цвета фона.

Как это работает

Уловка. Начиная с оттенка серого, полученного с gdal hillshadeпомощью трюка, уловка состоит в том, чтобы взять значения серого канала, инвертировать каждое значение и передать этот результат в новый канал непрозрачности. Черный пиксель [0,0,0] становится [0,0,0,255] (непрозрачность = 255), серый пиксель [120,120,120] становится меньше, становясь [120,120,120,135] (непрозрачность = 135, он же 255-120), белый пиксель [255,255,255] стать прозрачным [255,255,255,0] (непрозрачность = 0, он же 255-255) и так далее. Оттенки холмов непрозрачные и черные , равнины постепенно становятся (белыми) прозрачными . Концептуально, уравнение полосы пикселя является чем-то таким:

alpha_value([0])    = 255-0 = 255;   // black pixels get full opacity
alpha_value([Grey]) = 255-Grey;
// grey pixels get 255-GreyValue opacity.
alpha_value([255])  = 255-255 = 0  // white pixels get null opacity !

Для непринужденного видео об этом подходе, объясненного дизайнером Photoshop, см. Добавление затененного рельефа в Photoshop (16 минут).

Вопрос

Принимая ETOPO или SRTM , полученный на основе серой отмывки ( gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges, файл доступны для скачивания здесь ) в качестве входных данных ...

... Как сделать трюк, процитированный выше, через gdal или другим не ГИС-разрушительным способом для таких файлов .tif?

Обратите внимание, что я хочу сохранить свойства ГИС (геолокализация).

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


1
В зависимости от того, как ссылочные данные хранятся в формате TIFF, это может быть так же просто, как переименование файла мира, связанного с TIFF.
— Стив

@Steve: это для файлов .tif, сгенерированных из растра, такого как SRTM или ETOPO послеgdaldem hillshade etopo_crop.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
— Hugolpz

Я думаю, что gdal_tranlateс комбинацией -b band , -mask band , -expand grey | rgb | rgba вместе с формулой opacity=-(px_grey_value)+255может быть путь, но я никогда не трогал группы, и я все еще совершенно невежественен.
— Hugolpz


Вы пытались gdal_edit.py переписать координаты, размер ячейки и систему отсчета?
— radouxju

Ответы:


42

ореховая скорлупа

Каждый набор из 3 изображений ниже должен читаться как «серый (полоса) + непрозрачность (полоса) = прозрачный результат» . Вы можете протестировать эти процессы в течение нескольких минут через соответствующий make-файл, размещенный на github . Я рекомендую процесс № 3 с порогом от 170 (сохраняет сильные тени) до 220 (сохраняет все тени). Процесс 3 обеспечивает самые сильные тени и позволяет избежать эффекта седения. При необходимости измените общую непрозрачность полученного слоя. Уравнения в --calc="<equation>"могут быть улучшены по мере необходимости, используя gdal_calc.

Для непринужденного видео об этом подходе, объясненного дизайнером Photoshop, см. Добавление затененного рельефа в Photoshop (16 минут).

Задний план

gdaldem hillshadeсоздает однополосный файл в градациях серого с диапазоном значений пикселей = [1-255], то есть от самых темных теней до самых просвечивающих пикселей. Для плоских областей px = 221 (#DDDDDD). NoDataValueпиксели по умолчанию получают nodatavalue 0, также самый темный черный цвет на входе и на выходе есть и должен быть 1. Если полоса непрозрачности не определена, непрозрачность равна 100% .

gdaldem hillshade input.tif hillshade.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges

hillshade.tmp.tif

Мы хотим определить и контролировать 2-ую полосу непрозрачности!

Цели

Мы хотим одну полосу серого -b 1 , это горка. Вне gdal это серая полоса с непрерывным диапазоном, такая как px = [1-255]. Мы можем обрезать нерелевантные области (# 2) или почернить его до px = 1 и положиться на полосу непрозрачности (# 3).

Мы хотим одну полосу непрозрачности -b 2 , обычно инвертирование тени или связанная с этим функция. Мы можем вырезать не относящиеся к делу области (# 2). Это должен быть непрерывный диапазон непрозрачности, такой как px = [1-255], иначе элегантность отсутствует.

gdal_calc можно использовать как для вычисления по пикселям из входных файлов A, B, C ..., так и для проверки логических значений, таких как A<220 , который возвращает 1 (true) или 0 (false). Это позволяет условное исчисление. Если условие ложно, соответствующая часть уравнения обнуляется.

1. Серая горка сделана прозрачной

Ниже приведены очень хорошие двухполосные результаты со стандартными gdal hillshadeсерыми и белыми областями, которые становятся все более прозрачными:

# hillshade px=A, opacity is its invert: px=255-A
gdal_calc.py -A ./hillshade.tmp.tif  --outfile=./opacity.tif --calc="255-A"
# assigns to relevant bands -b 1 and -b 2
gdalbuildvrt -separate ./final.vrt ./hillshade.tmp.tif ./opacity.tif

hillshade.tmp.tif # 1, opacity.tif # 1, final.tif

2. Оптимизация с помощью псевдообрезки (-b 1 и -b 2)

2/3 пикселей -b 1(с оттенками серого) становятся невидимыми для невооруженных глаз при -b 2добавлении непрозрачности , однако эти пиксели сохраняют различные значения белизны -b 1и низкой непрозрачности -b 2. Из них можно сделать все белые прозрачные [255,1]пиксели, обеспечивающие лучшую степень сжатия:

# filter the color band, keep greyness of relevant shadows below limit
gdal_calc.py -A ./hillshade.tmp.tif  --outfile=./color_crop.tmp.tif \
    --calc="255*(A>220) +      A*(A<=220)"
# filter the opacity band, keep opacity of relevant shadows below limit
gdal_calc.py -A ./hillshade.tmp.tif  --outfile=./opacity_crop.tmp.tif \
    --calc="  1*(A>220) +(256-A)*(A<=220)"
# gdalbuildvrt -separate ./final.vrt ./color_crop.tmp.tif ./opacity_crop.tmp.tif
# gdal_translate -co COMPRESS=LZW -co ALPHA=YES ./final.vrt ./final_crop.tif

# 2, color.tif (обрезано) # 2, opacity.tif (обрезано) # 2, final_crop.tif

3. Далее оптимизация -b 1 (обрезка + чернение)

Поскольку у нас есть прогрессивная полоса непрозрачности, -b 2на которую можно положиться, мы можем сделать -b 1пиксели либо белыми px = 255 via 255*(A>220), либо черными px = 1 via 1*(A>220).

gdal_calc.py -A ./hillshade.tmp.tif  --outfile=./color.tmp.tif \
   --calc="255*(A>220) + 1*(A<=220)"
# gdal_calc.py -A ./hillshade.tmp.tif  --outfile=./opacity_crop.tmp.tif \
#  --calc="  1*(A>220) +(256-A)*(A<=220)".
# gdalbuildvrt -separate ./final.vrt ./color.tmp.tif ./opacity_crop.tif
# gdal_translate -co COMPRESS=LZW -co ALPHA=YES ./final.vrt ./final.tif

# 3, color.tif # 2, opacity.tif (обрезано) # 3, final.tif

Этот результат показывает более сильные тени .

Результат

Создание прозрачной горки имеет целью для немедленной цели удалить бывшие серые области равнины и связанный с ней нежелательный, но вездесущий эффект выцветания серого . Желаемый побочный продукт - это усиленный контроль над конечным визуальным продуктом. Описанный процесс удаляет большинство серых и все белые пиксели. Цветное фоновое простое изображение сохранит выбранные цвета при наложении прозрачных на черные склоны, только затемненные области будут затемнены. Сравнение процесса № 2 (слева) и № 3 (справа) ниже.

Обзор:

Сравнение процесса № 2 (слева) и № 3 (справа), общий вид.

Увеличьте, пожалуйста, обратите внимание на тени (до и после):

Сравнение процессов № 2 (слева) и № 3 (справа), подробное представление.

Дальнейшая оптимизация

Белые области : Можно также пожелать сохранить наиболее просвещенные области для увеличения ощущений в 3D. Это было бы буквально симметрично этому текущему подходу с небольшими изменениями пороговых значений, а затем объединением обоих выходов через gdal_calc. Равнина будет на 100% прозрачной, а самые темные тени и самые светлые области будут непрозрачными.

Сглаживание: входной склон может быть предварительно сглажен, чтобы получить лучший конечный результат, см. Сглаживание матрицы высот с использованием GRASS?

Композитная горка ( Как создать композитную горку? ).

Ударенная горка тоже интересна ( описание )

Заметки

  • Порог плоский участок в gdal hillshadeвыходе ПВ = 221 (#DDDDDD = [221221221]), маркировки плоских участков. Кроме того, px = 221 от Hillshade делит изображения между пикселями с наклонами в тени (A <221) и склонами в условиях освещения (A> 221).
  • Порог обработки при рхе = [170-220] в качестве доказанной пользы, он держит около 100% глаза-заметной тени, которые сам по себе почти не стоят на 15-35% площади рельефа.
  • Размер файла> Сжатие: final.tif из # 1, # 2, # 3 составляет ~ 1,3 МБ без сжатия, затем ~ 0,3-0,16 МБ после сжатия, экономия 80%!
  • Размер файла> обрезка: начиная с .326 КБ в # 1, цвет обрезки и непрозрачность (# 2) достигают 310 КБ, затемнение цвета (# 3) - до 160 КБ. Эффект обрезки по размеру файла составляет от 5 до 50% с порогом при px = 220 и моим входом.

2
Поощрение +1 приветствуется.
— Hugolpz

2
Учебник закончен. Мой английский может быть сломан, не стесняйтесь улучшать.
— Hugolpz

3
Несмотря на то, что вы должны были ответить на этот вопрос, эта тема является отличным учебным пособием, затрагивающим множество вопросов, касающихся холмистой тени. Отлично сработано!
— Керстен

Ваш учебник просто работа. Отличная работа. Не могли бы вы рассмотреть ответ на мой вопрос => здесь ? Можно ли создать .ovr для этого вида GeoTIFF, градаций серого с альфа-полосой?
— песчаник

1
Здравствуйте @sandthorn, несмотря на мою любовь к нему, я больше не в этой области. Стоимость поиска ответа, вероятно, будет выше для меня-2018, чем для вас-2018. Надеюсь, мои материалы указывают правильное направление для вашей проблемы!
— Hugolpz

7

Еще один способ получить тот же результат для не серого холста, более подходящего для объединения с другими слоями, - это опция «комбинированный» в gdaldem.

Он выполняет наклон и тень холма и объединяет два в одной операции. Участки с наклоном 0 белые. Области с углом наклона 90 градусов являются черными для оттенка наклона, при этом слой горной тени добавляет некоторое освещение.

gdaldem hillshade -combined -compute_edges infile outfile.tif

Затем используйте режим наложения многослойных слоев, чтобы «наложить» это на другие слои.

Стандартное / Комбинированное затенение

Стандартный Хиллхейдинг

Комбинированное затенение, умноженное на базовый уровень OSM (непрозрачность около 50%) Комбинированное затенение, умноженное на базовый уровень OSM


2

gdal+ convertоснованный рабочий процесс

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

# Basic crop
gdal_translate -projwin 67 35.92 99 5 ../data/noaa/ETOPO1_Ice_g_geotiff.tif crop_xl.tmp.tif
# Grey-based hillshade
gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
# create a transparent hillshade:
convert shadedrelief.tmp.tif -fuzz 7% -fill "#FFFFFF" -opaque "#DDDDDD"  whited.jpg # makes all grey values white to lighten the filesize
convert whited.jpg -alpha copy -channel alpha -negate +channel trans.png # <=== TRICK HERE.
# Restore georeferencing & reproject            
gdal_translate -a_ullr 67 35.92 99 5 trans.png trans.tmp.gis.tif
gdalwarp -s_srs EPSG:4326 -t_srs ESPG:3857 ./trans.tmp.gis.tif ./trans_reproj.tmp.gis.tif
# Compress from 11MB to 2MB:
gdal_translate -co COMPRESS=LZW -co ALPHA=YES ./trans_reproj.tmp.gis.tif ./trans.gis.tif

Описание команды 4 см .: https://stackoverflow.com/a/23018544/1974961.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.