Keras神經網路深度學習提取水體,采用了面狀樣本,簡化了采樣程序,結果為水體可能性,
1、原圖

2、面狀樣本 0為非水體,1為水體

3、水體提取結果:從紅色到藍色(從0-1),是水體的可能性逐步增加,

4、部分代碼
# 獲取世界檔案
src_img1 = gdal.Open(raster1)
geo_trans1 = src_img1.GetGeoTransform()
nBands1 = src_img1.RasterCount
nBands=nBands1
# 使用pyshp
m_shp = shapefile.Reader("{}.shp".format(shp)) # 打開shp
# 將圖層擴展轉換為像素坐標
min_x, min_y, max_x, max_y = m_shp.bbox
ul_x, ul_y = world2pixel(geo_trans1, min_x, max_y)
lr_x, lr_y = world2pixel(geo_trans1, max_x, min_y)
# 計算新圖片像素尺寸
px_wid = int(lr_x - ul_x)
px_hei = int(lr_y - ul_y)
clip_img = src_arr[:, ul_y:lr_y, ul_x:lr_x]
# 為圖片創建一個新的geomatrix物件以便附加地理參考資料
geo_trans = list(geo_trans1)
geo_trans[0] = min_x
geo_trans[3] = max_y
s=0#回圈指標
TrainData = np.empty(shape=[0, nBands])
TrainLabel=[]
while s<m_shp.numRecords:
pixels = []
for p in m_shp.shape(s).points:
pixels.append(world2pixel(geo_trans, p[0], p[1]))
raster_poly = Image.new('L', (px_wid, px_hei), 1)
# 使用PIL創建一個空白圖片
raster_rize = ImageDraw.Draw(raster_poly)
raster_rize.polygon(pixels, 0)
# 將PIL轉換為numpy
mask_arr = img2array(raster_poly)
# 裁剪
clip_arr = gdal_array.numpy.choose(mask_arr, (clip_img, 0)).astype(gdal_array.numpy.uint16)
clip_arr = changeDimension(clip_arr)
a2=clip_arr[~(clip_arr==0).all(1)]
TrainData = np.append(TrainData, a2, axis=0)
#讀取樣本標注資訊,查找起來太麻煩,直接讀取最后一位
value=m_shp.record(s)[-1]
lable= np.array([value for j in range(0, len(a2))])#for i in range(0, 1
TrainLabel=np.append(TrainLabel,lable,axis=0)
s=s+1
# 開始使用深度學習模型
# 資料數歸一化
TrainData = normalization(TrainData)#xTrain / 255.0
TrainLabel = normalization(TrainLabel)#xTest / 255.0
原始碼下載地址:
https://download.csdn.net/download/sailingw/20818136
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292599.html
標籤:其他
