增加移动阈值设置
This commit is contained in:
parent
d358a7009b
commit
b6a31e2e53
@ -211,7 +211,8 @@ class InOnePlugin(BasicPlugin):
|
||||
def set_action(self):
|
||||
|
||||
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
|
||||
basic_diff_method_in_one.triggered.connect(self.run)
|
||||
|
||||
@ -224,6 +225,7 @@ class InOnePlugin(BasicPlugin):
|
||||
t.start()
|
||||
|
||||
def run_alg(self,w:AllInOne):
|
||||
dict={}
|
||||
layer1=w.layer_combox.layer1
|
||||
layer2=w.layer_combox.layer2
|
||||
if not layer1.compare(layer2):
|
||||
@ -246,6 +248,7 @@ class InOnePlugin(BasicPlugin):
|
||||
if w.cd_select.choose==self.cd[0]:
|
||||
cdpth=basic_cd(pth1,pth2,w.layer_combox.layer1.layer_parent,self.send_message)
|
||||
name += '_basic_cd'
|
||||
#dict[name]=cdpth
|
||||
else:
|
||||
pass
|
||||
|
||||
@ -253,12 +256,14 @@ class InOnePlugin(BasicPlugin):
|
||||
if w.threshold_select.choose==self.threshold[0]:
|
||||
thpth=otsu(cdpth,w.layer_combox.layer1.layer_parent.name,self.send_message)
|
||||
name+='_otsu'
|
||||
dict[name]=thpth
|
||||
elif w.threshold_select.choose=='手动阈值':
|
||||
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:
|
||||
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):
|
||||
x_size = int(x_size)
|
||||
@ -459,7 +464,7 @@ def thresh(pth,gap,name,send_message):
|
||||
#otsu_layer = SingleBandRasterLayer(path = out_th, style_info={})
|
||||
#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('正在计算表格结果...')
|
||||
cell_size = layer.layer_parent.cell_size
|
||||
ds = gdal.Open(pth)
|
||||
@ -484,13 +489,15 @@ def table_layer(pth,layer,name,send_message):
|
||||
if end_x > xsize:
|
||||
end_x = xsize
|
||||
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_y = j * cell_size[1] + cell_size[1] // 2
|
||||
center_x = center_x * geo[1] + geo [0]
|
||||
center_y = center_y * geo[5] + geo [3]
|
||||
f.write(f'{center_x},{center_y},{block_data_xy.mean() * 100},1\n')
|
||||
|
||||
center_x = start_x + cell_size[0] // 2
|
||||
center_y = j * cell_size[1] + cell_size[1] // 2
|
||||
center_x = center_x * geo[1] + geo [0]
|
||||
center_y = center_y * geo[5] + geo [3]
|
||||
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.result_path=dict
|
||||
print(result_layer.result_path)
|
||||
layer.layer_parent.add_result_layer(result_layer)
|
||||
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
|
||||
from rscder.gui.actions import ActionManager
|
||||
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.QtGui import QIcon
|
||||
from PyQt5.QtCore import Qt
|
||||
@ -30,7 +30,7 @@ class EvalutationDialog(QDialog):
|
||||
self.setWindowTitle('精度评估')
|
||||
self.setWindowIcon(IconInstance().LOGO)
|
||||
|
||||
self.layer_select = RasterLayerCombox(self)
|
||||
self.layer_select = ResultLayercombox(self)
|
||||
self.gt_file = None
|
||||
|
||||
gt_file_select_label = QLabel('真值文件:')
|
||||
@ -42,7 +42,7 @@ class EvalutationDialog(QDialog):
|
||||
hbox1.addWidget(self.gt_file_select)
|
||||
|
||||
hbox2 = QHBoxLayout()
|
||||
hbox2.addWidget(QLabel('二值化结果图层:'))
|
||||
# hbox2.addWidget(QLabel('二值化结果图层:'))
|
||||
hbox2.addWidget(self.layer_select)
|
||||
|
||||
self.ok_button = QPushButton('确定', self)
|
||||
|
@ -7,7 +7,7 @@
|
||||
version: 1.0.0
|
||||
- author: RSCDER
|
||||
description: BasicMethod
|
||||
enabled: true
|
||||
enabled: false
|
||||
module: basic_change
|
||||
name: BasicMethod
|
||||
path: ./plugin\basic_change
|
||||
@ -28,7 +28,7 @@
|
||||
version: 1.0.0
|
||||
- author: RSCDER
|
||||
description: OTSU
|
||||
enabled: true
|
||||
enabled: false
|
||||
module: threshold
|
||||
name: OTSU
|
||||
path: ./plugin\threshold
|
||||
@ -51,6 +51,13 @@
|
||||
description: AllinOne
|
||||
enabled: true
|
||||
module: In_one
|
||||
name: AllinOne
|
||||
name: basic_diff_AllinOne
|
||||
path: ./plugin\In_one
|
||||
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
|
||||
from threading import Thread
|
||||
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 PyQt5.QtWidgets import QAction, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton
|
||||
from PyQt5.QtCore import pyqtSignal
|
||||
@ -18,7 +18,7 @@ class TableResultDialog(QDialog):
|
||||
self.setWindowTitle('表格结果')
|
||||
self.setWindowIcon(IconInstance().LOGO)
|
||||
|
||||
self.layer_select = RasterLayerCombox(self)
|
||||
self.layer_select = ResultLayercombox(self)
|
||||
hbox = QHBoxLayout()
|
||||
hbox.addWidget(QLabel('二值化结果图层:'))
|
||||
hbox.addWidget(self.layer_select)
|
||||
|
@ -1,7 +1,7 @@
|
||||
from PyQt5.QtWidgets import QComboBox, QWidget, QLabel, QHBoxLayout, QVBoxLayout
|
||||
from PyQt5.QtGui import QIcon
|
||||
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):
|
||||
|
||||
def __init__(self, parent=None):
|
||||
@ -139,3 +139,55 @@ class ResultPointLayerCombox(QComboBox):
|
||||
else:
|
||||
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):
|
||||
|
||||
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:
|
||||
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 )
|
||||
self.data = None
|
||||
self.wkt = proj
|
||||
self.geo = geo
|
||||
|
||||
self.dsort=dsort
|
||||
self.result_path=result_path
|
||||
self.load_point_file()
|
||||
|
||||
def save(self):
|
||||
@ -526,6 +527,10 @@ class ResultPointLayer(BasicLayer):
|
||||
data = np.loadtxt(self.path, delimiter=',', skiprows=1)
|
||||
if data is None:
|
||||
return
|
||||
if self.dsort:
|
||||
data=data[data[:,-2].argsort()]
|
||||
else:
|
||||
data=data[-(data[:,-2]).argsort()]
|
||||
self.data = data
|
||||
self.make_point_layer()
|
||||
|
||||
@ -576,6 +581,7 @@ class ResultPointLayer(BasicLayer):
|
||||
feature.setAttribute('prob', '')
|
||||
else:
|
||||
feature.setAttribute('prob', '%.2f'%(d[2]))
|
||||
self.layer.updateFeature(feature)
|
||||
else:
|
||||
feature = self.layer.getFeature(row+1)
|
||||
# print(feature)
|
||||
@ -588,6 +594,7 @@ class ResultPointLayer(BasicLayer):
|
||||
feature.setAttribute('prob', '%.2f'%(self.data[row][2]))
|
||||
self.layer.updateFeature(feature)
|
||||
self.layer.commitChanges()
|
||||
Project().result_table.show_result(self)
|
||||
|
||||
|
||||
def get_actions(self):
|
||||
|
Loading…
x
Reference in New Issue
Block a user