新增混合编程

This commit is contained in:
石沈昊 2022-08-31 20:19:25 +08:00
parent 872e45937a
commit 89c531a245
10 changed files with 12877 additions and 51 deletions

View File

@ -1,29 +1,24 @@
import copy as cp
from asyncio.windows_events import NULL
from concurrent.futures import thread
from copy import copy
from email.policy import default
import os import os
import pdb
from threading import Thread from threading import Thread
import numpy as np 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.gui.actions import ActionManager
from rscder.plugins.basic import BasicPlugin from rscder.plugins.basic import BasicPlugin
from PyQt5.QtWidgets import QAction, QDialog, QHBoxLayout, QVBoxLayout, QPushButton,QWidget,QLabel,QLineEdit,QPushButton,QComboBox from PyQt5.QtWidgets import QAction, QDialog, QHBoxLayout, QVBoxLayout, QPushButton,QWidget,QLabel,QLineEdit,QPushButton,QComboBox,QDialogButtonBox
from PyQt5.QtGui import QIcon,QPixmap from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
from rscder.gui.layercombox import LayerCombox,PairLayerCombox from rscder.gui.layercombox import PairLayerCombox
from rscder.utils.icons import IconInstance from rscder.utils.icons import IconInstance
from rscder.utils.geomath import geo2imageRC, imageRC2geo from rscder.utils.geomath import geo2imageRC
from rscder.utils.project import Project, RasterLayer, PairLayer,ResultPointLayer,MultiBandRasterLayer from rscder.utils.project import Project, PairLayer,ResultPointLayer,MultiBandRasterLayer
from In_one.otsu import OTSU from In_one.otsu import OTSU
from osgeo import gdal from osgeo import gdal
from plugins.In_one import pic from In_one import pic
import math import math
from skimage.filters import rank from skimage.filters import rank
from skimage.morphology import disk, rectangle from skimage.morphology import disk, rectangle
from In_one.scripts.UnsupervisedCD import LSTS,CVA,ACD_
from In_one.scripts.USCD import ACD
def Meanfilter(x_size,y_size,layer:MultiBandRasterLayer): def Meanfilter(x_size,y_size,layer:MultiBandRasterLayer):
x_size = int(x_size) x_size = int(x_size)
y_size = int(y_size) y_size = int(y_size)
@ -281,7 +276,7 @@ def table_layer(pth,layer,name,send_message,dict):
send_message.emit('计算完成') send_message.emit('计算完成')
class LockerButton(QPushButton): class LockerButton(QPushButton):
def __init__(self,parent=NULL): def __init__(self,parent=None):
super(LockerButton,self).__init__(parent) super(LockerButton,self).__init__(parent)
m_imageLabel = QLabel(self) m_imageLabel = QLabel(self)
m_imageLabel.setFixedWidth(20) m_imageLabel.setFixedWidth(20)
@ -408,16 +403,22 @@ class AllInOne(QDialog):
thresholdlayout.addWidget(thresholdWeight) thresholdlayout.addWidget(thresholdWeight)
#确认 #确认
oklayout=QHBoxLayout()
self.ok_button = QPushButton('确定', self) self.ok_button = QPushButton('确定', self)
self.ok_button.setIcon(IconInstance().OK) self.ok_button.setIcon(IconInstance().OK)
self.ok_button.clicked.connect(self.accept) self.ok_button.clicked.connect(self.accept)
self.ok_button.setDefault(True)
self.cancel_button = QPushButton('取消', self) self.cancel_button = QPushButton('取消', self)
self.cancel_button.setIcon(IconInstance().CANCEL) self.cancel_button.setIcon(IconInstance().CANCEL)
self.cancel_button.clicked.connect(self.reject) self.cancel_button.clicked.connect(self.reject)
oklayout.addWidget(self.ok_button,0,alignment=Qt.AlignHCenter) self.cancel_button.setDefault(False)
oklayout.addWidget(self.cancel_button,0,alignment=Qt.AlignHCenter) buttonbox=QDialogButtonBox(self)
buttonbox.addButton(self.ok_button,QDialogButtonBox.NoRole)
buttonbox.addButton(self.cancel_button,QDialogButtonBox.NoRole)
buttonbox.setCenterButtons(True)
#buttonbox.setContentsMargins(,)
totalvlayout=QVBoxLayout() totalvlayout=QVBoxLayout()
@ -425,7 +426,7 @@ class AllInOne(QDialog):
totalvlayout.addLayout(filterlayout) totalvlayout.addLayout(filterlayout)
totalvlayout.addLayout(changelayout) totalvlayout.addLayout(changelayout)
totalvlayout.addLayout(thresholdlayout) totalvlayout.addLayout(thresholdlayout)
totalvlayout.addLayout(oklayout) totalvlayout.addWidget(buttonbox)
totalvlayout.addStretch() totalvlayout.addStretch()
self.setLayout(totalvlayout) self.setLayout(totalvlayout)
@ -473,7 +474,7 @@ class AllInOne(QDialog):
return p return p
class InOnePlugin(BasicPlugin): class InOnePlugin(BasicPlugin):
pre={"均值滤波":Meanfilter}#可添加其他方法 pre={"均值滤波":Meanfilter}#可添加其他方法
cd={'差分法':basic_cd}#可添加其他方法 cd={'差分法':basic_cd,'LSTS':LSTS,'CVA':CVA,'ACD':ACD_}#可添加其他方法
threshold={'OTSU阈值':otsu}#可添加其他方法 threshold={'OTSU阈值':otsu}#可添加其他方法
@ -488,13 +489,12 @@ class InOnePlugin(BasicPlugin):
def set_action(self): def set_action(self):
basic_diff_method_in_one = QAction('差分法') basic_diff_method_in_one = QAction(IconInstance().UNSUPERVISED, '&无监督变化检测')
# 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) # ActionManager().menubar.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)
def run(self): def run(self):
myDialog=AllInOne(list(self.pre.keys()),list(self.cd.keys()),list(self.threshold.keys()),self.mainwindow) myDialog=AllInOne(list(self.pre.keys()),list(self.cd.keys()),list(self.threshold.keys()),self.mainwindow)
myDialog.show() myDialog.show()
@ -521,16 +521,24 @@ class InOnePlugin(BasicPlugin):
self.send_message.emit('{}图像{}'.format(preKey,w.layer_combox.layer1.name)) self.send_message.emit('{}图像{}'.format(preKey,w.layer_combox.layer1.name))
pth2=self.pre[preKey](w.x_size_input.text(),w.y_size_input.text(),w.layer_combox.layer2) pth2=self.pre[preKey](w.x_size_input.text(),w.y_size_input.text(),w.layer_combox.layer2)
self.send_message.emit('{}图像{}'.format(preKey,w.layer_combox.layer2.name)) self.send_message.emit('{}图像{}'.format(preKey,w.layer_combox.layer2.name))
name=name+'_mean_filter' name=name+'_'+preKey
dict['预处理']=[preKey,'|'.format(pth1,pth2)] dict['预处理']=[preKey,'|'.format(pth1,pth2)]
cdpth=None cdpth=None
#变化检测 #变化检测
# if w.cd_select.choose==self.cd[0]: # if w.cd_select.choose==self.cd[0]:
# if w.cd_select.choose=='ACD':
# cdKey='ACD'
# self.send_message.emit('ACD计算中...')
# cdpth=os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(w.layer_combox.layer1.layer_parent.name, int(np.random.rand() * 100000)))
# print(pth1,pth2,cdpth)
# ACD(pth1,pth2,cdpth)
# else:
# pass
cdKey=w.cd_select.choose cdKey=w.cd_select.choose
cdpth=self.cd[cdKey](pth1,pth2,w.layer_combox.layer1.layer_parent,self.send_message) cdpth=self.cd[cdKey](pth1,pth2,w.layer_combox.layer1.layer_parent,self.send_message)
name += '_basic_cd' name += '_'+cdKey
dict['变化检测算法']=[cdKey,cdpth] dict['变化检测算法']=[cdKey,cdpth]
#阈值处理 #阈值处理

