From 274f6a3a10801e4df69f2d042e02845ab0af8365 Mon Sep 17 00:00:00 2001 From: copper Date: Tue, 21 Jun 2022 14:55:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AD=97=E4=BD=93=20?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E5=9B=BE=E5=B1=82=20=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReadMe.md | 6 +- plugins/In_one/main.py | 2 +- plugins/basic_change/__init__.py | 1 - plugins/basic_change/basic.ui | 116 ------------------- plugins/basic_change/main.py | 191 ------------------------------- plugins/change_rate/main.py | 21 +++- plugins/plugins.yaml | 21 ---- plugins/table_result/__init__.py | 1 - plugins/table_result/main.py | 112 ------------------ plugins/threshold/__init__.py | 1 - plugins/threshold/main.py | 163 -------------------------- plugins/threshold/otsu.py | 42 ------- rscder/gui/actions.py | 6 +- rscder/gui/project.py | 16 +-- rscder/utils/project.py | 14 ++- 使用手册.txt | 4 +- 16 files changed, 45 insertions(+), 672 deletions(-) delete mode 100644 plugins/basic_change/__init__.py delete mode 100644 plugins/basic_change/basic.ui delete mode 100644 plugins/basic_change/main.py delete mode 100644 plugins/table_result/__init__.py delete mode 100644 plugins/table_result/main.py delete mode 100644 plugins/threshold/__init__.py delete mode 100644 plugins/threshold/main.py delete mode 100644 plugins/threshold/otsu.py diff --git a/ReadMe.md b/ReadMe.md index 9a52076..e3c54f5 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -34,9 +34,9 @@ python setup.py 1. 证书检查与生成 1. 基于MAC地址与过期时间进行证书生成,启动时检查证书,过期则退出 -2. 项目管理 - 1. 以项目为单位进行数据管理与生产 - 2. 提供项目保存与导入功能 +2. 工程管理 + 1. 以工程为单位进行数据管理与生产 + 2. 提供工程保存与导入功能 3. 提供多种格式的栅格数据导入(TIF、PNG、BMP、JPG)等 4. 提供矢量数据导入 3. 基本工具 diff --git a/plugins/In_one/main.py b/plugins/In_one/main.py index bdd8696..1815799 100644 --- a/plugins/In_one/main.py +++ b/plugins/In_one/main.py @@ -5,7 +5,7 @@ import os import pdb from threading import Thread import numpy as np -from plugins.basic_change.main import MyDialog +# from plugins.basic_change.main import MyDialog from rscder.gui.actions import ActionManager from rscder.plugins.basic import BasicPlugin from PyQt5.QtWidgets import QAction, QDialog, QHBoxLayout, QVBoxLayout, QPushButton,QWidget,QLabel,QLineEdit,QPushButton,QComboBox diff --git a/plugins/basic_change/__init__.py b/plugins/basic_change/__init__.py deleted file mode 100644 index e77d97e..0000000 --- a/plugins/basic_change/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from basic_change.main import * \ No newline at end of file diff --git a/plugins/basic_change/basic.ui b/plugins/basic_change/basic.ui deleted file mode 100644 index 4c5e733..0000000 --- a/plugins/basic_change/basic.ui +++ /dev/null @@ -1,116 +0,0 @@ - - - Dialog - - - Qt::ApplicationModal - - - - 0 - 0 - 700 - 531 - - - - 差分法 - - - true - - - - - - - - QTabWidget::West - - - 0 - - - Qt::ElideNone - - - true - - - true - - - false - - - false - - - - 基础设置 - - - - - - - - 时相1影像 - - - 7 - - - 5 - - - - - - - 时相2影像 - - - 7 - - - 5 - - - - - - - - - - - 0 - 0 - - - - - - - - - - - 后处理 - - - - - 阈值化 - - - - - - - - - - - diff --git a/plugins/basic_change/main.py b/plugins/basic_change/main.py deleted file mode 100644 index 0e8e8e0..0000000 --- a/plugins/basic_change/main.py +++ /dev/null @@ -1,191 +0,0 @@ -import math -import os -from rscder.gui.actions import ActionManager -from rscder.plugins.basic import BasicPlugin -from PyQt5.QtWidgets import QAction, QDialog, QHBoxLayout, QVBoxLayout, QPushButton -from PyQt5.QtCore import pyqtSignal -from PyQt5.QtGui import QIcon -from rscder.utils.icons import IconInstance -from rscder.utils.project import BasicLayer, Project, RasterLayer, SingleBandRasterLayer -from rscder.gui.layercombox import PairLayerCombox -from osgeo import gdal -from threading import Thread -import numpy as np - -class MyDialog(QDialog): - - def __init__(self, parent=None): - super().__init__(parent) - - self.setWindowTitle('差分法') - self.setWindowIcon(IconInstance().LOGO) - - # self.setFixedWidth(500) - - self.layer_select = PairLayerCombox(self) - - # self.number_input = QLineEdit(self) - - 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) - - self.main_layout = QVBoxLayout() - self.main_layout.addWidget(self.layer_select) - - self.main_layout.addLayout(self.button_layout) - self.setLayout(self.main_layout) - - def on_ok(self): - if self.layer_select.layer1 is None or self.layer_select.layer2 is None: - self.reject() - return - self.accept() - - def on_cancel(self): - self.reject() - - - -class BasicMethod(BasicPlugin): - - result_ok = pyqtSignal(dict) - - @staticmethod - def info(): - return { - 'name': 'BasicMethod', - 'description': 'BasicMethod', - 'author': 'RSCDER', - 'version': '1.0.0', - } - - def set_action(self): - - basic_diff_method = QAction('差分法') - ActionManager().unsupervised_menu.addAction(basic_diff_method) - basic_diff_method.setEnabled(False) - self.basic_diff_method = basic_diff_method - basic_diff_method.triggered.connect(self.basic_diff_alg) - - def setup(self): - self.basic_diff_method.setEnabled(True) - - def run_basic_diff_alg(self, layer1:RasterLayer, layer2:RasterLayer): - - pth1 = layer1.path - pth2 = layer2.path - - - - cell_size = layer1.layer_parent.cell_size - - self.send_message.emit('开始计算差分法') - - ds1 = gdal.Open(pth1) - ds2 = gdal.Open(pth2) - if not layer1.compare(layer2): - self.send_message.emit('两个图层的尺寸不同') - return - xsize = ds1.RasterXSize - ysize = ds1.RasterYSize - band = ds1.RasterCount - yblocks = ysize // cell_size[1] - - driver = gdal.GetDriverByName('GTiff') - out_tif = os.path.join(Project().cmi_path, 'temp.tif') - out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32) - out_ds.SetGeoTransform(ds1.GetGeoTransform()) - out_ds.SetProjection(ds1.GetProjection()) - max_diff = 0 - min_diff = math.inf - for j in range(yblocks + 1): - - self.send_message.emit(f'计算{j}/{yblocks}') - block_xy = (0, j * cell_size[1]) - if block_xy[1] > ysize: - break - block_size = (xsize, cell_size[1]) - if block_xy[1] + block_size[1] > ysize: - block_size = (xsize, ysize - block_xy[1]) - block_data1 = ds1.ReadAsArray(*block_xy, *block_size) - block_data2 = ds2.ReadAsArray(*block_xy, *block_size) - - if band == 1: - block_data1 = block_data1[None, ...] - block_data2 = block_data2[None, ...] - # pdb.set_trace() - block_diff = block_data1.sum(0) - block_data2.sum(0) - block_diff = block_diff.astype(np.float32) - block_diff = np.abs(block_diff) - - min_diff = min(min_diff, block_diff[block_diff > 0].min()) - max_diff = max(max_diff, block_diff.max()) - out_ds.GetRasterBand(1).WriteArray(block_diff, *block_xy) - - self.send_message.emit(f'完成{j}/{yblocks}') - - out_ds.FlushCache() - del out_ds - self.send_message.emit('归一化概率中...') - temp_in_ds = gdal.Open(out_tif) - - out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer1.layer_parent.name, int(np.random.rand() * 100000))) - out_normal_ds = driver.Create(out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte) - out_normal_ds.SetGeoTransform(ds1.GetGeoTransform()) - out_normal_ds.SetProjection(ds1.GetProjection()) - # hist = np.zeros(256, dtype=np.int32) - for j in range(yblocks+1): - block_xy = (0, j * cell_size[1]) - if block_xy[1] > ysize: - break - block_size = (xsize, cell_size[1]) - if block_xy[1] + block_size[1] > ysize: - block_size = (xsize, ysize - block_xy[1]) - block_data = temp_in_ds.ReadAsArray(*block_xy, *block_size) - block_data = (block_data - min_diff) / (max_diff - min_diff) * 255 - block_data = block_data.astype(np.uint8) - out_normal_ds.GetRasterBand(1).WriteArray(block_data, *block_xy) - # hist_t, _ = np.histogram(block_data, bins=256, range=(0, 256)) - # hist += hist_t - # print(hist) - del temp_in_ds - del out_normal_ds - try: - os.remove(out_tif) - except: - pass - - raster_result_layer = SingleBandRasterLayer(None, True, out_normal_tif, BasicLayer.BOATH_VIEW) - - # layer1.layer_parent.add_result_layer(point_result_lalyer) - layer1.layer_parent.add_result_layer(raster_result_layer) - - # self.send_message.emit('完成计算变化表格') - - self.send_message.emit('差分法计算完成') - - def basic_diff_alg(self): - # layer_select = - - layer_select = MyDialog(self.mainwindow) - if layer_select.exec_(): - layer1 = layer_select.layer_select.layer1 - layer2 = layer_select.layer_select.layer2 - else: - return - # layer:PairLayer = list(self.project.layers.values())[0] - - t = Thread(target=self.run_basic_diff_alg, args=(layer1, layer2)) - t.start() - - - \ No newline at end of file diff --git a/plugins/change_rate/main.py b/plugins/change_rate/main.py index 51dc579..e968ffe 100644 --- a/plugins/change_rate/main.py +++ b/plugins/change_rate/main.py @@ -50,12 +50,28 @@ class RateSetdialog(QDialog): vlayout.addLayout(h2) vlayout.addLayout(self.button_layout) self.setLayout(vlayout) + + self.old_data = None def on_ok(self): + self.onclose() self.accept() def on_cancel(self): + if self.layer_select.current_layer is not None: + self.layer_select.current_layer.data = self.layer_select.current_layer.old_data + self.layer_select.current_layer.update_point_layer(-1) self.reject() + + def onclose(self) -> None: + if self.layer_select.current_layer is not None: + self.layer_select.current_layer.save() + + def closeEvent(self, a0) -> None: + if self.layer_select.current_layer is not None: + self.layer_select.current_layer.data = self.layer_select.current_layer.old_data + self.layer_select.current_layer.update_point_layer(-1) + class RateSetPlugin(BasicPlugin): current_layer=None @@ -81,6 +97,9 @@ class RateSetPlugin(BasicPlugin): dialog.show() def currentLayer(self,layer): self.current_layer=layer + if not isinstance(layer,ResultPointLayer): + return + layer.old_data = layer.data.copy() def setrate(self,input:int): @@ -96,4 +115,4 @@ class RateSetPlugin(BasicPlugin): layer.update_point_layer(-1) - + diff --git a/plugins/plugins.yaml b/plugins/plugins.yaml index f7740cc..43de036 100644 --- a/plugins/plugins.yaml +++ b/plugins/plugins.yaml @@ -5,13 +5,6 @@ name: "\u5173\u4E8E" path: ./plugin\about version: 1.0.0 -- author: RSCDER - description: BasicMethod - enabled: false - module: basic_change - name: BasicMethod - path: ./plugin\basic_change - version: 1.0.0 - author: RSCDER description: ExportTo enabled: true @@ -26,20 +19,6 @@ name: MeanFilter path: ./plugin\some_filter version: 1.0.0 -- author: RSCDER - description: OTSU - enabled: false - module: threshold - name: OTSU - path: ./plugin\threshold - version: 1.0.0 -- author: RSCDER - description: TableResult - enabled: true - module: table_result - name: TableResult - path: ./plugin\table_result - version: 1.0.0 - author: RSCDER description: Evaluation enabled: true diff --git a/plugins/table_result/__init__.py b/plugins/table_result/__init__.py deleted file mode 100644 index 4ac01df..0000000 --- a/plugins/table_result/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from table_result.main import * \ No newline at end of file diff --git a/plugins/table_result/main.py b/plugins/table_result/main.py deleted file mode 100644 index 027f47f..0000000 --- a/plugins/table_result/main.py +++ /dev/null @@ -1,112 +0,0 @@ -import os -from threading import Thread -from rscder.gui.actions import ActionManager -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 -from PyQt5.QtGui import QIcon -from rscder.utils.icons import IconInstance - -from rscder.utils.project import Project, ResultPointLayer, SingleBandRasterLayer -from osgeo import gdal -class TableResultDialog(QDialog): - - def __init__(self, parent=None): - super().__init__(parent) - - self.setWindowTitle('表格结果') - self.setWindowIcon(IconInstance().LOGO) - - self.layer_select = ResultLayercombox(self) - hbox = QHBoxLayout() - hbox.addWidget(QLabel('二值化结果图层:')) - hbox.addWidget(self.layer_select) - - 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) - - self.main_layout = QVBoxLayout() - self.main_layout.addLayout(hbox) - self.main_layout.addLayout(self.button_layout) - self.setLayout(self.main_layout) - - def on_ok(self): - self.accept() - - def on_cancel(self): - self.reject() - - -class TableResultPlugin(BasicPlugin): - - @staticmethod - def info(): - return { - 'name': 'TableResult', - 'author': 'RSC', - 'version': '1.0.0', - 'description': '表格结果' - } - - 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 run(self, layer:SingleBandRasterLayer): - self.send_message.emit('正在计算表格结果...') - if not isinstance(layer, SingleBandRasterLayer): - self.send_message.emit('请选择一个单波段栅格图层') - return - - cell_size = layer.layer_parent.cell_size - ds = gdal.Open(layer.path) - xsize = ds.RasterXSize - ysize = ds.RasterYSize - geo = ds.GetGeoTransform() - - out_csv = os.path.join(Project().other_path, f'{layer.name}_table_result.csv') - yblocks = ysize // cell_size[1] + 1 - xblocks = xsize // cell_size[0] + 1 - with open(out_csv, 'w') as f: - f.write('x,y,diff,status\n') - for j in range(yblocks): - block_xy = (0, j * cell_size[1]) - block_size = (xsize, cell_size[1]) - if block_xy[1] + block_size[1] > ysize: - block_size = (xsize, ysize - block_xy[1]) - block_data = ds.ReadAsArray(*block_xy, *block_size) - for i in range(xblocks): - start_x = i * cell_size[0] - end_x = start_x + cell_size[0] - 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') - - result_layer = ResultPointLayer(out_csv, enable=True, proj=layer.proj, geo=layer.geo) - layer.layer_parent.add_result_layer(result_layer) - self.send_message.emit('计算完成') - - - def show_dialog(self): - dialog = TableResultDialog() - if dialog.exec_() == QDialog.Accepted: - if dialog.layer_select.current_layer is not None: - t = Thread(target=self.run, args=(dialog.layer_select.current_layer,)) - t.start() diff --git a/plugins/threshold/__init__.py b/plugins/threshold/__init__.py deleted file mode 100644 index 9a18fd3..0000000 --- a/plugins/threshold/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from threshold.main import * \ No newline at end of file diff --git a/plugins/threshold/main.py b/plugins/threshold/main.py deleted file mode 100644 index adfefb7..0000000 --- a/plugins/threshold/main.py +++ /dev/null @@ -1,163 +0,0 @@ -import os -import pdb -from threading import Thread -import numpy as np -from rscder.gui.actions import ActionManager -from rscder.plugins.basic import BasicPlugin -from PyQt5.QtWidgets import QAction, QDialog, QHBoxLayout, QVBoxLayout, QPushButton -from PyQt5.QtGui import QIcon -from PyQt5.QtCore import Qt -from rscder.gui.layercombox import RasterLayerCombox -from rscder.utils.icons import IconInstance -from rscder.utils.project import Project, RasterLayer, SingleBandRasterLayer -from threshold.otsu import OTSU -from osgeo import gdal -class OTSUDialog(QDialog): - - def __init__(self, parent=None): - super().__init__(parent) - - self.setWindowTitle('OTSU阈值') - self.setWindowIcon(IconInstance().LOGO) - - self.setFixedWidth(500) - - self.layercombox = RasterLayerCombox(self) - - - - 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) - - self.main_layout = QVBoxLayout() - self.main_layout.addWidget(self.layercombox) - self.main_layout.addLayout(self.button_layout) - self.setLayout(self.main_layout) - - def on_ok(self): - self.accept() - - def on_cancel(self): - self.reject() - - -class OTSUPlugin(BasicPlugin): - - @staticmethod - def info(): - return { - "name": "OTSU", - "description": "OTSU阈值", - "author": "rscder", - "version": "1.0.0" - } - - def set_action(self): - self.action = QAction('OTSU阈值', self.mainwindow) - self.action.triggered.connect(self.run) - ActionManager().postop_menu.addAction(self.action) - - def run(self): - dialog = OTSUDialog(self.mainwindow) - if dialog.exec_() == QDialog.Accepted: - t = Thread(target=self.run_alg, args=(dialog.layercombox.current_layer,)) - t.start() - - def run_alg(self, layer:RasterLayer): - if layer is None or layer.path is None: - return - ds = gdal.Open(layer.path) - band = ds.GetRasterBand(1) - band_count = ds.RasterCount - if band_count > 1: - self.message_box.error('请选择符合要求的图层') - return - hist = np.zeros(256, dtype=np.int) - xsize = ds.RasterXSize - ysize = ds.RasterYSize - - max_pixels = 1e7 - max_rows = max_pixels // xsize - if max_rows < 1: - max_rows = 1 - if max_rows > ysize: - max_rows = ysize - block_count = ysize // max_rows + 1 - for i in range(block_count): - start_row = i * max_rows - end_row = min((i + 1) * max_rows, ysize) - block = band.ReadAsArray(0, start_row, xsize, end_row - start_row) - hist += np.histogram(block.flatten(), bins=256, range=(0, 255))[0] - hist = hist.astype(np.float32) - gap = OTSU(hist) - self.send_message.emit('阈值为:{}'.format(gap)) - - out_th = os.path.join(Project().bcdm_path, '{}_otsu_bcdm.tif'.format(layer.name)) - out_ds = gdal.GetDriverByName('GTiff').Create(out_th, xsize, ysize, 1, gdal.GDT_Byte) - out_ds.SetGeoTransform(ds.GetGeoTransform()) - out_ds.SetProjection(ds.GetProjection()) - out_band = out_ds.GetRasterBand(1) - - for i in range(block_count): - start_row = i * max_rows - end_row = min((i + 1) * max_rows, ysize) - block = band.ReadAsArray(0, start_row, xsize, end_row - start_row) - out_band.WriteArray(block > gap, 0, start_row) - out_band.FlushCache() - out_ds = None - ds = None - self.send_message.emit('OTSU阈值完成') - - otsu_layer = SingleBandRasterLayer(path = out_th, style_info={}) - layer.layer_parent.add_result_layer(otsu_layer) - - -# otsu_method = QAction('OTSU阈值分割') -# postop_menu = self.ctx['postop_menu'] -# postop_menu.addAction(otsu_method) -# otsu_method.setEnabled(False) -# point_result_lalyer = ResultPointLayer(out_csv, enable=False, proj = layer1.proj, geo = layer1.geo) -# self.gap = OTSU(hist) - -# self.message_send.emit('OTSU:' + str(self.gap)) - -# out_normal_ds.FlushCache() -# del out_normal_ds -# self.message_send.emit('完成归一化概率') - -# self.message_send.emit('计算变化表格中...') -# out_csv = os.path.join(Project().bcdm_path, '{}-{}.csv'.format(layer1.layer_parent.name, int(np.random.rand() * 100000))) -# xblocks = xsize // cell_size[0] - -# normal_in_ds = gdal.Open(out_normal_tif) - -# with open(out_csv, 'w') as f: -# f.write('x,y,diff,status\n') -# for j in range(yblocks): -# block_xy = (0, j * cell_size[1]) -# block_size = (xsize, cell_size[1]) -# if block_xy[1] + block_size[1] > ysize: -# block_size = (xsize, ysize - block_xy[1]) -# block_data = normal_in_ds.ReadAsArray(*block_xy, *block_size) -# for i in range(xblocks): -# start_x = i * cell_size[0] -# end_x = start_x + cell_size[0] -# if end_x > xsize: -# end_x = xsize -# block_data_xy = block_data[:, start_x:end_x] -# if block_data_xy.mean() > self.gap: -# 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() / 255 * 100},1\n') - \ No newline at end of file diff --git a/plugins/threshold/otsu.py b/plugins/threshold/otsu.py deleted file mode 100644 index 962075f..0000000 --- a/plugins/threshold/otsu.py +++ /dev/null @@ -1,42 +0,0 @@ -import numpy as np - -def OTSU(hist): - - u1=0.0#背景像素的平均灰度值 - u2=0.0#前景像素的平均灰度值 - th=0.0 - - #总的像素数目 - PixSum= np.sum(hist) - #各灰度值所占总像素数的比例 - PixRate=hist / PixSum - #统计各个灰度值的像素个数 - Max_var = 0 - #确定最大类间方差对应的阈值 - GrayScale = len(hist) - for i in range(1,len(hist)):#从1开始是为了避免w1为0. - u1_tem=0.0 - u2_tem=0.0 - #背景像素的比列 - w1=np.sum(PixRate[:i]) - #前景像素的比例 - w2=1.0-w1 - if w1==0 or w2==0: - pass - else:#背景像素的平均灰度值 - for m in range(i): - u1_tem=u1_tem+PixRate[m]*m - u1 = u1_tem * 1.0 / w1 - #前景像素的平均灰度值 - for n in range(i,GrayScale): - u2_tem = u2_tem + PixRate[n]*n - u2 = u2_tem / w2 - #print(u1) - #类间方差公式:G=w1*w2*(u1-u2)**2 - tem_var=w1*w2*np.power((u1-u2),2) - #print(tem_var) - #判断当前类间方差是否为最大值。 - if Max_var None: super().__init__(parent) - self.setWindowTitle(self.tr('创建项目')) + self.setWindowTitle(self.tr('创建工程')) self.setWindowIcon(IconInstance().LOGO) self.file = str(Path(Settings.General().last_path)) @@ -18,11 +18,11 @@ class Create(QDialog): self.max_memory = Settings.Project().max_memory self.cell_size = Settings.Project().cell_size - file_label = QLabel('项目目录:') + file_label = QLabel('工程目录:') file_label.setFixedWidth(100) file_input = QLineEdit() - file_input.setPlaceholderText('项目目录') - file_input.setToolTip('项目目录') + file_input.setPlaceholderText('工程目录') + file_input.setToolTip('工程目录') file_input.setReadOnly(True) file_input.setText(self.file) self.file_input = file_input @@ -32,11 +32,11 @@ class Create(QDialog): file_open.clicked.connect(self.open_file) - name_label = QLabel('项目名称:') + name_label = QLabel('工程名称:') name_label.setFixedWidth(100) name_input = QLineEdit() - name_input.setPlaceholderText('项目名称') - name_input.setToolTip('项目名称') + name_input.setPlaceholderText('工程名称') + name_input.setToolTip('工程名称') name_input.setText(self.name) self.name_input = name_input @@ -116,7 +116,7 @@ class Create(QDialog): self.max_memory = self.max_memory_input.text() self.cell_size = (self.cell_size_x_input.text(), self.cell_size_y_input.text()) if self.name == '': - QMessageBox.warning(self, 'Warning', '请选择项目目录!') + QMessageBox.warning(self, 'Warning', '请选择工程目录!') return if self.max_memory == '': QMessageBox.warning(self, 'Warning', '请输入最大文件大小!') diff --git a/rscder/utils/project.py b/rscder/utils/project.py index 106ddf7..e03e3dc 100644 --- a/rscder/utils/project.py +++ b/rscder/utils/project.py @@ -109,7 +109,7 @@ class Project(QObject): self.file = path self.root = os.path.split(path)[0] else: - self.message_box.error('打开或创建项目失败') + self.message_box.error('打开或创建工程失败') try: if not os.path.exists(self.root): os.makedirs(self.root, exist_ok=True) @@ -122,7 +122,7 @@ class Project(QObject): self.is_init = True self.project_init.emit(True) except: - self.message_box.error('打开或创建项目失败') + self.message_box.error('打开或创建工程失败') def save(self): data_dict = { @@ -461,7 +461,7 @@ class VectorLayer(BasicLayer): class ResultPointLayer(BasicLayer): - def __init__(self, path, name=None, enable = False, proj = None, geo = None,result_path={},dsort=True ): + def __init__(self, path, name=None, enable = False, proj = None, geo = None,result_path={},dsort=False ): 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 ) @@ -470,6 +470,7 @@ class ResultPointLayer(BasicLayer): self.geo = geo self.dsort=dsort self.result_path=result_path + self.load_point_file() def save(self): @@ -492,12 +493,13 @@ class ResultPointLayer(BasicLayer): lyr.enabled = True lyr.fieldName = 'prob' lyr.placement = QgsPalLayerSettings.OverPoint - lyr.xOffset = 2 + lyr.xOffset = 25 lyr.yOffset = -2 lyr.textFont = QFont('Times New Roman', 100) text_format = QgsTextFormat() text_format.setFont(lyr.textFont) - text_format.color = QColor('#000000') + text_format.setSize(50) + text_format.setColor(QColor('#FF0000')) # text_format.background().color = QColor('#000000') text_format.buffer().setEnabled(True) text_format.buffer().setSize(1) @@ -530,7 +532,7 @@ class ResultPointLayer(BasicLayer): if self.dsort: data=data[data[:,-2].argsort()] else: - data=data[-(data[:,-2]).argsort()] + data=data[(-data[:,-2]).argsort()] self.data = data self.make_point_layer() diff --git a/使用手册.txt b/使用手册.txt index 4afb49c..c88c8d1 100644 --- a/使用手册.txt +++ b/使用手册.txt @@ -7,9 +7,9 @@ 点击ECD.exe,点击Open,选择生成的lic文件 点击OK -3. 新建项目与数据导入 +3. 新建工程与数据导入 点击ECD.exe -点击新建项目 +点击新建工程 选择路径、名称 将会在路径下看到与名称相同的文件夹