新增混合编程
This commit is contained in:
parent
872e45937a
commit
89c531a245
@ -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 pdb
|
||||
from threading import Thread
|
||||
import numpy as np
|
||||
# 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
|
||||
from PyQt5.QtGui import QIcon,QPixmap
|
||||
from PyQt5.QtCore import Qt
|
||||
from rscder.gui.layercombox import LayerCombox,PairLayerCombox
|
||||
from PyQt5.QtWidgets import QAction, QDialog, QHBoxLayout, QVBoxLayout, QPushButton,QWidget,QLabel,QLineEdit,QPushButton,QComboBox,QDialogButtonBox
|
||||
from PyQt5.QtGui import QPixmap
|
||||
|
||||
from rscder.gui.layercombox import PairLayerCombox
|
||||
from rscder.utils.icons import IconInstance
|
||||
from rscder.utils.geomath import geo2imageRC, imageRC2geo
|
||||
from rscder.utils.project import Project, RasterLayer, PairLayer,ResultPointLayer,MultiBandRasterLayer
|
||||
from rscder.utils.geomath import geo2imageRC
|
||||
from rscder.utils.project import Project, PairLayer,ResultPointLayer,MultiBandRasterLayer
|
||||
from In_one.otsu import OTSU
|
||||
from osgeo import gdal
|
||||
from plugins.In_one import pic
|
||||
from In_one import pic
|
||||
import math
|
||||
from skimage.filters import rank
|
||||
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):
|
||||
x_size = int(x_size)
|
||||
y_size = int(y_size)
|
||||
@ -281,7 +276,7 @@ def table_layer(pth,layer,name,send_message,dict):
|
||||
send_message.emit('计算完成')
|
||||
|
||||
class LockerButton(QPushButton):
|
||||
def __init__(self,parent=NULL):
|
||||
def __init__(self,parent=None):
|
||||
super(LockerButton,self).__init__(parent)
|
||||
m_imageLabel = QLabel(self)
|
||||
m_imageLabel.setFixedWidth(20)
|
||||
@ -408,24 +403,30 @@ class AllInOne(QDialog):
|
||||
thresholdlayout.addWidget(thresholdWeight)
|
||||
|
||||
#确认
|
||||
oklayout=QHBoxLayout()
|
||||
|
||||
self.ok_button = QPushButton('确定', self)
|
||||
self.ok_button.setIcon(IconInstance().OK)
|
||||
self.ok_button.clicked.connect(self.accept)
|
||||
self.ok_button.setDefault(True)
|
||||
|
||||
|
||||
self.cancel_button = QPushButton('取消', self)
|
||||
self.cancel_button.setIcon(IconInstance().CANCEL)
|
||||
self.cancel_button.clicked.connect(self.reject)
|
||||
oklayout.addWidget(self.ok_button,0,alignment=Qt.AlignHCenter)
|
||||
oklayout.addWidget(self.cancel_button,0,alignment=Qt.AlignHCenter)
|
||||
|
||||
self.cancel_button.setDefault(False)
|
||||
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.addLayout(layerbox)
|
||||
totalvlayout.addLayout(filterlayout)
|
||||
totalvlayout.addLayout(changelayout)
|
||||
totalvlayout.addLayout(thresholdlayout)
|
||||
totalvlayout.addLayout(oklayout)
|
||||
totalvlayout.addWidget(buttonbox)
|
||||
totalvlayout.addStretch()
|
||||
|
||||
self.setLayout(totalvlayout)
|
||||
@ -473,7 +474,7 @@ class AllInOne(QDialog):
|
||||
return p
|
||||
class InOnePlugin(BasicPlugin):
|
||||
pre={"均值滤波":Meanfilter}#可添加其他方法
|
||||
cd={'差分法':basic_cd}#可添加其他方法
|
||||
cd={'差分法':basic_cd,'LSTS':LSTS,'CVA':CVA,'ACD':ACD_}#可添加其他方法
|
||||
threshold={'OTSU阈值':otsu}#可添加其他方法
|
||||
|
||||
|
||||
@ -487,14 +488,13 @@ class InOnePlugin(BasicPlugin):
|
||||
}
|
||||
|
||||
def set_action(self):
|
||||
|
||||
basic_diff_method_in_one = QAction('差分法')
|
||||
# ActionManager().change_detection_menu.addAction(basic_diff_method_in_one)
|
||||
ActionManager().unsupervised_menu.addAction(basic_diff_method_in_one)
|
||||
|
||||
basic_diff_method_in_one = QAction(IconInstance().UNSUPERVISED, '&无监督变化检测')
|
||||
ActionManager().change_detection_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
|
||||
basic_diff_method_in_one.triggered.connect(self.run)
|
||||
|
||||
|
||||
def run(self):
|
||||
myDialog=AllInOne(list(self.pre.keys()),list(self.cd.keys()),list(self.threshold.keys()),self.mainwindow)
|
||||
myDialog.show()
|
||||
@ -521,18 +521,26 @@ class InOnePlugin(BasicPlugin):
|
||||
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)
|
||||
self.send_message.emit('{}图像{}'.format(preKey,w.layer_combox.layer2.name))
|
||||
name=name+'_mean_filter'
|
||||
name=name+'_'+preKey
|
||||
dict['预处理']=[preKey,'|'.format(pth1,pth2)]
|
||||
|
||||
|
||||
cdpth=None
|
||||
#变化检测
|
||||
# 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
|
||||
cdpth=self.cd[cdKey](pth1,pth2,w.layer_combox.layer1.layer_parent,self.send_message)
|
||||
name += '_basic_cd'
|
||||
name += '_'+cdKey
|
||||
dict['变化检测算法']=[cdKey,cdpth]
|
||||
|
||||
|
||||
#阈值处理
|
||||
#例如手动阈值和otsu参数不同,则要做区分
|
||||
thpth=None
|
||||
|
12424
plugins/In_one/scripts/USCD.py
Normal file
12424
plugins/In_one/scripts/USCD.py
Normal file
File diff suppressed because it is too large
Load Diff
385
plugins/In_one/scripts/UnsupervisedCD.py
Normal file
385
plugins/In_one/scripts/UnsupervisedCD.py
Normal 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
|
BIN
plugins/In_one/scripts/_USCD.pyd
Normal file
BIN
plugins/In_one/scripts/_USCD.pyd
Normal file
Binary file not shown.
BIN
plugins/In_one/scripts/opencv_ffmpeg3415_64.dll
Normal file
BIN
plugins/In_one/scripts/opencv_ffmpeg3415_64.dll
Normal file
Binary file not shown.
BIN
plugins/In_one/scripts/opencv_world3415.dll
Normal file
BIN
plugins/In_one/scripts/opencv_world3415.dll
Normal file
Binary file not shown.
@ -1,9 +1,10 @@
|
||||
import os
|
||||
from pickle import TRUE
|
||||
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.QtWidgets import QAction, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton,QSlider,QSpinBox,QSpacerItem,QDialogButtonBox
|
||||
from PyQt5.QtCore import pyqtSignal,Qt
|
||||
from PyQt5.QtGui import QIcon
|
||||
from rscder.utils.icons import IconInstance
|
||||
@ -36,24 +37,20 @@ class RateSetdialog(QDialog):
|
||||
self.ok_button = QPushButton('确定', self)
|
||||
self.ok_button.setIcon(IconInstance().OK)
|
||||
self.ok_button.clicked.connect(self.on_ok)
|
||||
|
||||
self.ok_button.setDefault(True)
|
||||
self.cancel_button = QPushButton('取消', self)
|
||||
self.cancel_button.setIcon(IconInstance().CANCEL)
|
||||
self.cancel_button.clicked.connect(self.on_cancel)
|
||||
|
||||
self.button_layout = QHBoxLayout()
|
||||
okl=QHBoxLayout()
|
||||
okl.addWidget(self.ok_button,alignment=Qt.AlignCenter)
|
||||
cll=QHBoxLayout()
|
||||
cll.addWidget(self.cancel_button,alignment=Qt.AlignCenter)
|
||||
self.button_layout.addLayout(okl)
|
||||
self.button_layout.addLayout(cll)
|
||||
|
||||
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)
|
||||
vlayout=QVBoxLayout()
|
||||
vlayout.addLayout(h1)
|
||||
vlayout.addWidget(QLabel('设置阈值'))
|
||||
vlayout.addLayout(h2)
|
||||
vlayout.addLayout(self.button_layout)
|
||||
vlayout.addWidget(self.buttonbox)
|
||||
self.setLayout(vlayout)
|
||||
|
||||
self.old_data = None
|
||||
|
@ -7,7 +7,7 @@ import numpy as np
|
||||
from rscder.gui.actions import ActionManager
|
||||
from rscder.plugins.basic import BasicPlugin
|
||||
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.QtCore import Qt
|
||||
from osgeo import gdal
|
||||
@ -49,10 +49,16 @@ class EvalutationDialog(QDialog):
|
||||
self.ok_button = QPushButton('确定', self)
|
||||
self.ok_button.setIcon(IconInstance().OK)
|
||||
self.ok_button.clicked.connect(self.on_ok)
|
||||
|
||||
self.ok_button.setDefault(True)
|
||||
self.cancel_button = QPushButton('取消', self)
|
||||
self.cancel_button.setIcon(IconInstance().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.addWidget(self.ok_button,0,alignment=Qt.AlignHCenter)
|
||||
self.button_layout.addLayout(self.cancel_button,0,alignment=Qt.AlignHCenter)
|
||||
|
@ -52,7 +52,7 @@ class ActionManager(QtCore.QObject):
|
||||
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.unsupervised_menu = self.change_detection_menu.addMenu(IconInstance().UNSUPERVISED, '&无监督变化检测')
|
||||
self.supervised_menu = self.change_detection_menu.addMenu(IconInstance().SUPERVISED,'&监督变化检测')
|
||||
self.ai_menu = self.change_detection_menu.addMenu(IconInstance().AI_DETECT,'&AI变化检测')
|
||||
self.special_chagne_detec_menu = menubar.addMenu( '&专题变化检测')
|
||||
|
@ -3,7 +3,7 @@ import os
|
||||
from turtle import width
|
||||
from osgeo import gdal
|
||||
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.QtGui import QIcon,QColor,QPalette,QPixmap
|
||||
from PyQt5 import QtGui
|
||||
@ -150,11 +150,16 @@ class loader(QDialog):
|
||||
|
||||
ok_button.clicked.connect(self.ok)
|
||||
cancel_button.clicked.connect(self.cancel)
|
||||
|
||||
button_layout = QHBoxLayout()
|
||||
button_layout.setDirection(QHBoxLayout.RightToLeft)
|
||||
button_layout.addWidget(cancel_button, 0, Qt.AlignCenter)
|
||||
button_layout.addWidget(ok_button, 0, Qt.AlignCenter)
|
||||
ok_button.setDefault(True)
|
||||
cancel_button.setDefault(False)
|
||||
buttonbox=QDialogButtonBox(self)
|
||||
buttonbox.addButton(ok_button,QDialogButtonBox.NoRole)
|
||||
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.addLayout(path1_layout)
|
||||
@ -162,7 +167,8 @@ class loader(QDialog):
|
||||
main_layout.addLayout(path2_layout)
|
||||
main_layout.addLayout(style2_layout)
|
||||
main_layout.addLayout(maplayout)
|
||||
main_layout.addLayout(button_layout)
|
||||
main_layout.addWidget(buttonbox)
|
||||
# main_layout.addLayout(button_layout)
|
||||
self.setLayout(main_layout)
|
||||
|
||||
def open_file1(self):
|
||||
|
Loading…
x
Reference in New Issue
Block a user