add history
change table layer
This commit is contained in:
parent
cb9a09f23d
commit
53bd8c22e9
5
plugins/ai_method/__init__.py
Normal file
5
plugins/ai_method/__init__.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from misc.utils import Register
|
||||||
|
|
||||||
|
AI_METHOD = Register('AI Method')
|
||||||
|
|
||||||
|
from .main import BasicPlugin
|
16
plugins/ai_method/main.py
Normal file
16
plugins/ai_method/main.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
from rscder.plugins.basic import BasicPlugin
|
||||||
|
from ai_method import AI_METHOD
|
||||||
|
|
||||||
|
|
||||||
|
class AIPlugin(BasicPlugin):
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def info():
|
||||||
|
return {
|
||||||
|
'name': 'AI 变化检测',
|
||||||
|
'author': 'RSC',
|
||||||
|
'version': '1.0.0',
|
||||||
|
'description': 'AI 变化检测',
|
||||||
|
'category': 'Ai method'
|
||||||
|
}
|
||||||
|
|
@ -43,8 +43,8 @@ class RateSetdialog(QDialog):
|
|||||||
self.cancel_button.clicked.connect(self.on_cancel)
|
self.cancel_button.clicked.connect(self.on_cancel)
|
||||||
self.cancel_button.setDefault(False)
|
self.cancel_button.setDefault(False)
|
||||||
self.buttonbox=QDialogButtonBox(self)
|
self.buttonbox=QDialogButtonBox(self)
|
||||||
self.buttonbox.addButton(self.ok_button,QDialogButtonBox.Ok)
|
self.buttonbox.addButton(self.ok_button,QDialogButtonBox.NoRole)
|
||||||
self.buttonbox.addButton(self.cancel_button,QDialogButtonBox.Cancel)
|
self.buttonbox.addButton(self.cancel_button,QDialogButtonBox.NoRole)
|
||||||
self.buttonbox.setCenterButtons(True)
|
self.buttonbox.setCenterButtons(True)
|
||||||
vlayout=QVBoxLayout()
|
vlayout=QVBoxLayout()
|
||||||
vlayout.addLayout(h1)
|
vlayout.addLayout(h1)
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
from misc import AlgFrontend
|
from misc import AlgFrontend
|
||||||
|
from misc.utils import format_now
|
||||||
from osgeo import gdal, gdal_array
|
from osgeo import gdal, gdal_array
|
||||||
from skimage.filters import rank
|
from skimage.filters import rank
|
||||||
from skimage.morphology import rectangle
|
from skimage.morphology import rectangle
|
||||||
@ -77,7 +78,7 @@ class MeanFilter(AlgFrontend):
|
|||||||
ds = gdal.Open(pth)
|
ds = gdal.Open(pth)
|
||||||
band_count = ds.RasterCount
|
band_count = ds.RasterCount
|
||||||
|
|
||||||
out_path = os.path.join(Project().other_path, 'mean_filter_{}.tif'.format(int(datetime.now().timestamp() * 1000)))
|
out_path = os.path.join(Project().other_path, 'mean_filter_{}.tif'.format(format_now()))
|
||||||
out_ds = gdal.GetDriverByName('GTiff').Create(out_path, ds.RasterXSize, ds.RasterYSize, band_count, ds.GetRasterBand(1).DataType)
|
out_ds = gdal.GetDriverByName('GTiff').Create(out_path, ds.RasterXSize, ds.RasterYSize, band_count, ds.GetRasterBand(1).DataType)
|
||||||
out_ds.SetProjection(ds.GetProjection())
|
out_ds.SetProjection(ds.GetProjection())
|
||||||
out_ds.SetGeoTransform(ds.GetGeoTransform())
|
out_ds.SetGeoTransform(ds.GetGeoTransform())
|
||||||
|
@ -8,7 +8,7 @@ from rscder.utils.project import BasicLayer, ResultPointLayer
|
|||||||
from misc.utils import format_now
|
from misc.utils import format_now
|
||||||
|
|
||||||
def table_layer(pth:str,layer:BasicLayer, name, cdpath=None,
|
def table_layer(pth:str,layer:BasicLayer, name, cdpath=None,
|
||||||
th=0, method_info=dict(), send_message = None):
|
th=0, method_info:dict=dict(), send_message = None):
|
||||||
if send_message is not None:
|
if send_message is not None:
|
||||||
send_message.emit('正在计算表格结果...')
|
send_message.emit('正在计算表格结果...')
|
||||||
cell_size = layer.layer_parent.cell_size
|
cell_size = layer.layer_parent.cell_size
|
||||||
@ -17,7 +17,7 @@ def table_layer(pth:str,layer:BasicLayer, name, cdpath=None,
|
|||||||
ysize = ds.RasterYSize
|
ysize = ds.RasterYSize
|
||||||
geo = ds.GetGeoTransform()
|
geo = ds.GetGeoTransform()
|
||||||
|
|
||||||
out_csv = os.path.join(Project().other_path, f'{name}_table_result_{ format_now() }.csv')
|
out_csv = os.path.join(Project().other_path, f'{name}_{ "_".join(method_info.values()) }_{ format_now() }.csv')
|
||||||
yblocks = ysize // cell_size[1] + 1
|
yblocks = ysize // cell_size[1] + 1
|
||||||
xblocks = xsize // cell_size[0] + 1
|
xblocks = xsize // cell_size[0] + 1
|
||||||
with open(out_csv, 'w') as f:
|
with open(out_csv, 'w') as f:
|
||||||
|
@ -6,7 +6,7 @@ import datetime
|
|||||||
|
|
||||||
def format_now():
|
def format_now():
|
||||||
|
|
||||||
datetime.datetime.now().strftime('')
|
return datetime.datetime.now().strftime('%Y_%m_%d_%H_%M_%S')
|
||||||
|
|
||||||
class Register:
|
class Register:
|
||||||
|
|
||||||
|
@ -232,8 +232,6 @@ class UnsupervisedPlugin(BasicPlugin):
|
|||||||
pth1 = falg.run_alg(pth1, name=name, send_message=self.send_message, **fparams)
|
pth1 = falg.run_alg(pth1, name=name, send_message=self.send_message, **fparams)
|
||||||
pth2 = falg.run_alg(pth2, name=name, send_message=self.send_message, **fparams)
|
pth2 = falg.run_alg(pth2, name=name, send_message=self.send_message, **fparams)
|
||||||
method_info['滤波算法'] = falg.get_name()
|
method_info['滤波算法'] = falg.get_name()
|
||||||
else:
|
|
||||||
method_info['滤波算法'] = '无'
|
|
||||||
|
|
||||||
cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent, send_message=self.send_message,**cdparams)
|
cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent, send_message=self.send_message,**cdparams)
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ from .scripts import VEG_CD
|
|||||||
from thres import THRES
|
from thres import THRES
|
||||||
from misc import table_layer, AlgSelectWidget
|
from misc import table_layer, AlgSelectWidget
|
||||||
from follow import FOLLOW
|
from follow import FOLLOW
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
class VegtationCDMethod(QDialog):
|
class VegtationCDMethod(QDialog):
|
||||||
@ -149,19 +150,41 @@ class VegetationCDFollow(AlgFrontend):
|
|||||||
return
|
return
|
||||||
|
|
||||||
name = layer1.name
|
name = layer1.name
|
||||||
|
method_info = dict()
|
||||||
|
|
||||||
if falg is not None:
|
if falg is not None:
|
||||||
pth1 = falg.run_alg(
|
pth1 = falg.run_alg(
|
||||||
pth1, name=name, send_message=send_message, **fparams)
|
pth1, name=name, send_message=send_message, **fparams)
|
||||||
pth2 = falg.run_alg(
|
pth2 = falg.run_alg(
|
||||||
pth2, name=name, send_message=send_message, **fparams)
|
pth2, name=name, send_message=send_message, **fparams)
|
||||||
|
method_info['滤波算法'] = falg.get_name()
|
||||||
|
if falg is not None:
|
||||||
|
try:
|
||||||
|
os.remove(pth1)
|
||||||
|
os.remove(pth2)
|
||||||
|
# send_message.emit('删除临时文件')
|
||||||
|
except:
|
||||||
|
# send_message.emit('删除临时文件失败!')
|
||||||
|
pass
|
||||||
cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent,
|
cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent,
|
||||||
send_message=send_message, **cdparams)
|
send_message=send_message, **cdparams)
|
||||||
thpth = thalg.run_alg(
|
if falg is not None:
|
||||||
|
try:
|
||||||
|
os.remove(pth1)
|
||||||
|
os.remove(pth2)
|
||||||
|
# send_message.emit('删除临时文件')
|
||||||
|
except:
|
||||||
|
# send_message.emit('删除临时文件失败!')
|
||||||
|
pass
|
||||||
|
if cdpth is None:
|
||||||
|
return
|
||||||
|
thpth, th = thalg.run_alg(
|
||||||
cdpth, name=name, send_message=send_message, **thparams)
|
cdpth, name=name, send_message=send_message, **thparams)
|
||||||
|
method_info['变化检测算法'] = cdalg.get_name()
|
||||||
table_layer(thpth, layer1, name, send_message)
|
method_info['二值化算法'] = thalg.get_name()
|
||||||
|
# table_layer(thpth, layer1, name, send_message)
|
||||||
|
table_layer(thpth, layer1, name, cdpath=cdpth, th=th,
|
||||||
|
method_info=method_info, send_message=send_message)
|
||||||
|
|
||||||
|
|
||||||
class VegtationPlugin(BasicPlugin):
|
class VegtationPlugin(BasicPlugin):
|
||||||
@ -177,6 +200,7 @@ class VegtationPlugin(BasicPlugin):
|
|||||||
|
|
||||||
def set_action(self):
|
def set_action(self):
|
||||||
veg_menu = ActionManager().veg_menu
|
veg_menu = ActionManager().veg_menu
|
||||||
|
veg_toolbar = ActionManager().add_toolbar('Veg Change')
|
||||||
# veg_menu.setIcon(IconInstance().UNSUPERVISED)
|
# veg_menu.setIcon(IconInstance().UNSUPERVISED)
|
||||||
# ActionManager().veg_menu.addMenu(veg_menu)
|
# ActionManager().veg_menu.addMenu(veg_menu)
|
||||||
|
|
||||||
@ -187,10 +211,11 @@ class VegtationPlugin(BasicPlugin):
|
|||||||
else:
|
else:
|
||||||
name = alg.get_name()
|
name = alg.get_name()
|
||||||
|
|
||||||
|
|
||||||
action = QAction(name, veg_menu)
|
action = QAction(name, veg_menu)
|
||||||
func = partial(self.run_cd, alg)
|
func = partial(self.run_cd, alg)
|
||||||
action.triggered.connect(func)
|
action.triggered.connect(func)
|
||||||
|
veg_toolbar.addAction(action)
|
||||||
veg_menu.addAction(action)
|
veg_menu.addAction(action)
|
||||||
|
|
||||||
def run_cd(self, alg):
|
def run_cd(self, alg):
|
||||||
@ -210,21 +235,36 @@ class VegtationPlugin(BasicPlugin):
|
|||||||
|
|
||||||
falg, fparams = w.filter_select.get_alg_and_params()
|
falg, fparams = w.filter_select.get_alg_and_params()
|
||||||
cdalg = w.alg
|
cdalg = w.alg
|
||||||
cdparams = w.alg.get_params()
|
cdparams = w.alg.get_params(w.param_widget)
|
||||||
thalg, thparams = w.thres_select.get_alg_and_params()
|
thalg, thparams = w.thres_select.get_alg_and_params()
|
||||||
|
|
||||||
if cdalg is None or thalg is None:
|
if cdalg is None or thalg is None:
|
||||||
return
|
return
|
||||||
|
method_info = dict()
|
||||||
|
|
||||||
if falg is not None:
|
if falg is not None:
|
||||||
pth1 = falg.run_alg(
|
pth1 = falg.run_alg(
|
||||||
pth1, name=name, send_message=self.send_message, **fparams)
|
pth1, name=name, send_message=self.send_message, **fparams)
|
||||||
pth2 = falg.run_alg(
|
pth2 = falg.run_alg(
|
||||||
pth2, name=name, send_message=self.send_message, **fparams)
|
pth2, name=name, send_message=self.send_message, **fparams)
|
||||||
|
method_info['滤波算法'] = falg.get_name()
|
||||||
|
|
||||||
cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent,
|
cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent,
|
||||||
send_message=self.send_message, **cdparams)
|
send_message=self.send_message, **cdparams)
|
||||||
thpth = thalg.run_alg(
|
if cdpth is None:
|
||||||
|
return
|
||||||
|
if falg is not None:
|
||||||
|
try:
|
||||||
|
os.remove(pth1)
|
||||||
|
os.remove(pth2)
|
||||||
|
# send_message.emit('删除临时文件')
|
||||||
|
except:
|
||||||
|
# send_message.emit('删除临时文件失败!')
|
||||||
|
pass
|
||||||
|
thpth, th = thalg.run_alg(
|
||||||
cdpth, name=name, send_message=self.send_message, **thparams)
|
cdpth, name=name, send_message=self.send_message, **thparams)
|
||||||
|
method_info['变化检测算法'] = cdalg.get_name()
|
||||||
table_layer(thpth, layer1, name, self.send_message)
|
method_info['二值化算法'] = thalg.get_name()
|
||||||
|
# table_layer(thpth, layer1, name, self.send_message)
|
||||||
|
table_layer(thpth, layer1, name, cdpath=cdpth, th=th,
|
||||||
|
method_info=method_info, send_message=self.send_message)
|
||||||
|
@ -100,7 +100,7 @@ class VFCCD(AlgFrontend):
|
|||||||
|
|
||||||
max_diff = 0
|
max_diff = 0
|
||||||
min_diff = math.inf
|
min_diff = math.inf
|
||||||
|
# print('xxxxxxxxx')
|
||||||
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
|
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
|
||||||
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
|
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
|
||||||
|
|
||||||
@ -124,19 +124,25 @@ class VFCCD(AlgFrontend):
|
|||||||
block_size1 = (xsize,end1y - block_xy1[1])
|
block_size1 = (xsize,end1y - block_xy1[1])
|
||||||
if block_xy2[1] + block_size2[1] > end2y:
|
if block_xy2[1] + block_size2[1] > end2y:
|
||||||
block_size2 = (xsize, end2y - block_xy2[1])
|
block_size2 = (xsize, end2y - block_xy2[1])
|
||||||
|
|
||||||
|
if block_size1[0] * block_size1[1] == 0 or block_size2[0] * block_size2[1] == 0:
|
||||||
|
continue
|
||||||
block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
|
block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
|
||||||
block_data2 = ds2.ReadAsArray(*block_xy2, *block_size2)
|
block_data2 = ds2.ReadAsArray(*block_xy2, *block_size2)
|
||||||
ndvi1 = (block_data1[nir] - block_data1[red])/((block_data1[nir] + block_data1[red]) + 1e-6)
|
ndvi1 = (block_data1[nir] - block_data1[red])/((block_data1[nir] + block_data1[red]) + 1e-6)
|
||||||
ndvi2 = (block_data2[nir] - block_data2[red])/((block_data2[nir] + block_data2[red]) + 1e-6)
|
ndvi2 = (block_data2[nir] - block_data2[red])/((block_data2[nir] + block_data2[red]) + 1e-6)
|
||||||
ndvi1[ndvi1 < 0] = 0
|
ndvi1[ndvi1 < 0] = 0
|
||||||
|
ndvi1[ndvi1 > 1] = 1
|
||||||
|
ndvi2[ndvi2 > 1] = 1
|
||||||
ndvi2[ndvi2 < 0] = 0
|
ndvi2[ndvi2 < 0] = 0
|
||||||
# pdb.set_trace()
|
# pdb.set_trace()
|
||||||
block_diff = ndvi1 - ndvi2
|
block_diff = ndvi1 - ndvi2
|
||||||
block_diff = block_diff.astype(np.float32)
|
block_diff = block_diff.astype(np.float32)
|
||||||
block_diff = np.abs(block_diff)
|
block_diff = np.abs(block_diff)
|
||||||
|
|
||||||
|
|
||||||
min_diff = min(min_diff, block_diff[block_diff > 0].min())
|
min_diff = min(min_diff, block_diff[block_diff > 0].min())
|
||||||
max_diff = max(max_diff, block_diff.max())
|
max_diff = max(max_diff, block_diff[block_diff <= 1].max())
|
||||||
out_ds.GetRasterBand(1).WriteArray(block_diff, *block_xy)
|
out_ds.GetRasterBand(1).WriteArray(block_diff, *block_xy)
|
||||||
if send_message is not None:
|
if send_message is not None:
|
||||||
|
|
||||||
@ -147,6 +153,8 @@ class VFCCD(AlgFrontend):
|
|||||||
del out_ds
|
del out_ds
|
||||||
if send_message is not None:
|
if send_message is not None:
|
||||||
send_message.emit('归一化概率中...')
|
send_message.emit('归一化概率中...')
|
||||||
|
send_message.emit(f'max pixel {max_diff}')
|
||||||
|
send_message.emit(f'min pixel {min_diff}')
|
||||||
temp_in_ds = gdal.Open(out_tif)
|
temp_in_ds = gdal.Open(out_tif)
|
||||||
|
|
||||||
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000)))
|
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000)))
|
||||||
|
@ -106,7 +106,7 @@ class ActionManager(QtCore.QObject):
|
|||||||
if path is not None:
|
if path is not None:
|
||||||
Settings.General().history = path
|
Settings.General().history = path
|
||||||
history = Settings.General().history
|
history = Settings.General().history
|
||||||
print(history)
|
# print(history)
|
||||||
def reopen(p):
|
def reopen(p):
|
||||||
if Project().is_init:
|
if Project().is_init:
|
||||||
Project().save()
|
Project().save()
|
||||||
|
@ -92,7 +92,7 @@ class Settings(QSettings):
|
|||||||
|
|
||||||
@history.setter
|
@history.setter
|
||||||
def history(self, v:str):
|
def history(self, v:str):
|
||||||
print(v)
|
# print(v)
|
||||||
with Settings(Settings.General.PRE) as s:
|
with Settings(Settings.General.PRE) as s:
|
||||||
history:list = s.value('history', [])
|
history:list = s.value('history', [])
|
||||||
if v in history:
|
if v in history:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user