kopia lustrzana https://github.com/OpenDroneMap/WebODM
Merge pull request #1584 from pierotofy/hillcons
More consistent hillshading across zoom levelspull/1587/head
commit
743f3f4eb5
|
@ -71,12 +71,6 @@ class LightSource:
|
|||
A 2d array of illumination values between 0-1, where 0 is
|
||||
completely in shadow and 1 is completely illuminated.
|
||||
"""
|
||||
|
||||
# Because most image and raster GIS data has the first row in the array
|
||||
# as the "top" of the image, dy is implicitly negative. This is
|
||||
# consistent to what `imshow` assumes, as well.
|
||||
dy = -dy
|
||||
|
||||
# compute the normal vectors from the partial derivatives
|
||||
e_dy, e_dx = np.gradient(vert_exag * elevation, dy, dx)
|
||||
|
||||
|
@ -115,19 +109,19 @@ class LightSource:
|
|||
intensity = normals.dot(self.direction.astype(np.float32))
|
||||
|
||||
# Apply contrast stretch
|
||||
imin, imax = intensity.min(), intensity.max()
|
||||
# imin, imax = np.nanmin(intensity), np.nanmax(intensity)
|
||||
intensity *= fraction
|
||||
|
||||
# Rescale to 0-1, keeping range before contrast stretch
|
||||
# If constant slope, keep relative scaling (i.e. flat should be 0.5,
|
||||
# fully occluded 0, etc.)
|
||||
if (imax - imin) > 1e-6:
|
||||
# if (imax - imin) > 1e-6:
|
||||
# Strictly speaking, this is incorrect. Negative values should be
|
||||
# clipped to 0 because they're fully occluded. However, rescaling
|
||||
# in this manner is consistent with the previous implementation and
|
||||
# visually appears better than a "hard" clip.
|
||||
intensity -= imin
|
||||
intensity /= (imax - imin)
|
||||
# intensity -= imin
|
||||
# intensity /= (imax - imin)
|
||||
intensity = np.clip(intensity, 0, 1)
|
||||
|
||||
return intensity
|
|
@ -463,9 +463,9 @@ class Tiles(TaskNestedView):
|
|||
if tile.data.shape[0] != 1:
|
||||
raise exceptions.ValidationError(
|
||||
_("Cannot compute hillshade of non-elevation raster (multiple bands found)"))
|
||||
delta_scale = (maxzoom + ZOOM_EXTRA_LEVELS + 1 - z) * 4
|
||||
delta_scale = (maxzoom + ZOOM_EXTRA_LEVELS + 1 - z) ** 2
|
||||
dx = src.dataset.meta["transform"][0] * delta_scale
|
||||
dy = -src.dataset.meta["transform"][4] * delta_scale
|
||||
dy = src.dataset.meta["transform"][4] * delta_scale
|
||||
ls = LightSource(azdeg=315, altdeg=45)
|
||||
|
||||
# Remove elevation data from edge buffer tiles
|
||||
|
|
|
@ -233,9 +233,9 @@ def export_raster(input, output, **opts):
|
|||
|
||||
intensity = None
|
||||
if hillshade is not None and hillshade > 0:
|
||||
delta_scale = (ZOOM_EXTRA_LEVELS + 1) * 4
|
||||
delta_scale = ZOOM_EXTRA_LEVELS ** 2
|
||||
dx = src.meta["transform"][0] * delta_scale
|
||||
dy = -src.meta["transform"][4] * delta_scale
|
||||
dy = src.meta["transform"][4] * delta_scale
|
||||
ls = LightSource(azdeg=315, altdeg=45)
|
||||
intensity = ls.hillshade(arr[0], dx=dx, dy=dy, vert_exag=hillshade)
|
||||
intensity = intensity * 255.0
|
||||
|
|
Ładowanie…
Reference in New Issue