增加移动阈值设置
This commit is contained in:
parent
d358a7009b
commit
b6a31e2e53
@ -211,7 +211,8 @@ class InOnePlugin(BasicPlugin):
|
|||||||
def set_action(self):
|
def set_action(self):
|
||||||
|
|
||||||
basic_diff_method_in_one = QAction('总流程')
|
basic_diff_method_in_one = QAction('总流程')
|
||||||
ActionManager().change_detection_menu.addAction(basic_diff_method_in_one)
|
# ActionManager().change_detection_menu.addAction(basic_diff_method_in_one)
|
||||||
|
ActionManager().unsupervised_menu.addAction(basic_diff_method_in_one)
|
||||||
self.basic_diff_method_in_one = basic_diff_method_in_one
|
self.basic_diff_method_in_one = basic_diff_method_in_one
|
||||||
basic_diff_method_in_one.triggered.connect(self.run)
|
basic_diff_method_in_one.triggered.connect(self.run)
|
||||||
|
|
||||||
@ -224,6 +225,7 @@ class InOnePlugin(BasicPlugin):
|
|||||||
t.start()
|
t.start()
|
||||||
|
|
||||||
def run_alg(self,w:AllInOne):
|
def run_alg(self,w:AllInOne):
|
||||||
|
dict={}
|
||||||
layer1=w.layer_combox.layer1
|
layer1=w.layer_combox.layer1
|
||||||
layer2=w.layer_combox.layer2
|
layer2=w.layer_combox.layer2
|
||||||
if not layer1.compare(layer2):
|
if not layer1.compare(layer2):
|
||||||
@ -246,6 +248,7 @@ class InOnePlugin(BasicPlugin):
|
|||||||
if w.cd_select.choose==self.cd[0]:
|
if w.cd_select.choose==self.cd[0]:
|
||||||
cdpth=basic_cd(pth1,pth2,w.layer_combox.layer1.layer_parent,self.send_message)
|
cdpth=basic_cd(pth1,pth2,w.layer_combox.layer1.layer_parent,self.send_message)
|
||||||
name += '_basic_cd'
|
name += '_basic_cd'
|
||||||
|
#dict[name]=cdpth
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -253,12 +256,14 @@ class InOnePlugin(BasicPlugin):
|
|||||||
if w.threshold_select.choose==self.threshold[0]:
|
if w.threshold_select.choose==self.threshold[0]:
|
||||||
thpth=otsu(cdpth,w.layer_combox.layer1.layer_parent.name,self.send_message)
|
thpth=otsu(cdpth,w.layer_combox.layer1.layer_parent.name,self.send_message)
|
||||||
name+='_otsu'
|
name+='_otsu'
|
||||||
|
dict[name]=thpth
|
||||||
elif w.threshold_select.choose=='手动阈值':
|
elif w.threshold_select.choose=='手动阈值':
|
||||||
thpth=thresh(cdpth,float(w.threshold_input.text()),w.layer_combox.layer1.layer_parent.name,self.send_message)
|
thpth=thresh(cdpth,float(w.threshold_input.text()),w.layer_combox.layer1.layer_parent.name,self.send_message)
|
||||||
|
dict[name+'_thresh_{:.1f}'.format(float(w.threshold_input.text()))]
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
table_layer(thpth,layer1,name,self.send_message)
|
table_layer(thpth,layer1,name,self.send_message,dict)
|
||||||
|
|
||||||
def Meanfilter(x_size,y_size,layer:RasterLayer):
|
def Meanfilter(x_size,y_size,layer:RasterLayer):
|
||||||
x_size = int(x_size)
|
x_size = int(x_size)
|
||||||
@ -459,7 +464,7 @@ def thresh(pth,gap,name,send_message):
|
|||||||
#otsu_layer = SingleBandRasterLayer(path = out_th, style_info={})
|
#otsu_layer = SingleBandRasterLayer(path = out_th, style_info={})
|
||||||
#layer.layer_parent.add_result_layer(otsu_layer)
|
#layer.layer_parent.add_result_layer(otsu_layer)
|
||||||
|
|
||||||
def table_layer(pth,layer,name,send_message):
|
def table_layer(pth,layer,name,send_message,dict):
|
||||||
send_message.emit('正在计算表格结果...')
|
send_message.emit('正在计算表格结果...')
|
||||||
cell_size = layer.layer_parent.cell_size
|
cell_size = layer.layer_parent.cell_size
|
||||||
ds = gdal.Open(pth)
|
ds = gdal.Open(pth)
|
||||||
@ -484,13 +489,15 @@ def table_layer(pth,layer,name,send_message):
|
|||||||
if end_x > xsize:
|
if end_x > xsize:
|
||||||
end_x = xsize
|
end_x = xsize
|
||||||
block_data_xy = block_data[:, start_x:end_x]
|
block_data_xy = block_data[:, start_x:end_x]
|
||||||
if block_data_xy.mean() > 0.5:
|
|
||||||
center_x = start_x + cell_size[0] // 2
|
center_x = start_x + cell_size[0] // 2
|
||||||
center_y = j * cell_size[1] + cell_size[1] // 2
|
center_y = j * cell_size[1] + cell_size[1] // 2
|
||||||
center_x = center_x * geo[1] + geo [0]
|
center_x = center_x * geo[1] + geo [0]
|
||||||
center_y = center_y * geo[5] + geo [3]
|
center_y = center_y * geo[5] + geo [3]
|
||||||
f.write(f'{center_x},{center_y},{block_data_xy.mean() * 100},1\n')
|
f.write(f'{center_x},{center_y},{block_data_xy.mean() * 100},{int(block_data_xy.mean() > 0.5)}\n')
|
||||||
|
|
||||||
result_layer = ResultPointLayer(out_csv, enable=True, proj=layer.proj, geo=layer.geo)
|
result_layer = ResultPointLayer(out_csv, enable=True, proj=layer.proj, geo=layer.geo)
|
||||||
|
result_layer.result_path=dict
|
||||||
|
print(result_layer.result_path)
|
||||||
layer.layer_parent.add_result_layer(result_layer)
|
layer.layer_parent.add_result_layer(result_layer)
|
||||||
send_message.emit('计算完成')
|
send_message.emit('计算完成')
|
1
plugins/change_rate/__init__.py
Normal file
1
plugins/change_rate/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
from change_rate.main import *
|
99
plugins/change_rate/main.py
Normal file
99
plugins/change_rate/main.py
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
import os
|
||||||
|
from threading import Thread
|
||||||
|
from rscder.gui.actions import ActionManager
|
||||||
|
from rscder.gui.layercombox import ResultPointLayerCombox
|
||||||
|
from rscder.plugins.basic import BasicPlugin
|
||||||
|
from PyQt5.QtWidgets import QAction, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton,QSlider,QSpinBox,QSpacerItem
|
||||||
|
from PyQt5.QtCore import pyqtSignal,Qt
|
||||||
|
from PyQt5.QtGui import QIcon
|
||||||
|
from rscder.utils.icons import IconInstance
|
||||||
|
from rscder.utils.project import Project, ResultPointLayer, SingleBandRasterLayer
|
||||||
|
import numpy as np
|
||||||
|
class RateSetdialog(QDialog):
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
super(RateSetdialog,self).__init__(parent)
|
||||||
|
self.setWindowTitle('设置变化阈值')
|
||||||
|
self.setWindowIcon(IconInstance().LOGO)
|
||||||
|
|
||||||
|
self.layer_select = ResultPointLayerCombox(self)
|
||||||
|
self.slider=QSlider(Qt.Horizontal)
|
||||||
|
self.spin=QSpinBox()
|
||||||
|
|
||||||
|
h1=QHBoxLayout()
|
||||||
|
h1.addWidget(QLabel('表格结果:'))
|
||||||
|
h1.addWidget(self.layer_select)
|
||||||
|
|
||||||
|
h2=QHBoxLayout()
|
||||||
|
|
||||||
|
|
||||||
|
self.slider.valueChanged.connect(self.spin.setValue)#valueChanged当值与原来不同是发射
|
||||||
|
self.spin.valueChanged.connect(self.slider.setValue)
|
||||||
|
|
||||||
|
h2.addItem(QSpacerItem(10,0))
|
||||||
|
h2.addWidget(self.slider)
|
||||||
|
h2.addWidget(self.spin)
|
||||||
|
h2.addItem(QSpacerItem(10,0))
|
||||||
|
self.ok_button = QPushButton('确定', self)
|
||||||
|
self.ok_button.setIcon(IconInstance().OK)
|
||||||
|
self.ok_button.clicked.connect(self.on_ok)
|
||||||
|
|
||||||
|
self.cancel_button = QPushButton('取消', self)
|
||||||
|
self.cancel_button.setIcon(IconInstance().CANCEL)
|
||||||
|
self.cancel_button.clicked.connect(self.on_cancel)
|
||||||
|
|
||||||
|
self.button_layout = QHBoxLayout()
|
||||||
|
self.button_layout.addWidget(self.ok_button)
|
||||||
|
self.button_layout.addWidget(self.cancel_button)
|
||||||
|
vlayout=QVBoxLayout()
|
||||||
|
vlayout.addLayout(h1)
|
||||||
|
vlayout.addWidget(QLabel('设置阈值'))
|
||||||
|
vlayout.addLayout(h2)
|
||||||
|
vlayout.addLayout(self.button_layout)
|
||||||
|
self.setLayout(vlayout)
|
||||||
|
|
||||||
|
def on_ok(self):
|
||||||
|
self.accept()
|
||||||
|
|
||||||
|
def on_cancel(self):
|
||||||
|
self.reject()
|
||||||
|
|
||||||
|
class RateSetPlugin(BasicPlugin):
|
||||||
|
current_layer=None
|
||||||
|
@staticmethod
|
||||||
|
def info():
|
||||||
|
return {
|
||||||
|
'name': 'set_change_rate',
|
||||||
|
'description': 'set_change_rate',
|
||||||
|
'author': 'RSCDER',
|
||||||
|
'version': '1.0.0',
|
||||||
|
}
|
||||||
|
|
||||||
|
def set_action(self):
|
||||||
|
self.action = QAction(IconInstance().VECTOR, '变化阈值设定', self.mainwindow)
|
||||||
|
self.action.triggered.connect(self.show_dialog)
|
||||||
|
ActionManager().position_menu.addAction(self.action)
|
||||||
|
|
||||||
|
def show_dialog(self):
|
||||||
|
dialog=RateSetdialog(self.mainwindow)
|
||||||
|
dialog.layer_select.currentIndexChanged.connect(lambda index: self.currentLayer(dialog.layer_select.itemData(index) if index>0 else None))
|
||||||
|
dialog.slider.valueChanged.connect(lambda input:self.setrate(input))
|
||||||
|
dialog.setModal(False)
|
||||||
|
dialog.show()
|
||||||
|
def currentLayer(self,layer):
|
||||||
|
self.current_layer=layer
|
||||||
|
|
||||||
|
|
||||||
|
def setrate(self,input:int):
|
||||||
|
layer=self.current_layer
|
||||||
|
# print(layer.__class__)
|
||||||
|
if not isinstance(layer,ResultPointLayer):
|
||||||
|
return
|
||||||
|
data=layer.data.copy()
|
||||||
|
# print(input)
|
||||||
|
data[np.where(data[:,-2]<(input)),-1]=0
|
||||||
|
data[np.where(data[:,-2]>(input)),-1]=1
|
||||||
|
layer.data=data
|
||||||
|
layer.update_point_layer(-1)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -6,7 +6,7 @@ from threading import Thread
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
from rscder.gui.actions import ActionManager
|
from rscder.gui.actions import ActionManager
|
||||||
from rscder.plugins.basic import BasicPlugin
|
from rscder.plugins.basic import BasicPlugin
|
||||||
from rscder.gui.layercombox import RasterLayerCombox
|
from rscder.gui.layercombox import RasterLayerCombox,ResultLayercombox
|
||||||
from PyQt5.QtWidgets import QAction, QFileDialog, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton
|
from PyQt5.QtWidgets import QAction, QFileDialog, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton
|
||||||
from PyQt5.QtGui import QIcon
|
from PyQt5.QtGui import QIcon
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
@ -30,7 +30,7 @@ class EvalutationDialog(QDialog):
|
|||||||
self.setWindowTitle('精度评估')
|
self.setWindowTitle('精度评估')
|
||||||
self.setWindowIcon(IconInstance().LOGO)
|
self.setWindowIcon(IconInstance().LOGO)
|
||||||
|
|
||||||
self.layer_select = RasterLayerCombox(self)
|
self.layer_select = ResultLayercombox(self)
|
||||||
self.gt_file = None
|
self.gt_file = None
|
||||||
|
|
||||||
gt_file_select_label = QLabel('真值文件:')
|
gt_file_select_label = QLabel('真值文件:')
|
||||||
@ -42,7 +42,7 @@ class EvalutationDialog(QDialog):
|
|||||||
hbox1.addWidget(self.gt_file_select)
|
hbox1.addWidget(self.gt_file_select)
|
||||||
|
|
||||||
hbox2 = QHBoxLayout()
|
hbox2 = QHBoxLayout()
|
||||||
hbox2.addWidget(QLabel('二值化结果图层:'))
|
# hbox2.addWidget(QLabel('二值化结果图层:'))
|
||||||
hbox2.addWidget(self.layer_select)
|
hbox2.addWidget(self.layer_select)
|
||||||
|
|
||||||
self.ok_button = QPushButton('确定', self)
|
self.ok_button = QPushButton('确定', self)
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
- author: RSCDER
|
- author: RSCDER
|
||||||
description: BasicMethod
|
description: BasicMethod
|
||||||
enabled: true
|
enabled: false
|
||||||
module: basic_change
|
module: basic_change
|
||||||
name: BasicMethod
|
name: BasicMethod
|
||||||
path: ./plugin\basic_change
|
path: ./plugin\basic_change
|
||||||
@ -28,7 +28,7 @@
|
|||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
- author: RSCDER
|
- author: RSCDER
|
||||||
description: OTSU
|
description: OTSU
|
||||||
enabled: true
|
enabled: false
|
||||||
module: threshold
|
module: threshold
|
||||||
name: OTSU
|
name: OTSU
|
||||||
path: ./plugin\threshold
|
path: ./plugin\threshold
|
||||||
@ -51,6 +51,13 @@
|
|||||||
description: AllinOne
|
description: AllinOne
|
||||||
enabled: true
|
enabled: true
|
||||||
module: In_one
|
module: In_one
|
||||||
name: AllinOne
|
name: basic_diff_AllinOne
|
||||||
path: ./plugin\In_one
|
path: ./plugin\In_one
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
|
- author: RSCDER
|
||||||
|
description: set Change Rate
|
||||||
|
enabled: true
|
||||||
|
module: change_rate
|
||||||
|
name: set_change_rate
|
||||||
|
path: ./plugin\change_rate
|
||||||
|
version: 1.0.0
|
@ -1,7 +1,7 @@
|
|||||||
import os
|
import os
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
from rscder.gui.actions import ActionManager
|
from rscder.gui.actions import ActionManager
|
||||||
from rscder.gui.layercombox import RasterLayerCombox, ResultPointLayerCombox
|
from rscder.gui.layercombox import RasterLayerCombox, ResultLayercombox
|
||||||
from rscder.plugins.basic import BasicPlugin
|
from rscder.plugins.basic import BasicPlugin
|
||||||
from PyQt5.QtWidgets import QAction, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton
|
from PyQt5.QtWidgets import QAction, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton
|
||||||
from PyQt5.QtCore import pyqtSignal
|
from PyQt5.QtCore import pyqtSignal
|
||||||
@ -18,7 +18,7 @@ class TableResultDialog(QDialog):
|
|||||||
self.setWindowTitle('表格结果')
|
self.setWindowTitle('表格结果')
|
||||||
self.setWindowIcon(IconInstance().LOGO)
|
self.setWindowIcon(IconInstance().LOGO)
|
||||||
|
|
||||||
self.layer_select = RasterLayerCombox(self)
|
self.layer_select = ResultLayercombox(self)
|
||||||
hbox = QHBoxLayout()
|
hbox = QHBoxLayout()
|
||||||
hbox.addWidget(QLabel('二值化结果图层:'))
|
hbox.addWidget(QLabel('二值化结果图层:'))
|
||||||
hbox.addWidget(self.layer_select)
|
hbox.addWidget(self.layer_select)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
from PyQt5.QtWidgets import QComboBox, QWidget, QLabel, QHBoxLayout, QVBoxLayout
|
from PyQt5.QtWidgets import QComboBox, QWidget, QLabel, QHBoxLayout, QVBoxLayout
|
||||||
from PyQt5.QtGui import QIcon
|
from PyQt5.QtGui import QIcon
|
||||||
from rscder.utils.icons import IconInstance
|
from rscder.utils.icons import IconInstance
|
||||||
from rscder.utils.project import PairLayer, Project, RasterLayer, ResultPointLayer
|
from rscder.utils.project import PairLayer, Project, RasterLayer, ResultPointLayer,SingleBandRasterLayer
|
||||||
class LayerCombox(QComboBox):
|
class LayerCombox(QComboBox):
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
@ -139,3 +139,55 @@ class ResultPointLayerCombox(QComboBox):
|
|||||||
else:
|
else:
|
||||||
self.current_layer = self.itemData(index)
|
self.current_layer = self.itemData(index)
|
||||||
|
|
||||||
|
class ResultLayercombox(QWidget):
|
||||||
|
|
||||||
|
def __init__(self, parent=None) -> None:
|
||||||
|
super().__init__(parent)
|
||||||
|
self.current_layer = None
|
||||||
|
|
||||||
|
self.initUI()
|
||||||
|
|
||||||
|
def initUI(self):
|
||||||
|
self.layer_combox = LayerCombox(self)
|
||||||
|
layer_label = QLabel('图层组:')
|
||||||
|
|
||||||
|
hbox = QHBoxLayout()
|
||||||
|
hbox.addWidget(layer_label)
|
||||||
|
hbox.addWidget(self.layer_combox)
|
||||||
|
|
||||||
|
self.raster_layer1 = QComboBox(self)
|
||||||
|
self.raster_layer1.addItem('---', None)
|
||||||
|
|
||||||
|
self.raster_layer1.currentIndexChanged.connect(self.on_raster_layer1_changed)
|
||||||
|
self.layer_combox.currentIndexChanged.connect(self.on_group_changed)
|
||||||
|
|
||||||
|
hbox1 = QHBoxLayout()
|
||||||
|
hbox1.addWidget(QLabel('二值化结果:'))
|
||||||
|
hbox1.addWidget(self.raster_layer1)
|
||||||
|
|
||||||
|
|
||||||
|
vbox = QVBoxLayout()
|
||||||
|
vbox.addLayout(hbox)
|
||||||
|
vbox.addLayout(hbox1)
|
||||||
|
|
||||||
|
|
||||||
|
self.setLayout(vbox)
|
||||||
|
|
||||||
|
def on_raster_layer1_changed(self, index):
|
||||||
|
if index == 0:
|
||||||
|
self.current_layer = None
|
||||||
|
else:
|
||||||
|
self.current_layer = self.raster_layer1.itemData(index)
|
||||||
|
|
||||||
|
|
||||||
|
def on_group_changed(self, index):
|
||||||
|
if index == 0:
|
||||||
|
self.raster_layer1.clear()
|
||||||
|
self.raster_layer1.addItem('---', None)
|
||||||
|
else:
|
||||||
|
self.raster_layer1.clear()
|
||||||
|
self.raster_layer1.addItem('---', None)
|
||||||
|
for l in self.layer_combox.current_layer.layers:
|
||||||
|
if isinstance(l,ResultPointLayer):
|
||||||
|
for k,v in l.result_path.items():
|
||||||
|
self.raster_layer1.addItem(IconInstance().RASTER,k,SingleBandRasterLayer(path = v, style_info={}))
|
||||||
|
@ -461,14 +461,15 @@ class VectorLayer(BasicLayer):
|
|||||||
|
|
||||||
class ResultPointLayer(BasicLayer):
|
class ResultPointLayer(BasicLayer):
|
||||||
|
|
||||||
def __init__(self, path, name=None, enable = False, proj = None, geo = None):
|
def __init__(self, path, name=None, enable = False, proj = None, geo = None,result_path={},dsort=True ):
|
||||||
if name is None:
|
if name is None:
|
||||||
name = os.path.splitext(os.path.basename(path))[0]
|
name = os.path.splitext(os.path.basename(path))[0]
|
||||||
super().__init__(name, enable, icon=IconInstance().VECTOR, path=path, path_mode = BasicLayer.IN_FILE, view_mode=BasicLayer.BOATH_VIEW )
|
super().__init__(name, enable, icon=IconInstance().VECTOR, path=path, path_mode = BasicLayer.IN_FILE, view_mode=BasicLayer.BOATH_VIEW )
|
||||||
self.data = None
|
self.data = None
|
||||||
self.wkt = proj
|
self.wkt = proj
|
||||||
self.geo = geo
|
self.geo = geo
|
||||||
|
self.dsort=dsort
|
||||||
|
self.result_path=result_path
|
||||||
self.load_point_file()
|
self.load_point_file()
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
@ -526,6 +527,10 @@ class ResultPointLayer(BasicLayer):
|
|||||||
data = np.loadtxt(self.path, delimiter=',', skiprows=1)
|
data = np.loadtxt(self.path, delimiter=',', skiprows=1)
|
||||||
if data is None:
|
if data is None:
|
||||||
return
|
return
|
||||||
|
if self.dsort:
|
||||||
|
data=data[data[:,-2].argsort()]
|
||||||
|
else:
|
||||||
|
data=data[-(data[:,-2]).argsort()]
|
||||||
self.data = data
|
self.data = data
|
||||||
self.make_point_layer()
|
self.make_point_layer()
|
||||||
|
|
||||||
@ -576,6 +581,7 @@ class ResultPointLayer(BasicLayer):
|
|||||||
feature.setAttribute('prob', '')
|
feature.setAttribute('prob', '')
|
||||||
else:
|
else:
|
||||||
feature.setAttribute('prob', '%.2f'%(d[2]))
|
feature.setAttribute('prob', '%.2f'%(d[2]))
|
||||||
|
self.layer.updateFeature(feature)
|
||||||
else:
|
else:
|
||||||
feature = self.layer.getFeature(row+1)
|
feature = self.layer.getFeature(row+1)
|
||||||
# print(feature)
|
# print(feature)
|
||||||
@ -588,6 +594,7 @@ class ResultPointLayer(BasicLayer):
|
|||||||
feature.setAttribute('prob', '%.2f'%(self.data[row][2]))
|
feature.setAttribute('prob', '%.2f'%(self.data[row][2]))
|
||||||
self.layer.updateFeature(feature)
|
self.layer.updateFeature(feature)
|
||||||
self.layer.commitChanges()
|
self.layer.commitChanges()
|
||||||
|
Project().result_table.show_result(self)
|
||||||
|
|
||||||
|
|
||||||
def get_actions(self):
|
def get_actions(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user