diff --git a/ECD.py b/ECD.py index 495d6c8..71901ed 100644 --- a/ECD.py +++ b/ECD.py @@ -1,8 +1,8 @@ import os import sys sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'libs')) -os.environ['PROJ_LIB'] = os.path.join(os.path.dirname(__file__), 'share/proj') -os.environ['GDAL_DATA'] = os.path.join(os.path.dirname(__file__), 'share') +# os.environ['PROJ_LIB'] = os.path.join(os.path.dirname(__file__), 'share/proj') +# os.environ['GDAL_DATA'] = os.path.join(os.path.dirname(__file__), 'share') os.environ['ECD_BASEDIR'] = os.path.dirname(__file__) BASE_DIR = os.path.dirname(__file__) from rscder import MulStart diff --git a/lic/license.lic b/lic/license.lic index fcdb940..3eea062 100644 --- a/lic/license.lic +++ b/lic/license.lic @@ -1 +1 @@ -vd4FiYncytyziGH9GNCAA8hGGr1/79Xmphtc5+PHPJDpxvqj1hP7+985QMojYO4M5Qn/aqEAvFgeDN3CA8x1YAK8SdCgSXSBJpRBK8wqPQjBY1ak96QfdPCrTLunr+xuPxK3Gxe772adTTsee2+ot7WePYUsC4y4NcS5+rlP1if87xtYqVeSwx3c64cOmAGP \ No newline at end of file +wd1l4X/jr1cgW76fh50mc7p7gK2TwB6Mmn5Pcgdo3xJFxcfLcDFFQP5t0OpPv9oLnDe2zLQtNmjLkdTI3dwx4iQnBkfBeYX6/2V2A3Y1fzOVR35NoDNIhsu7qH7XD76gpyI20cRA6K4EKvIUMFwaVRBJjT7j6uJn74X4MtcixBhTvHJKrLzTF2AXDcSDyEVz \ No newline at end of file diff --git a/plugins/filter_collection/__init__.py b/plugins/filter_collection/__init__.py index 29249ee..92473f3 100644 --- a/plugins/filter_collection/__init__.py +++ b/plugins/filter_collection/__init__.py @@ -3,4 +3,6 @@ from misc import Register FILTER = Register('滤波处理算法') from .mean_filter import MeanFilter -from filter_collection.main import * \ No newline at end of file +from filter_collection.main import * +from .morphology_filter import MorphologyFilter +from .bilater_filter import BilaterFilter \ No newline at end of file diff --git a/plugins/filter_collection/bilater_filter.py b/plugins/filter_collection/bilater_filter.py index 19a136f..65fe534 100644 --- a/plugins/filter_collection/bilater_filter.py +++ b/plugins/filter_collection/bilater_filter.py @@ -1,4 +1,5 @@ from misc import AlgFrontend +from misc.utils import format_now from osgeo import gdal, gdal_array from skimage.filters import rank from skimage.morphology import rectangle @@ -9,3 +10,105 @@ from rscder.utils.project import PairLayer, Project, RasterLayer, ResultPointLay import os from datetime import datetime +@FILTER.register +class BilaterFilter(AlgFrontend): + + @staticmethod + def get_name(): + return '双边滤波' + + @staticmethod + def get_icon(): + return None + + @staticmethod + def get_widget(parent=None): + widget = QtWidgets.QWidget(parent) + filter_window_r = QtWidgets.QLineEdit(widget) + filter_window_r.setText('6') + filter_window_r.setValidator(QtGui.QIntValidator()) + filter_window_r.setObjectName('filter_window_r') + + sigma_color = QtWidgets.QLineEdit(widget) + sigma_color.setValidator(QtGui.QIntValidator()) + sigma_color.setObjectName('sigma_color') + sigma_color.setText('50') + + sigma_space = QtWidgets.QLineEdit(widget) + sigma_space.setValidator(QtGui.QIntValidator()) + sigma_space.setObjectName('sigma_space') + sigma_space.setText('50') + + filter_window_r_label = QtWidgets.QLabel(widget) + filter_window_r_label.setText('滤波窗口直径:') + + sigma_space_label = QtWidgets.QLabel(widget) + sigma_space_label.setText('空间域方差:') + + sigma_color_label = QtWidgets.QLabel(widget) + sigma_color_label.setText('像素域方差:') + + + hlayout1 = QtWidgets.QHBoxLayout() + + hlayout1.addWidget(filter_window_r_label) + hlayout1.addWidget(filter_window_r) + hlayout1.addWidget(sigma_space_label) + hlayout1.addWidget(sigma_space) + hlayout1.addWidget(sigma_color_label) + hlayout1.addWidget(sigma_color) + # hlayout1.addWidget(x_size_input) + # hlayout1.addWidget(time_label) + # hlayout1.addWidget(y_size_input) + + widget.setLayout(hlayout1) + + return widget + + @staticmethod + def get_params(widget:QtWidgets.QWidget=None): + if widget is None: + return dict(w=6, sigma_color=50, sigma_space=50) + def default(o, v=None): + if o is None: + return v + else: + return o.text() + + w = int(default(widget.findChild(QtWidgets.QLineEdit, 'filter_window_r'), 6)) + sigma_space = int(default(widget.findChild(QtWidgets.QLineEdit, 'sigma_space'), 50)) + sigma_color = int(default(widget.findChild(QtWidgets.QLineEdit, 'sigma_color'), 50)) + # y_input = widget.findChild(QtWidgets.QLineEdit, 'yinput') + + + return dict(w=w, sigma_space=sigma_space, sigma_color=sigma_color) + + @staticmethod + def run_alg(pth, w, sigma_space, sigma_color, *args, **kargs): + # x_size = int(x_size) + # y_size = int(y_size) + # pth = layer.path + if pth is None: + return + + ds = gdal.Open(pth) + band_count = ds.RasterCount + name = os.path.splitext(os.path.basename(pth))[0] + out_path = os.path.join(Project().other_path, '{}_bilater_filter_{}.tif'.format(name, format_now())) + 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.SetGeoTransform(ds.GetGeoTransform()) + import cv2 + for i in range(band_count): + band = ds.GetRasterBand(i+1) + data = band.ReadAsArray() + #进行双边滤波处理cv2.bilateralFilter(影像,滤波窗口直径(0-255),像素域方差(0-255),空间域方差(0-255)) + data=cv2.bilateralFilter(data,w,sigma_space,sigma_color) + + out_band = out_ds.GetRasterBand(i+1) + out_band.WriteArray(data) + + out_ds.FlushCache() + del out_ds + del ds + return out_path diff --git a/plugins/filter_collection/main.py b/plugins/filter_collection/main.py index f1c5f88..eefe181 100644 --- a/plugins/filter_collection/main.py +++ b/plugins/filter_collection/main.py @@ -82,14 +82,28 @@ class MainPlugin(BasicPlugin): for key in FILTER.keys(): alg:AlgFrontend = FILTER[key] name = alg.get_name() or key - action = QAction(alg.get_icon(), name, self.mainwindow) + action = QAction(name, self.mainwindow) func = functools.partial(self.run, key) action.triggered.connect(func) toolbar.addAction(action) ActionManager().filter_menu.addAction(action) - self.alg_ok.connect(self.alg_oked) + # def set_action(self): + # self.action = QAction(IconInstance().VECTOR, '均值滤波', self.mainwindow) + # self.action.triggered.connect(self.run) + # ActionManager().filter_menu.addAction(self.action) + # self.alg_ok.connect(self.alg_oked) + + + # self.action = QAction('均值滤波', self.mainwindow) + # # self.action.setCheckable) + # # self.action.setChecked(False) + # self.action.triggered.connect(self.run) + # ActionManager().filter_menu.addAction(self.action) + # self.alg_ok.connect(self.alg_oked) # basic + + def alg_oked(self, layer, outpath): rlayer = RasterLayer(path = outpath, enable= True, view_mode = layer.view_mode ) diff --git a/plugins/filter_collection/morphology_filter.py b/plugins/filter_collection/morphology_filter.py new file mode 100644 index 0000000..14ced24 --- /dev/null +++ b/plugins/filter_collection/morphology_filter.py @@ -0,0 +1,95 @@ +from misc import AlgFrontend +from osgeo import gdal, gdal_array +from skimage.filters import rank +from skimage.morphology import rectangle +from filter_collection import FILTER +from PyQt5.QtWidgets import QDialog, QAction +from PyQt5 import QtCore, QtGui, QtWidgets +from rscder.utils.project import PairLayer, Project, RasterLayer, ResultPointLayer +import os +from datetime import datetime + +@FILTER.register +class MorphologyFilter(AlgFrontend): + + @staticmethod + def get_name(): + return '形态学滤波' + + @staticmethod + def get_icon(): + return None + + @staticmethod + def get_widget(parent=None): + widget = QtWidgets.QWidget(parent) + x_size_input = QtWidgets.QLineEdit(widget) + x_size_input.setText('3') + x_size_input.setValidator(QtGui.QIntValidator()) + x_size_input.setObjectName('xinput') + y_size_input = QtWidgets.QLineEdit(widget) + y_size_input.setValidator(QtGui.QIntValidator()) + y_size_input.setObjectName('yinput') + y_size_input.setText('3') + + size_label = QtWidgets.QLabel(widget) + size_label.setText('窗口大小:') + + time_label = QtWidgets.QLabel(widget) + time_label.setText('X') + + hlayout1 = QtWidgets.QHBoxLayout() + + hlayout1.addWidget(size_label) + hlayout1.addWidget(x_size_input) + hlayout1.addWidget(time_label) + hlayout1.addWidget(y_size_input) + + widget.setLayout(hlayout1) + + return widget + + @staticmethod + def get_params(widget:QtWidgets.QWidget=None): + if widget is None: + return dict(x_size=3, y_size=3) + + x_input = widget.findChild(QtWidgets.QLineEdit, 'xinput') + y_input = widget.findChild(QtWidgets.QLineEdit, 'yinput') + + if x_input is None or y_input is None: + return dict(x_size=3, y_size=3) + + x_size = int(x_input.text()) + y_size = int(y_input.text()) + + return dict(x_size=x_size, y_size=y_size) + + @staticmethod + def run_alg(pth, x_size, y_size, *args, **kargs): + x_size = int(x_size) + y_size = int(y_size) + # pth = layer.path + if pth is None: + return + + ds = gdal.Open(pth) + band_count = ds.RasterCount + + out_path = os.path.join(Project().other_path, 'morphology_filter_{}.tif'.format(int(datetime.now().timestamp() * 1000))) + 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.SetGeoTransform(ds.GetGeoTransform()) + + for i in range(band_count): + band = ds.GetRasterBand(i+1) + data = band.ReadAsArray() + #gradient形态学梯度计算 + data=rank.gradient(data,rectangle(y_size,x_size)) + out_band = out_ds.GetRasterBand(i+1) + out_band.WriteArray(data) + + out_ds.FlushCache() + del out_ds + del ds + return out_path diff --git a/rscder/gui/actions.py b/rscder/gui/actions.py index 441ee06..cb79886 100644 --- a/rscder/gui/actions.py +++ b/rscder/gui/actions.py @@ -55,6 +55,7 @@ class ActionManager(QtCore.QObject): self.file_menu = menubar.addMenu( '&文件') self.basic_menu = menubar.addMenu( '&基础工具') self.filter_menu = self.basic_menu.addMenu(IconInstance().FILTER, '&滤波处理') + self.change_detection_menu = menubar.addMenu('&通用变化检测') # self.unsupervised_menu = self.change_detection_menu.addMenu(IconInstance().UNSUPERVISED, '&无监督变化检测') self.supervised_menu = self.change_detection_menu.addMenu(IconInstance().SUPERVISED,'&监督变化检测')