├── Get_nDSM2.ipynb ├── LICENSE ├── Python2 ├── classDSM.py ├── classDSM_v2_20180705.py └── get_nDSM.py ├── README.md ├── Yangon_inner_AW3D_30m.tif ├── Yangon_inner_AW3D_30moutput.tif ├── classDSM.py └── get_nDSM.py /Get_nDSM2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "# this is an example of how to obtain normalizedDSM (nDSM) and DTM from DSM using the classDSM.py\n", 10 | "\n", 11 | "\n", 12 | "\n", 13 | "# regular libraries\n", 14 | "import numpy as np\n", 15 | "import math as math\n", 16 | "from matplotlib import pyplot as plt\n", 17 | "from scipy.interpolate import griddata\n", 18 | "import cv2 as cv\n", 19 | "\n", 20 | "# import library for reading raster images\n", 21 | "import rasterio as rio\n", 22 | "\n", 23 | "\n", 24 | "\n" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "execution_count": 5, 30 | "metadata": {}, 31 | "outputs": [], 32 | "source": [ 33 | "\n", 34 | "'''\n", 35 | " Following parameters can be set.\n", 36 | " \n", 37 | " inputDSMpath = \"folder/inputfile.tif\"\n", 38 | " outputnDSMpath = \"folder/outputfile.tif\"\n", 39 | "\n", 40 | "\n", 41 | " # parameters/ thresholds\n", 42 | " img_resolution = 30 # resolution in metres of a pixel\n", 43 | " neighborhood_kernel = 300 # Extent of neighbors in metres: for 10m _ 200; for 30m - 3000\n", 44 | "\n", 45 | " height_threshold = 3 # meter\n", 46 | " slope_threshold = 30 # degrees using 30 degress for 30m as difficult to identify ground terrain otherwise\n", 47 | "\n", 48 | " # 8 directions\n", 49 | " obj.scanlines = [[-1, -1], [-1, 0], [-1, 1], [0, 1], [1, 1], [1, 0], [1, -1], [0, -1]]\n", 50 | " obj.scannum = [0, 1, 2, 3, 4, 5, 6, 7] # keyname for scanlines\n", 51 | "\n", 52 | "#ALthough the default parameters set have been tested in Yangon, they can be further refined else the used as it is.\n", 53 | "'''\n", 54 | "\n", 55 | "# Specify the parameters\n", 56 | "\n", 57 | "inputDSMpath = r\"Yangon_inner_AW3D_30m.tif\"\n", 58 | "outputnDSMpath = r\"Yangon_inner_AW3D_30moutput.tif\"\n", 59 | "img_resolution = 30\n", 60 | "neighborhood_kernel = 300\n", 61 | "height_threshold = 3\n", 62 | "slope_threshold = 30" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 10, 68 | "metadata": {}, 69 | "outputs": [ 70 | { 71 | "name": "stdout", 72 | "output_type": "stream", 73 | "text": [ 74 | " Entered DSM2DTM scanline\n", 75 | "filling holes\n", 76 | "job done \n" 77 | ] 78 | }, 79 | { 80 | "data": { 81 | "image/png": "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\n", 82 | "text/plain": [ 83 | "
" 84 | ] 85 | }, 86 | "metadata": { 87 | "needs_background": "light" 88 | }, 89 | "output_type": "display_data" 90 | } 91 | ], 92 | "source": [ 93 | "# the real code is abstracted within classDSM_v2_20180705\n", 94 | "# ----------------------------------------------------------------------------------------------------\n", 95 | "\n", 96 | "\n", 97 | "#improt the classDSM\n", 98 | "from classDSM import DSMtrans as genDSM\n", 99 | "\n", 100 | "# open the AW3D raster stored in DSMpath as an array DSMarr.\n", 101 | "DSMpath = inputDSMpath\n", 102 | "DSMarr = rio.open(DSMpath).read(1)\n", 103 | "\n", 104 | "#set the DSMarr as an object of genDSM\n", 105 | "obj1 = genDSM(DSMarr)\n", 106 | "obj1.resolution = int(img_resolution)\n", 107 | "obj1.Ext = int(neighborhood_kernel)\n", 108 | "obj1.dThrHeightDiff = int(height_threshold)\n", 109 | "obj1.dThrSlope = int(slope_threshold)\n", 110 | "\n", 111 | "#set the outpath\n", 112 | "nDSMpath = outputnDSMpath\n", 113 | "\n", 114 | "# running the ground function generates the DTM and nDSM arrays\n", 115 | "(DEMarr, nDSMarr) = obj1.ground()" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 11, 121 | "metadata": {}, 122 | "outputs": [ 123 | { 124 | "name": "stdout", 125 | "output_type": "stream", 126 | "text": [ 127 | "output saved\n" 128 | ] 129 | } 130 | ], 131 | "source": [ 132 | "# Save the result\n", 133 | "\n", 134 | "#these arrays can be saved with same georeference as input DSM. Here we are saving the building height nDSM into nDSMpath\n", 135 | "#get aLL ttributes of thwe source\n", 136 | "src = rio.open(DSMpath)\n", 137 | "# context manager.\n", 138 | "with rio.Env():\n", 139 | "\t# Write the product as a raster band to a new 8-bit file. For\n", 140 | "\t# the new file's profile, we start with the meta attributes of\n", 141 | "\t# the source file, but then change the band count to 1, set the\n", 142 | "\t# dtype to uint8, and specify LZW compression.\n", 143 | "\tprofile = src.profile\n", 144 | "\tprofile.update(\n", 145 | "\t\tdtype=rio.float32,\n", 146 | "\t\tcount=1,\n", 147 | "\t\tcompress='lzw')\n", 148 | "\n", 149 | "\twith rio.open(nDSMpath, 'w', **profile) as dst:\n", 150 | "\t\tdst.write(nDSMarr.astype(rio.float32), 1)\n", 151 | "\n", 152 | "print ('output saved')" 153 | ] 154 | } 155 | ], 156 | "metadata": { 157 | "kernelspec": { 158 | "display_name": "Python 3", 159 | "language": "python", 160 | "name": "python3" 161 | }, 162 | "language_info": { 163 | "codemirror_mode": { 164 | "name": "ipython", 165 | "version": 3 166 | }, 167 | "file_extension": ".py", 168 | "mimetype": "text/x-python", 169 | "name": "python", 170 | "nbconvert_exporter": "python", 171 | "pygments_lexer": "ipython3", 172 | "version": "3.7.1" 173 | } 174 | }, 175 | "nbformat": 4, 176 | "nbformat_minor": 2 177 | } 178 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 mprakhar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Python2/classDSM.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # __author__ = 'Prakhar' 4 | # Created 8/08/2017 5 | # Last edit 8/08/2017 6 | 7 | # Purpose: Make a class which can provide object To obtain DTM and nDSM from DSM . Follows from algo in advanced DTM generation from very high resolution satellite stereo images 8 | # (1) : Read Gauss smoothened image and generate hole DEM 9 | # (2) : Fill holes using Krigging/TIN based interpolation and genrate proper DEM 10 | # (3) : Genrate nDSM and built height estimation 11 | # (4) : Using classified vector of Landsat built area, find heights 12 | # (5) : reeample it to 750 m and pair with NL and plot NL vs Height 13 | 14 | 15 | # Location of output: E:\Acads\Research\AQM\Data process\CSVOut; mostly in the Urban3D folder and Daraprocessed folder 16 | 17 | # terminology used: 18 | '''# output filenames produced 19 | 20 | ''' 21 | 22 | import numpy as np 23 | import math as math 24 | from matplotlib import pyplot as plt 25 | from scipy.interpolate import griddata 26 | import cv2 as cv 27 | 28 | 29 | # pvt imports 30 | 31 | # * * * * * # * * * * * *# # * * * * * * # * * * * * * # * * *# Step0: Initialize * * * * * # * * * * * *# # * * * * * * # * * * * * * # * * * * * *# 32 | 33 | class DSMtrans(): 34 | 35 | def __init__(self, DSM): 36 | 37 | self.city = None 38 | self.prod = None 39 | self.DSM = DSM 40 | 41 | # constraints/ thresholds 42 | self.resolution = 30 # resolution in metres of a pixel 43 | self.Ext = 300 # Extent of neighbors in metres: for 10m _ 200; for 30m - 3000 44 | 45 | # extent of filter window; it should be around 90meters depending on the resolution; aster - 5, for 10m - 15 46 | self.iExt = np.int(self.Ext / (2 * self.resolution)) * 2 + 1 47 | 48 | self.dThrHeightDiff = 3 # meter 49 | self.dThrSlope = 60 # degrees using 60 degress for 30m as difficult to identify ground terrain otherwise 50 | 51 | # 8 directions 52 | self.scanlines = [[-1, -1], [-1, 0], [-1, 1], [0, 1], [1, 1], [1, 0], [1, -1], [0, -1]] 53 | self.scannum = [0, 1, 2, 3, 4, 5, 6, 7] # keyname for scanlines 54 | 55 | 56 | 57 | 58 | 59 | # * * * * * # * * * * * *# # * * * * * * # * * * * * * # * *# Step 1: prepare Holed DTM * * * * * # * * * * * *# # * * * * * * # * * * * * * # * * * * * *# 60 | 61 | # function to do gaussian smoeethening on inital DSM to get approximate surface 62 | def Gaussiansmooth(self, DSM): 63 | # Gaussian blurre image 64 | DSMs = cv.GaussianBlur(src = DSM, ksize = (2*int(100/(2*self.resolution))+1, 2*int(100/(2*self.resolution))+1), sigmaX = 25, sigmaY = 25) 65 | 66 | return DSMs 67 | 68 | 69 | 70 | # function to generate neghbors in the direction of scan line 71 | def neighborhood(self, arr, dir, c0): 72 | 73 | dict_scannum = { 74 | 0 : np.diag(arr), 75 | 1 : arr[:,c0], 76 | 2 : np.diag(np.fliplr(arr)), 77 | 3 : np.fliplr(arr)[c0], 78 | 4 : np.diag(arr)[::-1], 79 | 5 : arr[:,c0][::-1], 80 | 6 : np.diag(np.fliplr(arr))[::-1], 81 | 7 : arr[c0] 82 | } 83 | 84 | return dict_scannum[dir] 85 | 86 | # actual function for DTM generation 87 | def DSM2DTM_scanline(self, DSM, DSMs): 88 | 89 | print ' Entered DSM2DTM scanline' 90 | # DSM - the DSM to be treated 91 | # DSMs - smoothened DSM 92 | iExt = self.iExt 93 | dThrHeightDiff = self.dThrHeightDiff 94 | dThrSlope = self.dThrSlope 95 | resolution = self.resolution 96 | 97 | # finding shape 98 | [m,n] = np.shape(DSM) 99 | 100 | #3 dim array with 8 2D bands will store the output of each pixel for each scanline 101 | oLabel = np.zeros([8, m,n]) 102 | 103 | # running over thewhole imahe 104 | for x0 in range(0 + (iExt - 1) / 2 ,m - (iExt - 1) / 2): 105 | for y0 in range(0 + (iExt - 1) / 2, n - (iExt - 1) / 2): 106 | 107 | # temporary subsetting the region around the pix 108 | c0 = (iExt-1)/2 109 | oDSM = DSM[x0 - c0:x0 + c0 + 1,y0 - c0:y0 + c0 + 1] 110 | oDSMs = DSMs[x0 - c0:x0 + c0 + 1,y0 - c0:y0 + c0 + 1] 111 | 112 | # running for each scanline 113 | for scn in self.scannum: 114 | 115 | # scanline direction 116 | [iX, iY] = self.scanlines[scn] 117 | 118 | # local height difference 119 | oDSMDiff = oDSM[c0,c0] - DSM[x0 + iX,y0 + iY] 120 | 121 | # local terrain slope 122 | oDSMsDiff = oDSMs[c0,c0] - DSMs[x0 + iX,y0 + iY] 123 | 124 | # get neighborhood(our filter extent) 125 | oNeigh = self.neighborhood(oDSM, scn, c0) 126 | 127 | #slope corrected height values 128 | oNeighCorr = oNeigh - (self.neighborhood(oDSMs, scn, c0) - oDSMs[c0, c0]) 129 | 130 | # slope corrected minimal terrain value 131 | oMinNeigh = np.nanmin(oNeighCorr) 132 | 133 | # difference to minimum 134 | dHeightDiff = oDSM[c0, c0] - oMinNeigh 135 | 136 | if (dHeightDiff > dThrHeightDiff): 137 | #pixel is non - ground (0) 138 | oLabel[scn, x0, y0] = 0 139 | 140 | else : 141 | # slope corrected height difference 142 | dDelta = oDSMDiff - oDSMsDiff 143 | dSignDelta = -np.sign(dDelta) 144 | dSlopeLocal = math.atan2(abs(dDelta), resolution) * 180 / np.pi 145 | 146 | #slope corrected angle 147 | dSlope = dSlopeLocal * dSignDelta 148 | 149 | if (dSlope > dThrSlope): 150 | # pixel is non - ground (0) 151 | oLabel[scn, x0, y0] = 0 152 | 153 | else: 154 | # assign as last label 155 | oLabel[scn, x0, y0] = oLabel[scn, x0 - iX, y0 - iY] 156 | 157 | if (dSlope < 0): 158 | #pixel is ground (1) 159 | oLabel[scn, x0][y0] = 1 160 | 161 | # with file('oLabel_try.txt', 'w') as outfile: 162 | # for slice in oLabel: 163 | # np.savetxt(outfile, slice) 164 | 165 | return oLabel 166 | # Function end 167 | 168 | # * * * * * # * * * * * *# # * * * * * * # * * * * * * # * *# Step 2: DEM * * * * * # * * * * * *# # * * * * * * # * * * * * * # * * * * * *# 169 | 170 | # Fnction to fill holes in DEM array f 171 | def fill_holes(self, f): 172 | print 'filling holes' 173 | # interpolating and filling holes 174 | # from stack overflow different results for 2d interpolation with scipy.interpolate-gridddata 175 | # http://stackoverflow.com/questions/40449024/different-results-for-2d-interpolation-with-scipy-interpolate-griddata 176 | 177 | # make mask of all values to be filled 178 | mask = np.isnan(f) 179 | 180 | # final shape 181 | lx, ly = f.shape 182 | x, y = np.mgrid[0:lx, 0:ly] 183 | 184 | # 'Fill it' 185 | z = griddata(np.array([x[~mask].ravel(), y[~mask].ravel()]).T, f[~mask].ravel(), (x, y), method='linear') 186 | 187 | return z 188 | 189 | 190 | # Master unction to to run everything and get oytput 191 | 192 | def ground(self): 193 | 194 | DSM = self.DSM 195 | 196 | # get smoothenes DSM 197 | DSMs = self.Gaussiansmooth(DSM) 198 | 199 | # remove all -9999 values as nan 200 | DSM[DSM==-9999] = np.nan 201 | DSMs[DSMs==-9999] = np.nan 202 | 203 | # finally run function to find DSM from DEM 204 | oLabel = self.DSM2DTM_scanline(DSM, DSMs) 205 | 206 | # Now Checking which pixels have sum of scanline direction >=5. If yes then ground 207 | ground = DSM*(np.sum(oLabel, axis =0)>=5) 208 | 209 | # save ground as a raster 210 | # srs.arr_to_raster(ground, DSMpath, '//Urbanheights/DEMholes_try.tif') 211 | 212 | ground[ground==0] = np.nan 213 | 214 | # filling holes in the DEM 215 | DEM = self.fill_holes(ground) 216 | 217 | # smoothening the DEM 218 | DEM = cv.GaussianBlur(src = DEM, ksize = (5,5), sigmaX = 5, sigmaY = 5) 219 | 220 | # Generate nDSM 221 | nDSM = DSM - DEM 222 | 223 | # not sure if this is correct but coverting all <0 pixels to ground 224 | nDSM[nDSM<=0] = 0 225 | 226 | # visualize nDSM 227 | plt.imshow(nDSM) 228 | 229 | print 'job done ' 230 | 231 | return (DEM, nDSM) 232 | 233 | # fucntion end 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | -------------------------------------------------------------------------------- /Python2/classDSM_v2_20180705.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # __author__ = 'Prakhar' 4 | # Created 8/08/2017 5 | # Last edit 8/07/2018 - changed majority voting to more than 5 6 | # Edit : Fixed extent of filter window 7 | 8 | 9 | # Purpose: Make a class which can provide object To obtain DTM and nDSM from DSM . Follows from algo in advanced DTM generation from very high resolution satellite stereo images 10 | # (1) : Read Gauss smoothened image and generate hole DEM 11 | # (2) : Fill holes using Krigging/TIN based interpolation and genrate proper DEM 12 | # (3) : Genrate nDSM and built height estimation 13 | # (4) : Using classified vector of Landsat built area, find heights 14 | # (5) : reeample it to 750 m and pair with NL and plot NL vs Height 15 | 16 | 17 | 18 | 19 | # terminology used: 20 | '''# output filenames produced 21 | 22 | ''' 23 | 24 | import numpy as np 25 | import math as math 26 | from matplotlib import pyplot as plt 27 | from scipy.interpolate import griddata 28 | import cv2 as cv 29 | 30 | 31 | # pvt imports 32 | 33 | # * * * * * # * * * * * *# # * * * * * * # * * * * * * # * * *# Step0: Initialize * * * * * # * * * * * *# # * * * * * * # * * * * * * # * * * * * *# 34 | 35 | class DSMtrans(): 36 | 37 | def __init__(self, DSM): 38 | 39 | self.city = None 40 | self.prod = None 41 | self.DSM = DSM 42 | 43 | # constraints/ thresholds 44 | self.resolution = 30 # resolution in metres of a pixel 45 | self.Ext = 300 # Extent of examining neighbors in metres: for 10m _ 200; for 30m - 3000 46 | 47 | 48 | 49 | self.dThrHeightDiff = 3 # height difference in meter. >=threshold is non-ground 50 | self.dThrSlope = 60 # degrees using 60 degress for 30m as difficult to identify ground terrain otherwise 51 | 52 | # 8 directions 53 | self.scanlines = [[-1, -1], [-1, 0], [-1, 1], [0, 1], [1, 1], [1, 0], [1, -1], [0, -1]] 54 | self.scannum = [0, 1, 2, 3, 4, 5, 6, 7] # keyname for scanlines 55 | 56 | 57 | 58 | 59 | 60 | # * * * * * # * * * * * *# # * * * * * * # * * * * * * # * *# Step 1: prepare DTM with holes * * * * * # * * * * * *# # * * * * * * # * * * * * * # * * * * * *# 61 | 62 | # function to do gaussian smoeethening on inital DSM to get approximate surface 63 | def Gaussiansmooth(self, DSM): 64 | # Gaussian blurred image 65 | DSMs = cv.GaussianBlur(src = DSM, ksize = (2*int(100/(2*self.resolution))+1, 2*int(100/(2*self.resolution))+1), sigmaX = 25, sigmaY = 25) 66 | 67 | return DSMs 68 | 69 | 70 | 71 | # function to generate neghbors in the direction of scan line 72 | def neighborhood(self, arr, dir, c0): 73 | 74 | dict_scannum = { 75 | 0 : np.diag(arr), 76 | 1 : arr[:,c0], 77 | 2 : np.diag(np.fliplr(arr)), 78 | 3 : np.fliplr(arr)[c0], 79 | 4 : np.diag(arr)[::-1], 80 | 5 : arr[:,c0][::-1], 81 | 6 : np.diag(np.fliplr(arr))[::-1], 82 | 7 : arr[c0] 83 | } 84 | 85 | return dict_scannum[dir] 86 | 87 | # actual function for DTM generation 88 | def DSM2DTM_scanline(self, DSM, DSMs): 89 | 90 | print (' Entered DSM2DTM scanline') 91 | # DSM - the DSM to be treated 92 | # DSMs - smoothened DSM 93 | 94 | # extent of filter window; it should be around 90meters depending on the resolution; aster - 5, for 10m - 15 95 | self.iExt = np.int(self.Ext / (2 * self.resolution)) * 2 + 1 96 | 97 | iExt = int(self.iExt) 98 | dThrHeightDiff = self.dThrHeightDiff 99 | dThrSlope = self.dThrSlope 100 | resolution = self.resolution 101 | 102 | # finding shape 103 | [m,n] = np.shape(DSM) 104 | 105 | #3 dim array with 8 2D bands will store the output of each pixel for each scanline 106 | oLabel = np.zeros([8, m,n]) 107 | 108 | # running over the whole image 109 | for x0 in range(0 + int((iExt - 1)/ 2 ),m - int((iExt - 1) / 2)): 110 | for y0 in range(0 + int((iExt - 1) // 2), n - int((iExt - 1) // 2)): 111 | 112 | # temporary subsetting the region around the pix 113 | c0 = int((iExt-1)/2) 114 | oDSM = DSM[x0 - c0:x0 + c0 + 1,y0 - c0:y0 + c0 + 1] 115 | oDSMs = DSMs[x0 - c0:x0 + c0 + 1,y0 - c0:y0 + c0 + 1] 116 | 117 | # running for each scanline 118 | for scn in self.scannum: 119 | 120 | # scanline direction 121 | [iX, iY] = self.scanlines[scn] 122 | 123 | # local height difference 124 | oDSMDiff = oDSM[c0,c0] - DSM[x0 + iX,y0 + iY] 125 | 126 | # local terrain slope 127 | oDSMsDiff = oDSMs[c0,c0] - DSMs[x0 + iX,y0 + iY] 128 | 129 | # get neighborhood(our filter extent) 130 | oNeigh = self.neighborhood(oDSM, scn, c0) 131 | 132 | #slope corrected height values 133 | oNeighCorr = oNeigh - (self.neighborhood(oDSMs, scn, c0) - oDSMs[c0, c0]) 134 | 135 | # slope corrected minimal terrain value 136 | oMinNeigh = np.nanmin(oNeighCorr) 137 | 138 | # difference to minimum 139 | dHeightDiff = oDSM[c0, c0] - oMinNeigh 140 | 141 | if (dHeightDiff > dThrHeightDiff): 142 | #pixel is non - ground (0) 143 | oLabel[scn, x0, y0] = 0 144 | 145 | else : 146 | # slope corrected height difference 147 | dDelta = oDSMDiff - oDSMsDiff 148 | dSignDelta = -np.sign(dDelta) 149 | dSlopeLocal = math.atan2(abs(dDelta), resolution) * 180 / np.pi 150 | 151 | #slope corrected angle 152 | dSlope = dSlopeLocal * dSignDelta 153 | 154 | if (dSlope > dThrSlope): 155 | # pixel is non - ground (0) 156 | oLabel[scn, x0, y0] = 0 157 | 158 | else: 159 | # assign as last label 160 | oLabel[scn, x0, y0] = oLabel[scn, x0 - iX, y0 - iY] 161 | 162 | if (dSlope < 0): 163 | #pixel is ground (1) 164 | oLabel[scn, x0][y0] = 1 165 | 166 | # with file('oLabel_try.txt', 'w') as outfile: 167 | # for slice in oLabel: 168 | # np.savetxt(outfile, slice) 169 | 170 | return oLabel 171 | # Function end 172 | 173 | # * * * * * # * * * * * *# # * * * * * * # * * * * * * # * *# Step 2: DEM * * * * * # * * * * * *# # * * * * * * # * * * * * * # * * * * * *# 174 | 175 | # Fnction to fill holes in DEM array f 176 | def fill_holes(self, f): 177 | print ('filling holes') 178 | # interpolating and filling holes 179 | # from stack overflow different results for 2d interpolation with scipy.interpolate-gridddata 180 | # http://stackoverflow.com/questions/40449024/different-results-for-2d-interpolation-with-scipy-interpolate-griddata 181 | 182 | # make mask of all values to be filled 183 | #mask = np.isnan(f) 184 | maskobj = np.ma.masked_where(f==0, f) 185 | mask = maskobj.mask 186 | 187 | # final shape 188 | lx, ly = f.shape 189 | x, y = np.mgrid[0:lx, 0:ly] 190 | 191 | # 'Fill it' 192 | z = griddata(np.array([x[~mask].ravel(), y[~mask].ravel()]).T, f[~mask].ravel(), (x, y), method='linear') 193 | 194 | return z 195 | 196 | 197 | # Master function to to run everything and get oytput 198 | 199 | def ground(self): 200 | 201 | DSM = self.DSM 202 | 203 | # get smoothenes DSM 204 | DSMs = self.Gaussiansmooth(DSM) 205 | 206 | # remove all -9999 values as nan 207 | #DSM[DSM<=-9999.0] = np.nan 208 | #DSMs[DSMs<=-9999.0] = np.nan 209 | 210 | # finally run function to find DSM from DEM 211 | oLabel = self.DSM2DTM_scanline(DSM, DSMs) 212 | 213 | # Now Checking which pixels have sum of scanline direction >=5. If yes then ground 214 | ground = DSM*(np.sum(oLabel, axis =0)>5) 215 | 216 | # save ground as a raster 217 | # srs.arr_to_raster(ground, DSMpath, '//Urbanheights/DEMholes_try.tif') 218 | 219 | #ground[ground==0.0] = np.nan 220 | 221 | # filling holes in the DEM 222 | DEM = self.fill_holes(ground) 223 | 224 | # smoothening the DEM 225 | DEM = cv.GaussianBlur(src = DEM, ksize = (5,5), sigmaX = 5, sigmaY = 5) 226 | 227 | # Generate nDSM 228 | nDSM = DSM - DEM 229 | 230 | 231 | # not sure if this is correct but coverting all <0 pixels to ground 232 | #nDSM[nDSM<=0] = 0 233 | 234 | 235 | # visualize nDSM 236 | plt.imshow(nDSM) 237 | 238 | print ('job done ') 239 | 240 | return (DEM, nDSM) 241 | 242 | # fucntion end 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | -------------------------------------------------------------------------------- /Python2/get_nDSM.py: -------------------------------------------------------------------------------- 1 | # this is an example of how to obtain normalizedDSM (nDSM) and DTM from DSM using the classDSM.py 2 | 3 | # import library for reading raster images 4 | import rasterio as rio 5 | import numpy as np 6 | import math as math 7 | from matplotlib import pyplot as plt 8 | from scipy.interpolate import griddata 9 | import cv2 as cv 10 | import argparse 11 | 12 | #improt the classDSM 13 | from classDSM import DSMtrans as genDSM 14 | 15 | # ===============++++++++++ ------- to RUN THE CODE type ----- +++++=========== 16 | ''' 17 | python get_nDSM.py --inputDSMpath '/mnt/usr1/home/prakhar/Research/AQM_research/Data/Data_raw/AW3D/for_trial.tif' --outputnDSMpath 'outfilesample.tif' --img_resolution 30 --neighborhood_kernel 300 --height_threshold 3 --slope_threshold 60 18 | 19 | ''' 20 | 21 | #getting infor from the parser 22 | parser = argparse.ArgumentParser() 23 | parser.add_argument("--inputDSMpath", help="full path to DSM file while needs to be converted. e.g. \home\AW3D.tif") 24 | parser.add_argument("--outputnDSMpath", help="full path to output nDSM file after converted e.g. \home\AW3Dout.tif") 25 | parser.add_argument("--img_resolution", help="image resolution in meter") 26 | parser.add_argument("--neighborhood_kernel", help="how far (in metres) should the kernel be considered") 27 | parser.add_argument("--height_threshold", help=" minimum height difference (in meter) between ground and building. Generally height of 1 storey ") 28 | parser.add_argument("--slope_threshold", help="minimum slope between a building and ground pixel (in degrees) ") 29 | 30 | a = parser.parse_args() 31 | 32 | # open the AW3D raster stored in DSMpath as an array DSMarr. 33 | DSMpath = a.inputDSMpath 34 | DSMarr = rio.open(DSMpath).read(1) 35 | 36 | #set the DSMarr as an object of genDSM 37 | obj1 = genDSM(DSMarr) 38 | obj1.resolution = int(a.img_resolution) 39 | obj1.Ext = int(a.neighborhood_kernel) 40 | obj1.dThrHeightDiff = int(a.height_threshold) 41 | obj1.dThrSlope = int(a.slope_threshold) 42 | 43 | #set the outpath 44 | nDSMpath = a.outputnDSMpath 45 | 46 | 47 | ''' 48 | Following parameters can be set. 49 | obj.city = None 50 | obj.prod = None 51 | obj.DSM = DSM 52 | 53 | # constraints/ thresholds 54 | obj.resolution = 30 # resolution in metres of a pixel 55 | obj.Ext = 300 # Extent of neighbors in metres: for 10m _ 200; for 30m - 3000 56 | 57 | # extent of filter window; it should be around 90meters depending on the resolution; aster - 5, for 10m - 15 58 | obj.iExt = np.int(obj.Ext / (2 * obj.resolution)) * 2 + 1 59 | 60 | obj.dThrHeightDiff = 3 # meter 61 | obj.dThrSlope = 60 # degrees using 60 degress for 30m as difficult to identify ground terrain otherwise 62 | 63 | # 8 directions 64 | obj.scanlines = [[-1, -1], [-1, 0], [-1, 1], [0, 1], [1, 1], [1, 0], [1, -1], [0, -1]] 65 | obj.scannum = [0, 1, 2, 3, 4, 5, 6, 7] # keyname for scanlines 66 | 67 | #ALthough the default parameters set have been tested in Yangon, they can be further refined else the used as it is. 68 | ''' 69 | 70 | 71 | # running the ground function generates the DTM and nDSM arrays 72 | (DEMarr, nDSMarr) = obj1.ground() 73 | 74 | #these arrays can be saved with same georeference as input DSM. Here we are saving the building height nDSM into nDSMpath 75 | #get aLL ttributes of thwe source 76 | src = rio.open(DSMpath) 77 | # context manager. 78 | with rio.drivers(): 79 | # Write the product as a raster band to a new 8-bit file. For 80 | # the new file's profile, we start with the meta attributes of 81 | # the source file, but then change the band count to 1, set the 82 | # dtype to uint8, and specify LZW compression. 83 | profile = src.profile 84 | profile.update( 85 | dtype=rio.float32, 86 | count=1, 87 | compress='lzw') 88 | 89 | with rio.open(nDSMpath, 'w', **profile) as dst: 90 | dst.write(nDSMarr.astype(rio.float32), 1) 91 | 92 | print 'output saved' 93 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | Code for the paper - Comparison of Digital Building Height Models Extracted from AW3D, TanDEM-X, ASTER, and SRTM Digital Surface Models over Yangon City. If you find this useful, please cite as - Misra, P.; Avtar, R.; Takeuchi, W. Comparison of Digital Building Height Models Extracted from AW3D, TanDEM-X, ASTER, and SRTM Digital Surface Models over Yangon City. Remote Sens. 2018, 10, 2008. 3 | https://www.mdpi.com/2072-4292/10/12/2008 4 | 5 | 6 | # DSM2DTM 7 | 8 | Notes: 9 | 10 | 11 | A) This is a Python based implementation of "ADVANCED DTM GENERATION FROM VERY HIGH RESOLUTION SATELLITE STEREO IMAGES" by Perko et al (2015). 12 | https://www.isprs-ann-photogramm-remote-sens-spatial-inf-sci.net/II-3-W4/165/2015/isprsannals-II-3-W4-165-2015.pdf 13 | This code is a modification of Perko et al (2015) to suit coarse resolution DSM e.g. ASTER, AW3D30. 14 | 15 | B) This runs on Python 2.7. Also download get_DSM.py and classDSM.py in the same folder. Make that folder as the active folder. 16 | 17 | C) To run, type in terminal: 18 | 19 | python get_nDSM.py --inputDSMpath 'path/for_trial.tif' --outputnDSMpath 'outfilesample.tif' --img_resolution 30 --neighborhood_kernel 300 --height_threshold 3 --slope_threshold 60 20 | 21 | D) Help options: 22 | 23 | python get_nDSM.py -h 24 | 25 | E) Varibale decription 26 | 27 | img_resolution is the resolution in meters. e.g. SRTM it should be 90. Regarding other optional arguments: 28 | 29 | 1) 30 | 31 | --inputDSMpath INPUTDSMPATH 32 | full path to DSM file which needs to be converted. 33 | e.g. \home\AW3D.tif 34 | 35 | 2) 36 | 37 | --outputnDSMpath OUTPUTNDSMPATH 38 | full path to output nDSM file after converted e.g. 39 | \home\AW3Dout.tif 40 | 41 | 3) 42 | 43 | --img_resolution IMG_RESOLUTION 44 | image resolution in meter 45 | 46 | 4) 47 | 48 | --neighborhood_kernel NEIGHBORHOOD_KERNEL 49 | how far (in meter) should the kernel size be considered. 50 | Recommended - Lower distance for higher resolution. 51 | 52 | 5) 53 | 54 | --height_threshold HEIGHT_THRESHOLD 55 | minimum height difference (in meter) between ground 56 | and building. Generally height of 1 storey building. 57 | 58 | 6) 59 | 60 | --slope_threshold SLOPE_THRESHOLD 61 | minimum slope between a building and ground pixel (in 62 | degrees) 63 | 64 | 65 | 66 | F) Please also ensure that following modules are present: 67 | Rasterio #(Install by: pip install rasterio) 68 | Cv2 69 | Scipy 70 | Numpy 71 | Math 72 | Matplotlib 73 | 74 | ## -------- Request for feedback ----------------------------- 75 | 76 | 77 | I shall be grateful if you intend to use this code in a project. Kindly let me know your intended applications with this code. I will be happy to assist with problems/issues and feedback : ozprakharpooner at gmail dot com 78 | -------------------------------------------------------------------------------- /Yangon_inner_AW3D_30m.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mprakhar/DSM2DTM/1e64daa2ba6621c834c9e4503f682d004a4d6d7a/Yangon_inner_AW3D_30m.tif -------------------------------------------------------------------------------- /Yangon_inner_AW3D_30moutput.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mprakhar/DSM2DTM/1e64daa2ba6621c834c9e4503f682d004a4d6d7a/Yangon_inner_AW3D_30moutput.tif -------------------------------------------------------------------------------- /classDSM.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # __author__ = 'Prakhar' 4 | # Created 8/08/2017 5 | # Last edit 8/07/2018 - changed majority voting to more than 5 6 | # Edit : Fixed extent of filter window 7 | 8 | 9 | # Purpose: Make a class which can provide object To obtain DTM and nDSM from DSM . Follows from algo in advanced DTM generation from very high resolution satellite stereo images 10 | # (1) : Read Gauss smoothened image and generate hole DEM 11 | # (2) : Fill holes using Krigging/TIN based interpolation and genrate proper DEM 12 | # (3) : Genrate nDSM and built height estimation 13 | # (4) : Using classified vector of Landsat built area, find heights 14 | # (5) : reeample it to 750 m and pair with NL and plot NL vs Height 15 | 16 | 17 | 18 | 19 | # terminology used: 20 | '''# output filenames produced 21 | 22 | ''' 23 | 24 | import numpy as np 25 | import math as math 26 | from matplotlib import pyplot as plt 27 | from scipy.interpolate import griddata 28 | import cv2 as cv 29 | 30 | 31 | # pvt imports 32 | 33 | # * * * * * # * * * * * *# # * * * * * * # * * * * * * # * * *# Step0: Initialize * * * * * # * * * * * *# # * * * * * * # * * * * * * # * * * * * *# 34 | 35 | class DSMtrans(): 36 | 37 | def __init__(self, DSM): 38 | 39 | self.city = None 40 | self.prod = None 41 | self.DSM = DSM 42 | 43 | # constraints/ thresholds 44 | self.resolution = 30 # resolution in metres of a pixel 45 | self.Ext = 300 # Extent of examining neighbors in metres: for 10m _ 200; for 30m - 3000 46 | 47 | 48 | 49 | self.dThrHeightDiff = 3 # height difference in meter. >=threshold is non-ground 50 | self.dThrSlope = 60 # degrees using 60 degress for 30m as difficult to identify ground terrain otherwise 51 | 52 | # 8 directions 53 | self.scanlines = [[-1, -1], [-1, 0], [-1, 1], [0, 1], [1, 1], [1, 0], [1, -1], [0, -1]] 54 | self.scannum = [0, 1, 2, 3, 4, 5, 6, 7] # keyname for scanlines 55 | 56 | 57 | 58 | 59 | 60 | # * * * * * # * * * * * *# # * * * * * * # * * * * * * # * *# Step 1: prepare DTM with holes * * * * * # * * * * * *# # * * * * * * # * * * * * * # * * * * * *# 61 | 62 | # function to do gaussian smoeethening on inital DSM to get approximate surface 63 | def Gaussiansmooth(self, DSM): 64 | # Gaussian blurred image 65 | DSMs = cv.GaussianBlur(src = DSM, ksize = (2*int(100/(2*self.resolution))+1, 2*int(100/(2*self.resolution))+1), sigmaX = 25, sigmaY = 25) 66 | 67 | return DSMs 68 | 69 | 70 | 71 | # function to generate neghbors in the direction of scan line 72 | def neighborhood(self, arr, dir, c0): 73 | 74 | dict_scannum = { 75 | 0 : np.diag(arr), 76 | 1 : arr[:,c0], 77 | 2 : np.diag(np.fliplr(arr)), 78 | 3 : np.fliplr(arr)[c0], 79 | 4 : np.diag(arr)[::-1], 80 | 5 : arr[:,c0][::-1], 81 | 6 : np.diag(np.fliplr(arr))[::-1], 82 | 7 : arr[c0] 83 | } 84 | 85 | return dict_scannum[dir] 86 | 87 | # actual function for DTM generation 88 | def DSM2DTM_scanline(self, DSM, DSMs): 89 | 90 | print (' Entered DSM2DTM scanline') 91 | # DSM - the DSM to be treated 92 | # DSMs - smoothened DSM 93 | 94 | # extent of filter window; it should be around 90meters depending on the resolution; aster - 5, for 10m - 15 95 | self.iExt = np.int(self.Ext / (2 * self.resolution)) * 2 + 1 96 | 97 | iExt = int(self.iExt) 98 | dThrHeightDiff = self.dThrHeightDiff 99 | dThrSlope = self.dThrSlope 100 | resolution = self.resolution 101 | 102 | # finding shape 103 | [m,n] = np.shape(DSM) 104 | 105 | #3 dim array with 8 2D bands will store the output of each pixel for each scanline 106 | oLabel = np.zeros([8, m,n]) 107 | 108 | # running over the whole image 109 | for x0 in range(0 + int((iExt - 1)/ 2 ),m - int((iExt - 1) / 2)): 110 | for y0 in range(0 + int((iExt - 1) // 2), n - int((iExt - 1) // 2)): 111 | 112 | # temporary subsetting the region around the pix 113 | c0 = int((iExt-1)/2) 114 | oDSM = DSM[x0 - c0:x0 + c0 + 1,y0 - c0:y0 + c0 + 1] 115 | oDSMs = DSMs[x0 - c0:x0 + c0 + 1,y0 - c0:y0 + c0 + 1] 116 | 117 | # running for each scanline 118 | for scn in self.scannum: 119 | 120 | # scanline direction 121 | [iX, iY] = self.scanlines[scn] 122 | 123 | # local height difference 124 | oDSMDiff = oDSM[c0,c0] - DSM[x0 + iX,y0 + iY] 125 | 126 | # local terrain slope 127 | oDSMsDiff = oDSMs[c0,c0] - DSMs[x0 + iX,y0 + iY] 128 | 129 | # get neighborhood(our filter extent) 130 | oNeigh = self.neighborhood(oDSM, scn, c0) 131 | 132 | #slope corrected height values 133 | oNeighCorr = oNeigh - (self.neighborhood(oDSMs, scn, c0) - oDSMs[c0, c0]) 134 | 135 | # slope corrected minimal terrain value 136 | oMinNeigh = np.nanmin(oNeighCorr) 137 | 138 | # difference to minimum 139 | dHeightDiff = oDSM[c0, c0] - oMinNeigh 140 | 141 | if (dHeightDiff > dThrHeightDiff): 142 | #pixel is non - ground (0) 143 | oLabel[scn, x0, y0] = 0 144 | 145 | else : 146 | # slope corrected height difference 147 | dDelta = oDSMDiff - oDSMsDiff 148 | dSignDelta = -np.sign(dDelta) 149 | dSlopeLocal = math.atan2(abs(dDelta), resolution) * 180 / np.pi 150 | 151 | #slope corrected angle 152 | dSlope = dSlopeLocal * dSignDelta 153 | 154 | if (dSlope > dThrSlope): 155 | # pixel is non - ground (0) 156 | oLabel[scn, x0, y0] = 0 157 | 158 | else: 159 | # assign as last label 160 | oLabel[scn, x0, y0] = oLabel[scn, x0 - iX, y0 - iY] 161 | 162 | if (dSlope < 0): 163 | #pixel is ground (1) 164 | oLabel[scn, x0][y0] = 1 165 | 166 | # with file('oLabel_try.txt', 'w') as outfile: 167 | # for slice in oLabel: 168 | # np.savetxt(outfile, slice) 169 | 170 | return oLabel 171 | # Function end 172 | 173 | # * * * * * # * * * * * *# # * * * * * * # * * * * * * # * *# Step 2: DEM * * * * * # * * * * * *# # * * * * * * # * * * * * * # * * * * * *# 174 | 175 | # Fnction to fill holes in DEM array f 176 | def fill_holes(self, f): 177 | print ('filling holes') 178 | # interpolating and filling holes 179 | # from stack overflow different results for 2d interpolation with scipy.interpolate-gridddata 180 | # http://stackoverflow.com/questions/40449024/different-results-for-2d-interpolation-with-scipy-interpolate-griddata 181 | 182 | # make mask of all values to be filled 183 | #mask = np.isnan(f) 184 | maskobj = np.ma.masked_where(f==0, f) 185 | mask = maskobj.mask 186 | 187 | # final shape 188 | lx, ly = f.shape 189 | x, y = np.mgrid[0:lx, 0:ly] 190 | 191 | # 'Fill it' 192 | z = griddata(np.array([x[~mask].ravel(), y[~mask].ravel()]).T, f[~mask].ravel(), (x, y), method='linear') 193 | 194 | return z 195 | 196 | 197 | # Master function to to run everything and get oytput 198 | 199 | def ground(self): 200 | 201 | DSM = self.DSM 202 | 203 | # get smoothenes DSM 204 | DSMs = self.Gaussiansmooth(DSM) 205 | 206 | # remove all -9999 values as nan 207 | #DSM[DSM<=-9999.0] = np.nan 208 | #DSMs[DSMs<=-9999.0] = np.nan 209 | 210 | # finally run function to find DSM from DEM 211 | oLabel = self.DSM2DTM_scanline(DSM, DSMs) 212 | 213 | # Now Checking which pixels have sum of scanline direction >=5. If yes then ground 214 | ground = DSM*(np.sum(oLabel, axis =0)>5) 215 | 216 | # save ground as a raster 217 | # srs.arr_to_raster(ground, DSMpath, '//Urbanheights/DEMholes_try.tif') 218 | 219 | #ground[ground==0.0] = np.nan 220 | 221 | # filling holes in the DEM 222 | DEM = self.fill_holes(ground) 223 | 224 | # smoothening the DEM 225 | DEM = cv.GaussianBlur(src = DEM, ksize = (5,5), sigmaX = 5, sigmaY = 5) 226 | 227 | # Generate nDSM 228 | nDSM = DSM - DEM 229 | 230 | 231 | # not sure if this is correct but coverting all <0 pixels to ground 232 | #nDSM[nDSM<=0] = 0 233 | 234 | 235 | # visualize nDSM 236 | plt.imshow(nDSM) 237 | 238 | print ('job done ') 239 | 240 | return (DEM, nDSM) 241 | 242 | # fucntion end 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | -------------------------------------------------------------------------------- /get_nDSM.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # __author__ = 'Prakhar' 4 | # Created 8/08/2017 5 | # Last edit 8/05/2018 6 | 7 | # Purpose: To use obtain normalizedDSM (nDSM) and DTM from DSM using the classDSM.py using regular method of running in Pycharm 8 | 9 | # import library for reading raster images 10 | import rasterio as rio 11 | import numpy as np 12 | import math as math 13 | from matplotlib import pyplot as plt 14 | from scipy.interpolate import griddata 15 | import cv2 as cv 16 | import argparse 17 | import datetime 18 | 19 | #improt the classDSM 20 | import classDSM as genDSM 21 | 22 | # ===============++++++++++ ------- to RUN THE CODE type ----- +++++=========== 23 | 24 | def param_init(inputDSMpath, img_resolution, neighborhood_kernel, height_threshold, slope_thresold, outputnDSMpath ): 25 | 26 | 27 | # open the AW3D raster stored in DSMpath as an array DSMarr. 28 | DSMpath = inputDSMpath 29 | DSMarr = rio.open(DSMpath).read(1) 30 | 31 | #set the DSMarr as an object of genDSM 32 | obj = genDSM.DSMtrans(DSMarr) 33 | obj.resolution = img_resolution 34 | obj.Ext = neighborhood_kernel 35 | obj.dThrHeightDiff = height_threshold 36 | obj.dThrSlope = slope_thresold 37 | 38 | #set the outpath 39 | nDSMpath = outputnDSMpath 40 | 41 | 42 | ''' 43 | Following parameters can be set. 44 | obj.city = None 45 | obj.prod = None 46 | obj.DSM = DSM 47 | 48 | # constraints/ thresholds 49 | obj.resolution = 30 # resolution in metres of a pixel 50 | obj.Ext = 300 # Extent of neighbors in metres: for 10m _ 200; for 30m - 3000 51 | 52 | # extent of filter window; it should be around 90meters depending on the resolution; aster - 5, for 10m - 15 53 | obj.iExt = np.int(obj.Ext / (2 * obj.resolution)) * 2 + 1 54 | 55 | obj.dThrHeightDiff = 3 # meter 56 | obj.dThrSlope = 60 # degrees using 60 degress for 30m as difficult to identify ground terrain otherwise 57 | 58 | # 8 directions 59 | obj.scanlines = [[-1, -1], [-1, 0], [-1, 1], [0, 1], [1, 1], [1, 0], [1, -1], [0, -1]] 60 | obj.scannum = [0, 1, 2, 3, 4, 5, 6, 7] # keyname for scanlines 61 | 62 | #ALthough the default parameters set have been tested in Yangon, they can be further refined else the used as it is. 63 | ''' 64 | 65 | 66 | # running the ground function generates the DTM and nDSM arrays 67 | (DEMarr, nDSMarr) = obj.ground() 68 | 69 | #these arrays can be saved with same georeference as input DSM. Here we are saving the building height nDSM into nDSMpath 70 | #get aLL ttributes of thwe source 71 | src = rio.open(DSMpath) 72 | # context manager. 73 | with rio.Env(): 74 | # Write the product as a raster band to a new 8-bit file. For 75 | # the new file's profile, we start with the meta attributes of 76 | # the source file, but then change the band count to 1, set the 77 | # dtype to uint8, and specify LZW compression. 78 | profile = src.profile 79 | profile.update( 80 | dtype=rio.float32, 81 | count=1, 82 | compress='lzw') 83 | 84 | with rio.open(nDSMpath, 'w', **profile) as dst: 85 | dst.write(nDSMarr.astype(rio.float32), 1) 86 | 87 | 88 | 89 | 90 | param_init( 91 | inputDSMpath=r r"E:\OneDrive\AQM_Research\Codes_W\Yangon_DSM\for_labserver\notebook\Yangon_inner_AW3D_30m.tif" 92 | , img_resolution=30 93 | , neighborhood_kernel=300 94 | , height_threshold=3 95 | , slope_thresold=30 96 | , 97 | outputnDSMpath=r"\\Yangon_inner_AW3D_30moutput.tif" 98 | 99 | ) 100 | 101 | --------------------------------------------------------------------------------