12424
plugins/In_one/scripts/USCD.py Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,385 @@
from osgeo import gdal
import math,os
import time
from sklearn.cluster import k_means
from rscder.utils.geomath import geo2imageRC, imageRC2geo
from rscder.utils.project import Project, PairLayer
import numpy as np
from .USCD import ACD
def warp(file,ds:gdal.Dataset,srcWin=[0,0,0,0]):
driver = gdal.GetDriverByName('GTiff')
xsize=ds.RasterXSize
ysize=ds.RasterYSize
geo=ds.GetGeoTransform()
orj=ds.GetProjection()
band=ds.RasterCount
out_ds:gdal.Dataset=driver.Create(file, xsize, ysize, band, gdal.GDT_Byte)
out_ds.SetGeoTransform(geo)
out_ds.SetProjection(orj)
for b in range(1,band+1):
out_ds.GetRasterBand(b).WriteArray(ds.ReadAsArray(*srcWin,band_list=[b]),*(0,0))
del out_ds
def basic_cd(pth1:str,pth2:str,layer_parent:PairLayer,send_message):
ds1:gdal.Dataset=gdal.Open(pth1)
ds2:gdal.Dataset=gdal.Open(pth2)
cell_size = layer_parent.cell_size
xsize = layer_parent.size[0]
ysize = layer_parent.size[1]
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)
geo=layer_parent.grid.geo
proj=layer_parent.grid.proj
out_ds.SetGeoTransform(geo)
out_ds.SetProjection(proj)
max_diff = 0
min_diff = math.inf
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
for j in range(yblocks + 1):#该改这里了
send_message.emit(f'计算{j}/{yblocks}')
block_xy1 = (start1x, start1y+j * cell_size[1])
block_xy2 = (start2x,start2y+j*cell_size[1])
block_xy=(0,j * cell_size[1])
if block_xy1[1] > end1y or block_xy2[1] > end2y:
break
block_size=(xsize, cell_size[1])
block_size1 = (xsize, cell_size[1])
block_size2 = (xsize,cell_size[1])
if block_xy[1] + block_size[1] > ysize:
block_size = (xsize, ysize - block_xy[1])
if block_xy1[1] + block_size1[1] > end1y:
block_size1 = (xsize,end1y - block_xy1[1])
if block_xy2[1] + block_size2[1] > end2y:
block_size2 = (xsize, end2y - block_xy2[1])
block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
block_data2 = ds2.ReadAsArray(*block_xy2, *block_size2)
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)
send_message.emit(f'完成{j}/{yblocks}')
del ds2
del ds1
out_ds.FlushCache()
del out_ds
send_message.emit('归一化概率中...')
temp_in_ds = gdal.Open(out_tif)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(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(geo)
out_normal_ds.SetProjection(proj)
# 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
send_message.emit('差分法计算完成')
return out_normal_tif
def LSTS(pth1:str,pth2:str,layer_parent:PairLayer,send_message,n=5,w_size=(3,3)):
ds1:gdal.Dataset=gdal.Open(pth1)
ds2:gdal.Dataset=gdal.Open(pth2)
cell_size = layer_parent.cell_size
xsize = layer_parent.size[0]
ysize = layer_parent.size[1]
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)
geo=layer_parent.grid.geo
proj=layer_parent.grid.proj
out_ds.SetGeoTransform(geo)
out_ds.SetProjection(proj)
pixnum=w_size[0]*w_size[1]
print('pixnum',pixnum)
max_diff = 0
min_diff = math.inf
win_h=w_size[0]//2 #half hight of window
win_w=w_size[1]//2 #half width of window
a=[[(i+1)**j for j in range(n+1)] for i in range(pixnum)]
A=np.array(a).astype(np.float64)#
k_=np.array(range(1,n+1))
df1=np.zeros(pixnum).astype(np.float64)
df2=np.zeros(pixnum).astype(np.float64)
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
for j in range(yblocks + 1):
send_message.emit(f'计算{j}/{yblocks}')
block_xy1 = (start1x, start1y+j * cell_size[1])
block_xy2 = (start2x,start2y+j*cell_size[1])
block_xy=(0,j * cell_size[1])
if block_xy1[1] > end1y or block_xy2[1] > end2y:
break
block_size=(xsize, cell_size[1])
block_size1 = (xsize, cell_size[1])
block_size2 = (xsize,cell_size[1])
if block_xy[1] + block_size[1] > ysize:
block_size = (xsize, ysize - block_xy[1])
if block_xy1[1] + block_size1[1] > end1y:
block_size1 = (xsize,end1y - block_xy1[1])
if block_xy2[1] + block_size2[1] > end2y:
block_size2 = (xsize, end2y - block_xy2[1])
block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
block_data2 = ds2.ReadAsArray(*block_xy2, *block_size2)
if band == 1:
block_data1 = block_data1[None, ...]
block_data2 = block_data2[None, ...]
# pdb.set_trace()
else:
block_data1=np.mean(block_data1,0)
block_data2=np.mean(block_data2,0)
block_diff=np.zeros(block_data1.shape).astype(np.float64)
for i in range(win_h,block_size1[1]-win_h):
for j_ in range(win_w,block_size1[0]-win_w):
pix=0
#get b
# b1=block_data[i+win_h:i+win_h] c in range(j_-win_w,j_+win_w+1)
b1=block_data1[i-win_h:i+win_h+1,j_-win_w:j_+win_w+1]
b2=block_data2[i-win_h:i+win_h+1,j_-win_w:j_+win_w+1]
b1=[b if (r+1)//2 else b[::-1] for r,b in enumerate(b1)]
b2=[b if (r+1)//2 else b[::-1] for r,b in enumerate(b2)]
b1=np.expand_dims(np.concatenate(b1,0),1)
b2=np.expand_dims(np.concatenate(b2,0),1)
#end get b
x1=np.squeeze(np.linalg.pinv(A).dot(b1))
x2=np.squeeze(np.linalg.pinv(A).dot(b2))
#df
k_=range(1,n+1)
for pix in range(1,pixnum+1):
df1[pix-1]=x1[1:n+1].dot(np.array([k*(pix**(k-1)) for k in k_]))
df2[pix-1]=x2[1:n+1].dot(np.array([k*(pix**(k-1)) for k in k_]))
#distance 欧式距离
block_diff[i][j_]=np.dot(df1-df2,df1-df2)**0.5
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)
send_message.emit(f'完成{j}/{yblocks}')
del ds2
del ds1
out_ds.FlushCache()
del out_ds
send_message.emit('归一化概率中...')
temp_in_ds = gdal.Open(out_tif)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(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(geo)
out_normal_ds.SetProjection(proj)
# 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
send_message.emit('LSTS法计算完成')
return out_normal_tif
def CVA(pth1:str,pth2:str,layer_parent:PairLayer,send_message):
ds1:gdal.Dataset=gdal.Open(pth1)
ds2:gdal.Dataset=gdal.Open(pth2)
cell_size = layer_parent.cell_size
xsize = layer_parent.size[0]
ysize = layer_parent.size[1]
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)
geo=layer_parent.grid.geo
proj=layer_parent.grid.proj
out_ds.SetGeoTransform(geo)
out_ds.SetProjection(proj)
max_diff = 0
min_diff = math.inf
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
for j in range(yblocks + 1):
send_message.emit(f'计算{j}/{yblocks}')
block_xy1 = (start1x, start1y+j * cell_size[1])
block_xy2 = (start2x,start2y+j*cell_size[1])
block_xy=(0,j * cell_size[1])
if block_xy1[1] > end1y or block_xy2[1] > end2y:
break
block_size=(xsize, cell_size[1])
block_size1 = (xsize, cell_size[1])
block_size2 = (xsize,cell_size[1])
if block_xy[1] + block_size[1] > ysize:
block_size = (xsize, ysize - block_xy[1])
if block_xy1[1] + block_size1[1] > end1y:
block_size1 = (xsize,end1y - block_xy1[1])
if block_xy2[1] + block_size2[1] > end2y:
block_size2 = (xsize, end2y - block_xy2[1])
block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
block_data2 = ds2.ReadAsArray(*block_xy2, *block_size2)
if band == 1:
block_data1 = block_data1[None, ...]
block_data2 = block_data2[None, ...]
# pdb.set_trace()
block_diff=np.sum((block_data1-block_data2)**2,0)**0.5
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)
send_message.emit(f'完成{j}/{yblocks}')
del ds2
del ds1
out_ds.FlushCache()
del out_ds
send_message.emit('归一化概率中...')
temp_in_ds = gdal.Open(out_tif)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(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(geo)
out_normal_ds.SetProjection(proj)
# 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
send_message.emit('欧式距离计算完成')
return out_normal_tif
def ACD_(pth1:str,pth2:str,layer_parent:PairLayer,send_message):
xsize = layer_parent.size[0]
ysize = layer_parent.size[1]
geo=layer_parent.grid.geo
proj=layer_parent.grid.proj
#提取公共部分
send_message.emit('提取重叠区域数据.....')
ds2:gdal.Dataset=gdal.Open(pth2)
temp_tif2 = os.path.join(Project().cmi_path,'temp2.tif')
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize])
del ds2
send_message.emit('图像二提取完成')
ds1:gdal.Dataset=gdal.Open(pth1)
temp_tif1 = os.path.join(Project().cmi_path, 'temp1.tif')
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize])
del ds1
send_message.emit('图像一提取完成')
#运算
send_message.emit('开始ACD计算.....')
time.sleep(0.1)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000)))
ACD(temp_tif1,temp_tif2,out_normal_tif)
#添加投影
send_message.emit('录入投影信息.....')
ds=gdal.Open(out_normal_tif)
ds.SetGeoTransform(geo)
ds.SetProjection(proj)
del ds
return out_normal_tif

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,9 +1,10 @@
import os import os
from pickle import TRUE
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 ResultPointLayerCombox from rscder.gui.layercombox import ResultPointLayerCombox
from rscder.plugins.basic import BasicPlugin from rscder.plugins.basic import BasicPlugin
from PyQt5.QtWidgets import QAction, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton,QSlider,QSpinBox,QSpacerItem from PyQt5.QtWidgets import QAction, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton,QSlider,QSpinBox,QSpacerItem,QDialogButtonBox
from PyQt5.QtCore import pyqtSignal,Qt from PyQt5.QtCore import pyqtSignal,Qt
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from rscder.utils.icons import IconInstance from rscder.utils.icons import IconInstance
@ -36,24 +37,20 @@ class RateSetdialog(QDialog):
self.ok_button = QPushButton('确定', self) self.ok_button = QPushButton('确定', self)
self.ok_button.setIcon(IconInstance().OK) self.ok_button.setIcon(IconInstance().OK)
self.ok_button.clicked.connect(self.on_ok) self.ok_button.clicked.connect(self.on_ok)
self.ok_button.setDefault(True)
self.cancel_button = QPushButton('取消', self) self.cancel_button = QPushButton('取消', self)
self.cancel_button.setIcon(IconInstance().CANCEL) self.cancel_button.setIcon(IconInstance().CANCEL)
self.cancel_button.clicked.connect(self.on_cancel) self.cancel_button.clicked.connect(self.on_cancel)
self.cancel_button.setDefault(False)
self.button_layout = QHBoxLayout() self.buttonbox=QDialogButtonBox(self)
okl=QHBoxLayout() self.buttonbox.addButton(self.ok_button,QDialogButtonBox.NoRole)
okl.addWidget(self.ok_button,alignment=Qt.AlignCenter) self.buttonbox.addButton(self.cancel_button,QDialogButtonBox.NoRole)
cll=QHBoxLayout() self.buttonbox.setCenterButtons(True)
cll.addWidget(self.cancel_button,alignment=Qt.AlignCenter)
self.button_layout.addLayout(okl)
self.button_layout.addLayout(cll)
vlayout=QVBoxLayout() vlayout=QVBoxLayout()
vlayout.addLayout(h1) vlayout.addLayout(h1)
vlayout.addWidget(QLabel('设置阈值')) vlayout.addWidget(QLabel('设置阈值'))
vlayout.addLayout(h2) vlayout.addLayout(h2)
vlayout.addLayout(self.button_layout) vlayout.addWidget(self.buttonbox)
self.setLayout(vlayout) self.setLayout(vlayout)
self.old_data = None self.old_data = None

