133 lines
3.8 KiB
Python
133 lines
3.8 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 = 1
|
|||
|
CombH1mA = 1
|
|||
|
Comb1mHA = 1
|
|||
|
Comb1mH1mA = 1
|
|||
|
|
|||
|
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 = " ".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
|