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

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?

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

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

Hugolpz
источник
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 и моим входом.
Hugolpz
источник
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.

Hugolpz
источник