View File

@ -7,7 +7,7 @@ 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,ResultLayercombox, ResultPointLayerCombox from rscder.gui.layercombox import RasterLayerCombox,ResultLayercombox, ResultPointLayerCombox
from PyQt5.QtWidgets import QAction, QFileDialog, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton from PyQt5.QtWidgets import QAction, QFileDialog, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton,QDialogButtonBox
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
from osgeo import gdal from osgeo import gdal
@ -49,10 +49,16 @@ class EvalutationDialog(QDialog):
self.ok_button = QPushButton('确定', self) self.ok_button = QPushButton('确定', self)
self.ok_button.setIcon(IconInstance().OK) self.ok_button.setIcon(IconInstance().OK)
self.ok_button.clicked.connect(self.on_ok) self.ok_button.clicked.connect(self.on_ok)
self.ok_button.setDefault(True)
self.cancel_button = QPushButton('取消', self) self.cancel_button = QPushButton('取消', self)
self.cancel_button.setIcon(IconInstance().CANCEL) self.cancel_button.setIcon(IconInstance().CANCEL)
self.cancel_button.clicked.connect(self.on_cancel) self.cancel_button.clicked.connect(self.on_cancel)
self.cancel_button.setDefault(False)
self.buttonbox=QDialogButtonBox(self)
self.buttonbox.addButton(self.ok_button,QDialogButtonBox.NoRole)
self.buttonbox.addButton(self.cancel_button,QDialogButtonBox.NoRole)
self.buttonbox.setCenterButtons(True)
self.button_layout = QHBoxLayout() self.button_layout = QHBoxLayout()
self.button_layout.addWidget(self.ok_button,0,alignment=Qt.AlignHCenter) self.button_layout.addWidget(self.ok_button,0,alignment=Qt.AlignHCenter)
self.button_layout.addLayout(self.cancel_button,0,alignment=Qt.AlignHCenter) self.button_layout.addLayout(self.cancel_button,0,alignment=Qt.AlignHCenter)

