Створення прозорого гірки?


34

Я отримую вишукані прозорі сходи через комбінацію gdalта convert. У порівнянні із звичним для сірого схилу схилом такі прозорі гірки є дуже крутими, оскільки їх можна розмістити між фоном карти та іншими верхніми шарами (дорогами, забудованими), щоб забезпечити 3D-відчуття незалежно від типу та кольору фону.

Як це працює

Трюк: Починаючи із схилу сірого масштабу, що виробляється 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 або іншим не GIS-руйнівним способом для таких файлів .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 разом witht формулою opacity=-(px_grey_value)+255може бути шлях, але я ніколи не торкався смуг, і я все ще досить незрозумілий.
Гюгольпз

додано сірий
схил

ви спробували gdal_edit.py переписати координату, розмір комірки та систему відліку?
radouxju

Відповіді:


42

Горіхова шкаралупа

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

Відомості про такий підхід, пояснене дизайнером Photoshop, див. У розділі Додавання затіненої рельєфу у Photoshop (16 хв.).

Фон

gdaldem hillshadeстворює односмуговий файл сірого масштабу з діапазоном значень пікселів = [1-255], також від найтемніших тіней до найбільш просвітленого пікселя. Для рівних ділянок px = 221 (#DDDDDD). 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, непрозорість.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% прозорою, найтемніші тіні та найсвітліші просвітливі ділянки непрозорі.

Згладжування: вхідний схил може бути попередньо розгладжений, щоб отримати кращий кінцевий результат, див. Згладжування DEM за допомогою GRASS?

Композитний схил ( Як створити композитний схил? ).

Цікавий також схил схилу гори ( опис )

Примітки

  • Поріг плоский ділянку в gdal hillshadeвиході ПВ = 221 (#DDDDDD = [221221221]), маркування плоских ділянок. Також px = 221 гірського схилу ділить зображення між нахилами в тіні (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 привітання.
Гюгольпз

2
Підручник закінчено. Моя англійська може бути зламана, не соромтеся вдосконалюватися.
Гюгольпз

3
Хоча вам доводилося відповідати самій собі, ця тема є чудовим підручником, що стосується багатьох питань, пов'язаних із завивкою. Молодці!
Керстен

Ваш підручник - це лише робота. Чудова робота. Чи можете ви, будь ласка, розглянути відповідь на моє запитання => тут ? Чи можливо створити .ovr для такого типу GeoTIFF, масштаб сірого з альфа-діапазоном?
пісочниця

1
Привіт @sandthorn, незважаючи на свою любов до цього, я вже не в цій галузі. Вартість пошуку відповіді, ймовірно, для мене-2018 буде вищою, ніж для вас-2018. Сподіваюся, мої речі вказують на правильний напрямок для вашої проблеми!
Гюгольпз

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.