增加移动阈值设置

This commit is contained in:
石沈昊 2022-06-21 13:39:36 +08:00
parent d358a7009b
commit b6a31e2e53
8 changed files with 193 additions and 20 deletions

View File

@ -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('计算完成')

View File

@ -0,0 +1 @@
from change_rate.main import *

View 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)

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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={}))

View File

@ -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):