View File

@ -52,7 +52,7 @@ class ActionManager(QtCore.QObject):
self.basic_menu = menubar.addMenu( '&基础工具') self.basic_menu = menubar.addMenu( '&基础工具')
self.filter_menu = self.basic_menu.addMenu(IconInstance().FILTER, '&滤波处理') self.filter_menu = self.basic_menu.addMenu(IconInstance().FILTER, '&滤波处理')
self.change_detection_menu = menubar.addMenu('&通用变化检测') self.change_detection_menu = menubar.addMenu('&通用变化检测')
self.unsupervised_menu = self.change_detection_menu.addMenu(IconInstance().UNSUPERVISED, '&无监督变化检测') # self.unsupervised_menu = self.change_detection_menu.addMenu(IconInstance().UNSUPERVISED, '&无监督变化检测')
self.supervised_menu = self.change_detection_menu.addMenu(IconInstance().SUPERVISED,'&监督变化检测') self.supervised_menu = self.change_detection_menu.addMenu(IconInstance().SUPERVISED,'&监督变化检测')
self.ai_menu = self.change_detection_menu.addMenu(IconInstance().AI_DETECT,'&AI变化检测') self.ai_menu = self.change_detection_menu.addMenu(IconInstance().AI_DETECT,'&AI变化检测')
self.special_chagne_detec_menu = menubar.addMenu( '&专题变化检测') self.special_chagne_detec_menu = menubar.addMenu( '&专题变化检测')

