果壳
应该阅读下面每组3张图像,例如“灰色(带)+不透明度(带)=透明结果”。您可以通过关联的github托管的makefile在几分钟之内测试这些过程。我建议使用进程#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
我们要定义和控制第二个不透明度带!
目标
我们想要一个灰度带 -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)进行优化
添加-b 1
不透明度时,肉眼无法看到(灰度)像素的2/3 -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通过255*(A>220)
或黑色px = 1通过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平滑DEM吗?
复合山体阴影(如何创建复合山体阴影)。
撞山丘也很有趣(描述)
笔记
- 的平坦区域的阈值在
gdal hillshade
输出为PX = 221(#DDDDDD = [221221221]),标记的平坦区域。而且,山影的px = 221将图像划分为阴影内斜率(A <221)和光照中斜率(A> 221)像素。
- 一个处理的阈值,在PX = [170-220]为行之有效的好,它使眼睛附近,明显的阴影,这本身勉强站为救援面积的15-35%的100%。
- 文件大小>压缩:#1,#2,#3中的final.tif未经压缩约为〜1.3MB,压缩后约为0.3-0.16MB,节省了80%!
- 文件大小>裁剪:从#1的.326KB开始,裁剪颜色和不透明度(#2)达到310kb,变黑的颜色(#3)达到160kb。对文件大小的裁剪效果减少了5〜50%,阈值位于px = 220和我的输入。