天天看點

多光譜遙感分類:基于周遊的結果制圖

在遙感大圖 選擇 小樣本 訓練出(深度學習)模型後,需要對整個遙感大圖進行分類。通過逐塊周遊,當然也可以逐像素周遊,進而将分類結果繪制在畫闆上。

如下為繪制代碼:

def render_class2(step,size):#步長,視窗大小
    tif_src = r"D:\lishihang\test_tif_peizhun_subset_proj_預測範圍.tif"
    dataset = gdal.Open(tif_src)  # tif資料
    model = load_model("D:\lishihang\model.h5") #加載模型
    vec = {'猴子': 0, '貓': 1, '狗': 2}# 标簽和預測值對應關系

    res=np.ones(shape=(dataset.RasterXSize,dataset.RasterYSize,3),dtype=np.uint8)*255 #畫闆,白色

    label=np.random.randint(0,255,size=(3,3)) #随機生成顔色
    # print(label)

    for i in range(int(size/2),dataset.RasterXSize,step):

        for j in range(int(size/2),dataset.RasterYSize,step):
            img=get_img(dataset,size,i,j) #得到中心點為i行j列的圖像資料
            if img is None:
                continue
            imgs=np.array([img])
            # print(imgs.shape)
            s = np.argmax(model.predict(imgs)[0])
            res[i-int(size/2):i+int(size/2),j-int(size/2):j+int(size/2)]=label[s]
            print("testing: ",i,j)

    res = np.array([res[:,:,0],res[:,:,1],res[:,:,2]])

    #儲存标簽顔色對應
    label2Img(list(vec.keys()), label, "res/render_class2_label_%d_%d.png" % (size,step))

    cv2.imwrite("res/render_class2_%d_%d.png" % (size,step),res.T)#儲存結果圖檔      

标簽顔色對應函數如下:

def label2Img(str,colors,label_src):#存儲位置,顔色,标簽
    # print(str)
    res = np.ones((100, 100*len(str)+40, 3), np.uint8) * 255
    for i, t in enumerate(colors):
        # print(t)
        t = tuple([int(t[0]), int(t[1]), int(t[2])])
        startx = 10 + 100 * i  # 間隔100
        starty=20
        res = cv2.rectangle(res, (startx, starty), (startx + 90, starty+20), t, thickness=-1)
        res = cv2.putText(res, str[i], (startx, starty+10), 
                          fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.4,
                          color=(255,255,255),lineType=cv2.LINE_AA)
    cv2.imwrite(label_src, res)