View File

@ -3,7 +3,7 @@ import os
from turtle import width from turtle import width
from osgeo import gdal from osgeo import gdal
from PyQt5.QtWidgets import QWidget, QApplication, QMainWindow, QToolBox from PyQt5.QtWidgets import QWidget, QApplication, QMainWindow, QToolBox
from PyQt5.QtWidgets import QDialog, QFileDialog, QLineEdit, QPushButton, QVBoxLayout, QHBoxLayout, QLabel, QMessageBox,QSpacerItem from PyQt5.QtWidgets import QDialog, QFileDialog, QLineEdit, QPushButton, QVBoxLayout, QHBoxLayout, QLabel, QMessageBox,QSpacerItem,QDialogButtonBox
from PyQt5.QtCore import Qt, QSize,QSettings,pyqtSignal,QThread from PyQt5.QtCore import Qt, QSize,QSettings,pyqtSignal,QThread
from PyQt5.QtGui import QIcon,QColor,QPalette,QPixmap from PyQt5.QtGui import QIcon,QColor,QPalette,QPixmap
from PyQt5 import QtGui from PyQt5 import QtGui
@ -150,11 +150,16 @@ class loader(QDialog):
ok_button.clicked.connect(self.ok) ok_button.clicked.connect(self.ok)
cancel_button.clicked.connect(self.cancel) cancel_button.clicked.connect(self.cancel)
ok_button.setDefault(True)
button_layout = QHBoxLayout() cancel_button.setDefault(False)
button_layout.setDirection(QHBoxLayout.RightToLeft) buttonbox=QDialogButtonBox(self)
button_layout.addWidget(cancel_button, 0, Qt.AlignCenter) buttonbox.addButton(ok_button,QDialogButtonBox.NoRole)
button_layout.addWidget(ok_button, 0, Qt.AlignCenter) buttonbox.addButton(cancel_button,QDialogButtonBox.NoRole)
buttonbox.setCenterButtons(True)
# button_layout = QHBoxLayout()
# button_layout.setDirection(QHBoxLayout.RightToLeft)
# button_layout.addWidget(cancel_button, 0, Qt.AlignCenter)
# button_layout.addWidget(ok_button, 0, Qt.AlignCenter)
main_layout = QVBoxLayout() main_layout = QVBoxLayout()
main_layout.addLayout(path1_layout) main_layout.addLayout(path1_layout)
@ -162,7 +167,8 @@ class loader(QDialog):
main_layout.addLayout(path2_layout) main_layout.addLayout(path2_layout)
main_layout.addLayout(style2_layout) main_layout.addLayout(style2_layout)
main_layout.addLayout(maplayout) main_layout.addLayout(maplayout)
main_layout.addLayout(button_layout) main_layout.addWidget(buttonbox)
# main_layout.addLayout(button_layout)
self.setLayout(main_layout) self.setLayout(main_layout)
def open_file1(self): def open_file1(self):