import glob,os
import numpy as np
from osgeo import gdal
gdal.UseExceptions()
from polsartools.utils.utils import time_it,mlook_arr
from polsartools.utils.io_utils import write_T3, write_C3
def read_rs2_tif(file):
ds = gdal.Open(file)
band1 = ds.GetRasterBand(1).ReadAsArray()
band2 = ds.GetRasterBand(2).ReadAsArray()
ds=None
return np.dstack((band1,band2))
def write_s2_bin(file,wdata):
[cols, rows] = wdata.shape
driver = gdal.GetDriverByName("ENVI")
outdata = driver.Create(file, rows, cols, 1, gdal.GDT_CFloat32)
outdata.SetDescription(file)
outdata.GetRasterBand(1).WriteArray(wdata)
outdata.FlushCache()
def read_bin(file):
ds = gdal.Open(file,gdal.GA_ReadOnly)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()
return arr
def write_bin_s2(file,wdata,refData):
# ds = gdal.Open(refData)
[cols, rows] = wdata.shape
driver = gdal.GetDriverByName("ENVI")
outdata = driver.Create(file, rows, cols, 1, gdal.GDT_Float32)
# outdata.SetGeoTransform(ds.GetGeoTransform())##sets same geotransform as input
# outdata.SetProjection(ds.GetProjection())##sets same projection as input
outdata.SetDescription(file)
outdata.GetRasterBand(1).WriteArray(wdata)
# outdata.GetRasterBand(1).SetNoDataValue(np.NaN)##if you want these values transparent
outdata.FlushCache() ##saves to disk!!
def write_bin(file,wdata):
# ds = gdal.Open(refData)
[cols, rows] = wdata.shape
driver = gdal.GetDriverByName("ENVI")
outdata = driver.Create(file, rows, cols, 1, gdal.GDT_Float32)
# outdata.SetGeoTransform(ds.GetGeoTransform())##sets same geotransform as input
# outdata.SetProjection(ds.GetProjection())##sets same projection as input
outdata.SetDescription(file)
outdata.GetRasterBand(1).WriteArray(wdata)
# outdata.GetRasterBand(1).SetNoDataValue(np.NaN)##if you want these values transparent
outdata.FlushCache() ##saves to disk!!
[docs]
@time_it
def chyaan2_fp(inFolder,matrixType='T3',azlks=None,rglks=None):
"""
Extracts specified matrix elements (S2, T3, or C3) from Chandrayaan-II DFSAR Full-Pol data
and saves them into respective directories.
Example:
--------
>>> chyaan2_fp("path_to_folder", matrix='T3', azlks=5, rglks=3)
This will extract the T3 matrix elements from the Chandrayaan-II DFSAR Full-Pol data
in the specified folder and save them in the 'T3' directory.
Parameters:
-----------
inFolder : str
The path to the folder containing the Chandrayaan-II DFSAR Full-Pol data files.
matrixType : str, optional (default='T3')
The type of matrix to extract. Can either be 'S2', 'T3', or 'C3'.
- 'S2' will extract the S2 matrix elements.
- 'T3' will extract the T3 matrix elements.
- 'C3' will extract the C3 matrix elements.
azlks : int, optional (default=None)
The number of azimuth looks for multi-looking. If not specified, the value is derived from
the ground range and output line spacing.
rglks : int, optional (default=None)
The number of range looks for multi-looking. If not specified, the value is set to 1.
Returns:
--------
None
The function does not return any value. Instead, it creates a folder named `S2`, `T3`, or `C3`
(depending on the chosen matrix) and saves the corresponding binary files.
- For 'S2':
- `s11.bin`: Contains the S11 matrix elements.
- `s12.bin`: Contains the S12 matrix elements.
- `s21.bin`: Contains the S21 matrix elements.
- `s22.bin`: Contains the S22 matrix elements.
- `config.txt`: Contains metadata including multilook parameters.
- `multilook_info.txt`: Contains detailed information about the multilook parameters.
- For 'T3':
- `t11.bin`, `t12.bin`, `t13.bin`, `t22.bin`, `t23.bin`, `t33.bin`: Contain the T3 matrix elements.
- `config.txt`: Contains metadata including multilook parameters.
- `multilook_info.txt`: Contains detailed information about the multilook parameters.
- For 'C3':
- `c11.bin`, `c12.bin`, `c13.bin`, `c22.bin`, `c23.bin`, `c33.bin`: Contain the C3 matrix elements.
- `config.txt`: Contains metadata including multilook parameters.
- `multilook_info.txt`: Contains detailed information about the multilook parameters.
Raises:
-------
FileNotFoundError
If the required files for the specified matrix type cannot be found in the folder.
ValueError
If an invalid matrix type is provided (valid options are 'S2', 'T3', or 'C3').
"""
#%%
xmlFile = glob.glob(inFolder+'/data/calibrated/*/*sli*.xml')[0]
fxml = open(xmlFile, 'r')
for line in fxml:
if "output_line_spacing" in line:
# print("output_line_spacing: ", line.split('>')[1].split('<')[0])
ols = float(line.split('>')[1].split('<')[0])
if "output_pixel_spacing" in line:
# print("output_pixel_spacing: ", line.split('>')[1].split('<')[0])
ops = float(line.split('>')[1].split('<')[0])
if "isda:incidence_angle" in line:
# print("incidence_angle: ", line.split('>')[1].split('<')[0])
inc= float( line.split('>')[1].split('<')[0])
if "isda:calibration_constant" in line:
cc = float( line.split('>')[1].split('<')[0])
if "isda:pulse_bandwidth" in line:
bw = float( line.split('>')[1].split('<')[0])/1000000
fxml.close()
gRange = ops/np.sin(inc*np.pi/180)
# multi-llok factor
mlf = int(np.round(gRange/ols,0))
ds = gdal.Open(glob.glob(inFolder+'/data/calibrated/*/*sli*_hh_*.tif')[0])
cols = ds.RasterXSize
rows = ds.RasterYSize
lines = ['output_line_spacing '+ str(ols)+'\n',
'output_pixel_spacing '+ str(ops)+'\n',
'ground_range '+ str(gRange)+'\n',
'mlook_factor '+ str(mlf)+'\n',
'incidence_angle '+ str(inc)+'\n',
'calibration_constant '+str(cc)+'\n',
'pulse_bandwidth '+str(bw)+'\n',
'lines '+ str(rows)+'\n',
'samples '+str(cols)+'\n'
]
calFactor = 1/np.sqrt(10**(cc/10))
if matrixType == 'S2':
out_dir = os.path.join(inFolder,"S2")
os.makedirs(out_dir,exist_ok=True)
print("Considering S12 = S21")
inFile = glob.glob(os.path.join(inFolder, 'data/calibrated/*/*sli*_hh_*.tif'))[0]
data = read_rs2_tif(inFile)
out_file = os.path.join(out_dir,'s11.bin')
write_s2_bin(out_file,data[:,:,0]*calFactor+1j*(data[:,:,1]*calFactor))
print("Saved file "+out_file)
rows, cols, _ = data.shape
inFile = glob.glob(os.path.join(inFolder, 'data/calibrated/*/*sli*_hv_*.tif'))[0]
data_xy = read_rs2_tif(inFile)
inFile = glob.glob(os.path.join(inFolder, 'data/calibrated/*/*sli*_vh_*.tif'))[0]
data_yx = read_rs2_tif(inFile)
data = (data_xy+data_yx)*0.5
del data_xy,data_yx
out_file = os.path.join(out_dir,'s12.bin')
write_s2_bin(out_file,data[:,:,0]*calFactor+1j*(data[:,:,1]*calFactor))
print("Saved file "+out_file)
out_file = os.path.join(out_dir,'s21.bin')
write_s2_bin(out_file,data[:,:,0]*calFactor+1j*(data[:,:,1]*calFactor))
print("Saved file "+out_file)
inFile = glob.glob(os.path.join(inFolder, 'data/calibrated/*/*sli*_vv_*.tif'))[0]
data = read_rs2_tif(inFile)
out_file = os.path.join(out_dir,'s22.bin')
write_s2_bin(out_file,data[:,:,0]*calFactor+1j*(data[:,:,1]*calFactor))
print("Saved file "+out_file)
file = open(out_dir +'/config.txt',"w+")
file.write('Nrow\n%d\n---------\nNcol\n%d\n---------\nPolarCase\nmonostatic\n---------\nPolarType\nfull'%(rows,cols))
file.close()
with open(out_dir+'/multilook_info.txt', 'w+') as f:
f.writelines(lines)
f.close()
elif matrixType == 'T3':
# print("Considering S12 = S21")
inFile = glob.glob(os.path.join(inFolder, 'data/calibrated/*/*sli*_hh_*.tif'))[0]
data = read_rs2_tif(inFile)
s11 = data[:,:,0]*calFactor+1j*(data[:,:,1]*calFactor)
inFile = glob.glob(os.path.join(inFolder, 'data/calibrated/*/*sli*_hv_*.tif'))[0]
data_xy = read_rs2_tif(inFile)
inFile = glob.glob(os.path.join(inFolder, 'data/calibrated/*/*sli*_vh_*.tif'))[0]
data_yx = read_rs2_tif(inFile)
# Symmetry assumption
data = (data_xy+data_yx)*0.5
del data_xy,data_yx
s12 = data[:,:,0]*calFactor+1j*(data[:,:,1]*calFactor)
inFile = glob.glob(os.path.join(inFolder, 'data/calibrated/*/*sli*_vv_*.tif'))[0]
data = read_rs2_tif(inFile)
s22 = data[:,:,0]*calFactor+1j*(data[:,:,1]*calFactor)
# Kp- 3-D Pauli feature vector
Kp = (1/np.sqrt(2))*np.array([s11+s22, s11-s22, 2*s12])
del s11,s12,s22
if azlks == None and rglks == None:
azlks = mlf
rglks = 1
print(f'Using multi-look factor: azlks = {azlks}, rglks = {rglks}')
# 3x3 Pauli Coherency Matrix elements
T11 = mlook_arr(np.abs(Kp[0])**2,azlks,rglks).astype(np.float32)
T22 = mlook_arr(np.abs(Kp[1])**2,azlks,rglks).astype(np.float32)
T33 = mlook_arr(np.abs(Kp[2])**2,azlks,rglks).astype(np.float32)
T12 = mlook_arr(Kp[0]*np.conj(Kp[1]),azlks,rglks).astype(np.complex64)
T13 = mlook_arr(Kp[0]*np.conj(Kp[2]),azlks,rglks).astype(np.complex64)
T23 = mlook_arr(Kp[1]*np.conj(Kp[2]),azlks,rglks).astype(np.complex64)
del Kp
T3Folder = os.path.join(inFolder,'T3')
if not os.path.isdir(T3Folder):
print("T3 folder does not exist. \nCreating folder {}".format(T3Folder))
os.mkdir(T3Folder)
# write_T3(np.dstack([T11,T12,T13,np.conjugate(T12),T22,T23,np.conjugate(T13),np.conjugate(T23),T33]),T3Folder)
write_T3([np.real(T11),np.real(T12),np.imag(T12),np.real(T13),np.imag(T13),
np.real(T22),np.real(T23),np.imag(T23),
np.real(T33)],T3Folder)
with open(T3Folder+'/multilook_info.txt', 'w+') as f:
f.writelines(lines)
f.close()
elif matrixType == 'C3':
# print("Considering S12 = S21")
inFile = glob.glob(os.path.join(inFolder, 'data/calibrated/*/*sli*_hh_*.tif'))[0]
data = read_rs2_tif(inFile)
s11 = data[:,:,0]*calFactor+1j*(data[:,:,1]*calFactor)
inFile = glob.glob(os.path.join(inFolder, 'data/calibrated/*/*sli*_hv_*.tif'))[0]
data_xy = read_rs2_tif(inFile)
inFile = glob.glob(os.path.join(inFolder, 'data/calibrated/*/*sli*_vh_*.tif'))[0]
data_yx = read_rs2_tif(inFile)
# Symmetry assumption
data = (data_xy+data_yx)*0.5
del data_xy,data_yx
s12 = data[:,:,0]*calFactor+1j*(data[:,:,1]*calFactor)
inFile = glob.glob(os.path.join(inFolder, 'data/calibrated/*/*sli*_vv_*.tif'))[0]
data = read_rs2_tif(inFile)
s22 = data[:,:,0]*calFactor+1j*(data[:,:,1]*calFactor)
# Kl- 3-D Lexicographic feature vector
Kl = np.array([s11, np.sqrt(2)*s12, s22])
del s11,s12,s22
if azlks == None and rglks == None:
azlks = mlf
rglks = 1
print(f'Using multi-look factor: azlks = {azlks}, rglks = {rglks}')
# 3x3 COVARIANCE Matrix elements
C11 = mlook_arr(np.abs(Kl[0])**2,azlks,rglks).astype(np.float32)
C22 = mlook_arr(np.abs(Kl[1])**2,azlks,rglks).astype(np.float32)
C33 = mlook_arr(np.abs(Kl[2])**2,azlks,rglks).astype(np.float32)
C12 = mlook_arr(Kl[0]*np.conj(Kl[1]),azlks,rglks).astype(np.complex64)
C13 = mlook_arr(Kl[0]*np.conj(Kl[2]),azlks,rglks).astype(np.complex64)
C23 = mlook_arr(Kl[1]*np.conj(Kl[2]),azlks,rglks).astype(np.complex64)
C3Folder = os.path.join(inFolder,'C3')
if not os.path.isdir(C3Folder):
print("C3 folder does not exist. \nCreating folder {}".format(C3Folder))
os.mkdir(C3Folder)
# write_C3(np.dstack([C11,C12,C13,np.conjugate(C12),C22,C23,np.conjugate(C13),np.conjugate(C23),C33]),C3Folder)
write_C3([np.real(C11),np.real(C12),np.imag(C12),np.real(C13),np.imag(C13),
np.real(C22),np.real(C23),np.imag(C23),
np.real(C33)],C3Folder)
with open(C3Folder+'/multilook_info.txt', 'w+') as f:
f.writelines(lines)
f.close()
else:
raise ValueError('Invalid matrix type. Valid types are "S2", "T3" and "C3"')