137 lines
5.4 KiB
Python
137 lines
5.4 KiB
Python
# -*- coding: UTF-8 -*-
|
||
"""
|
||
@Project:__init__.py
|
||
@File:pspHAAlphaDecomposition.py Cloude-Pottier分解
|
||
@Function: Cloude-Pottier eigenvector/eigenvalue based decomposition of a 3x3 coherency matrix [T3]
|
||
(Averaging using a sliding window)
|
||
V1.0.1:(1)可选分解特征;(2)bin转tif格式
|
||
@Contact:
|
||
@Author:SHJ
|
||
@Date:2021/9/24 9:06
|
||
@Version:1.0.1
|
||
"""
|
||
|
||
import os
|
||
import shutil
|
||
import subprocess
|
||
import logging
|
||
|
||
logger = logging.getLogger("mylog")
|
||
|
||
|
||
class PspCloudePottierDecomposition:
|
||
"""
|
||
调用polsarpro4.2.0的Cloude-Pottier极化分解 h_a_alpha_decomposition_T3.exe
|
||
"""
|
||
|
||
def __init__(
|
||
self,
|
||
exeDir,
|
||
inT3Dir,
|
||
outDir,
|
||
exeDecomposeName='h_a_alpha_decomposition_T3.exe'):
|
||
"""
|
||
:param exeDir:exe所在目录
|
||
:param inT3Dir:T3矩阵目录
|
||
:param outDir:输出目录
|
||
"""
|
||
self.__exeName = exeDecomposeName
|
||
self.__exeDir = exeDir
|
||
self.__inT3Dir = inT3Dir
|
||
self.__outDir = outDir
|
||
self.__DecompostFlag = False
|
||
pass
|
||
|
||
def api_h_a_alpha_decomposition_T3(
|
||
self,
|
||
rectX,
|
||
rectY,
|
||
rectWidth,
|
||
rectHeight,
|
||
Nwin=1):
|
||
"""
|
||
:param rectX:有效区域x
|
||
:param rectY:有效区域y
|
||
:param rectWidth:有效区域宽
|
||
:param rectHeight:有效区域高
|
||
:param Nwin :Size of the (Nwin, Nwin) sliding window used to compute local estimates. (int)
|
||
"""
|
||
if self.__DecompostFlag:
|
||
return True
|
||
if len(self.__exeDir) == 0:
|
||
if not os.path.exists(self.__exeName):
|
||
logger.error(self.__exeName + ' not exists.')
|
||
return False
|
||
exePath = self.__exeName
|
||
else:
|
||
if not os.path.exists(self.__exeDir + '\\' + self.__exeName):
|
||
logger.error(self.__exeName + ' not exists.')
|
||
return False
|
||
exePath = self.__exeDir + '\\' + self.__exeName
|
||
|
||
if not self._checkT3Matrix(self.__inT3Dir):
|
||
logger.error('T3 Matrix check failed.')
|
||
return False
|
||
if not os.path.exists(self.__outDir):
|
||
os.makedirs(self.__outDir)
|
||
|
||
alpbetdelgam = 1
|
||
Lambda = 1
|
||
alpha = 1
|
||
entropy = 1
|
||
anisotropy = 1
|
||
|
||
CombHA = 0
|
||
CombH1mA = 0
|
||
Comb1mHA = 0
|
||
Comb1mH1mA = 0
|
||
|
||
Off_lig = rectX
|
||
Off_col = rectY
|
||
Sub_Nlig = rectWidth
|
||
Sub_Ncol = rectHeight
|
||
|
||
para_list = [exePath, self.__inT3Dir, self.__outDir, Nwin, Off_lig, Off_col, Sub_Nlig, Sub_Ncol, alpbetdelgam,
|
||
Lambda, alpha, entropy, anisotropy, CombHA, CombH1mA, Comb1mHA, Comb1mH1mA]
|
||
cmd = "h_a_alpha_decomposition_T3.exe -id {} -od {} -iodf T3 -nwr 1 -nwc 1 -ofr 0 -ofc 0 -fnr {} " \
|
||
"-fnc {} -fl1 {} -fl2 {} -fl3 {} -fl4 {} -fl5 {} -fl6 {} -fl7 {} -fl8 {} -fl9 {}".format(self.__inT3Dir,
|
||
self.__outDir,
|
||
Sub_Nlig,
|
||
Sub_Ncol,
|
||
alpbetdelgam,
|
||
Lambda,
|
||
alpha,
|
||
entropy,
|
||
anisotropy,
|
||
CombHA,
|
||
CombH1mA,
|
||
Comb1mHA,
|
||
Comb1mH1mA)
|
||
|
||
logger.info('h_a_alpha_decomposition:{}'.format(cmd))
|
||
result = os.system(cmd)
|
||
logger.info('cmd_result:{}'.format(result))
|
||
logger.info('h_a_alpha_decomposition finish!')
|
||
# cmd = " ".join(str(i) for i in para_list)
|
||
config_path = os.path.join(self.__inT3Dir, 'config.txt')
|
||
shutil.copyfile(config_path, os.path.join(self.__outDir, 'config.txt'))
|
||
# result_tuple = subprocess.getstatusoutput(cmd)
|
||
|
||
# if result_tuple[0] != 1 or result_tuple[1].find('error') != -1:
|
||
# raise Exception(result_tuple[1])
|
||
self.__DecompostFlag = True
|
||
return True
|
||
|
||
@staticmethod
|
||
def _checkT3Matrix(T3Dir):
|
||
# 检测T3矩阵
|
||
if not os.path.exists(T3Dir):
|
||
return False
|
||
file_name_in_out = ['T11.bin', 'T12_real.bin', 'T12_imag.bin',
|
||
'T13_real.bin', 'T13_imag.bin', 'T22.bin',
|
||
'T23_real.bin', 'T23_imag.bin', 'T33.bin']
|
||
for item in file_name_in_out:
|
||
if not os.path.exists(T3Dir + "\\" + item):
|
||
return False
|
||
return True
|