ореховая скорлупа
Каждый набор из 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
Мы хотим определить и контролировать 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
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
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
Этот результат показывает более сильные тени .
Результат
Создание прозрачной горки имеет целью для немедленной цели удалить бывшие серые области равнины и связанный с ней нежелательный, но вездесущий эффект выцветания серого . Желаемый побочный продукт - это усиленный контроль над конечным визуальным продуктом. Описанный процесс удаляет большинство серых и все белые пиксели. Цветное фоновое простое изображение сохранит выбранные цвета при наложении прозрачных на черные склоны, только затемненные области будут затемнены. Сравнение процесса № 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 и моим входом.