microproduct/vegetationPhenology/featuresAndRoi.py

155 lines
6.2 KiB
Python
Raw Permalink Normal View History

2024-12-18 03:03:53 +00:00
import glob
import multiprocessing
import os
import cv2
from VegetationPhenologyAuxData import PhenoloyMeasCsv_geo
from tool.algorithm.image.ImageHandle import ImageHandler
from tool.algorithm.ml.machineLearning import MachineLeaning as ml, MachineLeaning
from tool.csv.csvHandle import csvHandle
from tool.algorithm.block.blockprocess import BlockProcess as bp, BlockProcess
import numpy as np
from tool.algorithm.algtools.PreProcess import PreProcess as pp
from tool.file.fileHandle import fileHandle
file = fileHandle()
csvh = csvHandle()
MAX_TRAN_NUM = 100000
def predict_VP(clf, X_test_list, out_tif_name, workspace_processing_path, rows, cols):
"""
预测数据
:param clf : svm模型
:return X_test_list: 分块测试集影像路径
"""
ml = MachineLeaning()
# 开启多进程处理
bp = BlockProcess()
block_size = bp.get_block_size(rows, cols)
name_d = out_tif_name + '_VTH'
block_features_dir = X_test_list
bp_cover_dir = os.path.join(workspace_processing_path, name_d,
'pre_result\\') # workspace_processing_path + out_tif_name + '\\'
file.creat_dirs([bp_cover_dir])
processes_num = min([len(block_features_dir), multiprocessing.cpu_count() - 7])
pool = multiprocessing.Pool(processes=processes_num)
for path, n in zip(block_features_dir, range(len(block_features_dir))):
name = os.path.split(path)[1]
band = ImageHandler.get_bands(path)
if band == 1:
features_array = np.zeros((1, block_size, block_size), dtype=float)
feature_array = ImageHandler.get_data(path)
features_array[0, :, :] = feature_array
else:
features_array = ImageHandler.get_data(path)
X_test = np.reshape(features_array, (features_array.shape[0], features_array[0].size)).T
suffix = '_' + name.split('_')[-4] + "_" + name.split('_')[-3] + "_" + name.split('_')[-2] + "_" + \
name.split('_')[-1]
img_path = os.path.join(bp_cover_dir, name_d + suffix) # bp_cover_dir + out_tif_name + suffix
row_begin = int(name.split('_')[-4])
col_begin = int(name.split('_')[-2])
pool.apply_async(ml.predict_blok, (
clf, X_test, block_size, block_size, img_path, row_begin, col_begin, len(block_features_dir), n))
# ml.predict_blok(clf, X_test, block_size, block_size, img_path, row_begin, col_begin, len(block_features_dir), n)
pool.close()
pool.join()
del pool
# 合并影像
data_dir = bp_cover_dir
out_path = workspace_processing_path[0:-1]
bp.combine(data_dir, cols, rows, out_path, file_type=['tif'], datetype='float32')
# 添加地理信息
cover_path = os.path.join(out_path,
name_d + ".tif") # workspace_processing_path + out_tif_name + ".tif"
# bp.assign_spatial_reference_byfile(self.__ref_img_path, cover_path)
return cover_path
def featuresRoi(featurePath, roi):
tif_dir = r"D:\BaiduNetdiskDownload\envi-result\cut_tif"
blockDir = r'D:\BaiduNetdiskDownload\envi-result\block'
pm = PhenoloyMeasCsv_geo(roi, featurePath, MAX_TRAN_NUM)
train_data_list = pm.api_read_measure_by_name('0')
train_data_dic = csvh.trans_landCover_list2dic(train_data_list)
rows = ImageHandler.get_img_height(featurePath)
cols = ImageHandler.get_img_width(featurePath)
im_proj, im_geo, im_data = ImageHandler.read_img(featurePath)
dim = ImageHandler.get_bands(featurePath)
X_train = np.empty(shape=(0, dim))
Y_train = np.empty(shape=(0, 1))
ids = train_data_dic['ids']
positions = train_data_dic['positions']
for id, points in zip(ids, positions):
# for data in train_data_list:
if points == []:
raise Exception('data is empty!')
row, col = zip(*points)
l = len(points)
X = np.empty(shape=(l, dim))
for n in range(dim):
feature_array = ImageHandler.get_band_array(featurePath, n+1)
feature_array[np.isnan(feature_array)] = 0 # 异常值填充为0
feature_array[np.where(feature_array == -9999)] = 0 # 异常值填充为0
x = feature_array[row, col].T
X[:, n] = x
Y = np.full((l, 1), id)
X_train = np.vstack((X_train, X))
Y_train = np.vstack((Y_train, Y))
Y_train = Y_train.T[0, :]
clf = ml.trainRF(X_train, Y_train)
bp().cut(tif_dir, blockDir, out_size=2048)
X_test_list = list(glob.glob(os.path.join(blockDir, '*.tif')))
product_path = predict_VP(clf, X_test_list, 'geo', blockDir, rows, cols)
proj, geo, cover_data = ImageHandler.read_img(product_path)
# 形态学闭运算去roi区域噪点
cover_data = np.uint8(cover_data)
kernel = np.ones((10, 10), np.uint8)
cover_data = cv2.erode(cv2.dilate(cover_data, kernel), kernel)
cover_data = np.int16(cover_data)
for id, class_id in zip(train_data_dic['ids'], train_data_dic['class_ids']):
cover_data[np.where(cover_data == id)] = class_id
# cover_data[np.where(im_data[0, :, :] == -9999)] = -9999
cover_geo_path = os.path.join(blockDir, os.path.basename(product_path).split('.tif')[0] + '-VPtemp.tif')
ImageHandler.write_img(cover_geo_path, im_proj, im_geo, cover_data, '-9999')
if __name__ == '__main__':
features = r"D:\micro\SWork\LandCover\Temporary\processing\features_geo\Freeman_Vol_geo.tif"
roi = r"F:\xibei_LandCover\landCoverSamples.csv"
featuresRoi(features, roi)
# oytTil = r"D:\BaiduNetdiskDownload\54Features_land.tif"
# outP = r"D:\BaiduNetdiskDownload\veg_landcover_re.tif"
# #
# im_proj, im_geotrans, im_arr = ImageHandler.read_img(features)
# _, _, land = ImageHandler.read_img(outP)
# # pp.resampling_by_scale(land, outP, features)
# for i in range(im_arr.shape[0]):
# im_arr[i, :, :][np.where(land==20)] = -9999
# im_arr[i, :, :][np.where(land==30)] = -9999
# im_arr[i, :, :][np.where(land==40)] = -9999
# im_arr[i, :, :][np.where(land==50)] = -9999
# im_arr[i, :, :][np.where(land==70)] = -9999
# im_arr[i, :, :][np.where(land==90)] = -9999
# im_arr[i, :, :][np.where(land==100)] = -9999
# ImageHandler.write_img(oytTil, im_proj, im_geotrans, im_arr, '-9999')
# print(11)