/******************************************************************** PolSARpro v5.0 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 (1991) of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License (Version 2, 1991) for more details ********************************************************************* File : yamaguchi_3components_decomposition.c Project : ESA_POLSARPRO-SATIM Authors : Eric POTTIER, Jacek STRZELCZYK Version : 2.0 Creation : 07/2015 Update : *-------------------------------------------------------------------- INSTITUT D'ELECTRONIQUE et de TELECOMMUNICATIONS de RENNES (I.E.T.R) UMR CNRS 6164 Waves and Signal department SHINE Team UNIVERSITY OF RENNES I Bât. 11D - Campus de Beaulieu 263 Avenue Général Leclerc 35042 RENNES Cedex Tel :(+33) 2 23 23 57 63 Fax :(+33) 2 23 23 69 63 e-mail: eric.pottier@univ-rennes1.fr *-------------------------------------------------------------------- Description : Yamaguchi 3 components Decomposition ********************************************************************/ #include #include #include #include #include "omp.h" #ifdef _WIN32 #include #include #endif /* ROUTINES DECLARATION */ #include "../lib/PolSARproLib.h" /******************************************************************** ********************************************************************* * * -- Function : Main * ********************************************************************* ********************************************************************/ int main(int argc, char *argv[]) { #define NPolType 3 /* LOCAL VARIABLES */ FILE *out_odd, *out_dbl, *out_vol; int Config; char *PolTypeConf[NPolType] = {"S2", "C3", "T3"}; char file_name[FilePathLength]; /* Internal variables */ int ii, lig, col; int ligDone = 0; float Span, SpanMin, SpanMax; float CC11, CC13_re, CC13_im, CC22, CC33; float FS, FD, FV; float ALPre, ALPim, BETre, BETim; float HHHH,HVHV,VVVV; float HHVVre, HHVVim; float rtemp, ratio; /* Matrix arrays */ float ***M_in; float **M_avg; float **M_odd; float **M_dbl; float **M_vol; /******************************************************************** ********************************************************************/ /* USAGE */ strcpy(UsageHelp,"\nyamaguchi_3components_decomposition.exe\n"); strcat(UsageHelp,"\nParameters:\n"); strcat(UsageHelp," (string) -id input directory\n"); strcat(UsageHelp," (string) -od output directory\n"); strcat(UsageHelp," (string) -iodf input-output data format\n"); strcat(UsageHelp," (int) -nwr Nwin Row\n"); strcat(UsageHelp," (int) -nwc Nwin Col\n"); strcat(UsageHelp," (int) -ofr Offset Row\n"); strcat(UsageHelp," (int) -ofc Offset Col\n"); strcat(UsageHelp," (int) -fnr Final Number of Row\n"); strcat(UsageHelp," (int) -fnc Final Number of Col\n"); strcat(UsageHelp,"\nOptional Parameters:\n"); strcat(UsageHelp," (string) -mask mask file (valid pixels)\n"); strcat(UsageHelp," (string) -errf memory error file\n"); strcat(UsageHelp," (noarg) -help displays this message\n"); strcat(UsageHelp," (noarg) -data displays the help concerning Data Format parameter\n"); /******************************************************************** ********************************************************************/ strcpy(UsageHelpDataFormat,"\nPolarimetric Input-Output Data Format\n\n"); for (ii=0; ii 2) {printf("%f\r", 100. * Nb / (NbBlock - 1));fflush(stdout);} if (FlagValid == 1) read_block_matrix_float(in_valid, Valid, Nb, NbBlock, NligBlock[Nb], Sub_Ncol, NwinL, NwinC, Off_lig, Off_col, Ncol); if (strcmp(PolType,"S2")==0) { read_block_S2_noavg(in_datafile, M_in, PolTypeOut, NpolarOut, Nb, NbBlock, NligBlock[Nb], Sub_Ncol, NwinL, NwinC, Off_lig, Off_col, Ncol); } else { /* Case of C,T or I */ read_block_TCI_noavg(in_datafile, M_in, NpolarOut, Nb, NbBlock, NligBlock[Nb], Sub_Ncol, NwinL, NwinC, Off_lig, Off_col, Ncol); } if (strcmp(PolTypeOut,"T3")==0) T3_to_C3(M_in, NligBlock[Nb], Sub_Ncol + NwinC, 0, 0); #pragma omp parallel for private(col, M_avg) firstprivate(Span) shared(ligDone, SpanMin, SpanMax) for (lig = 0; lig < NligBlock[Nb]; lig++) { ligDone++; if (omp_get_thread_num() == 0) PrintfLine(ligDone,NligBlock[Nb]); M_avg = matrix_float(NpolarOut,Sub_Ncol); average_TCI(M_in, Valid, NpolarOut, M_avg, lig, Sub_Ncol, NwinL, NwinC, NwinLM1S2, NwinCM1S2); for (col = 0; col < Sub_Ncol; col++) { if (Valid[NwinLM1S2+lig][NwinCM1S2+col] == 1.) { Span = M_avg[C311][col]+M_avg[C322][col]+M_avg[C333][col]; if (Span >= SpanMax) SpanMax = Span; if (Span <= SpanMin) SpanMin = Span; } } free_matrix_float(M_avg,NpolarOut); } } // NbBlock if (SpanMin < eps) SpanMin = eps; /******************************************************************** ********************************************************************/ /* DATA PROCESSING */ for (Np = 0; Np < NpolarIn; Np++) rewind(in_datafile[Np]); if (FlagValid == 1) rewind(in_valid); for (Nb = 0; Nb < NbBlock; Nb++) { ligDone = 0; if (NbBlock > 2) {printf("%f\r", 100. * Nb / (NbBlock - 1));fflush(stdout);} if (FlagValid == 1) read_block_matrix_float(in_valid, Valid, Nb, NbBlock, NligBlock[Nb], Sub_Ncol, NwinL, NwinC, Off_lig, Off_col, Ncol); if (strcmp(PolType,"S2")==0) { read_block_S2_noavg(in_datafile, M_in, PolTypeOut, NpolarOut, Nb, NbBlock, NligBlock[Nb], Sub_Ncol, NwinL, NwinC, Off_lig, Off_col, Ncol); } else { /* Case of C,T or I */ read_block_TCI_noavg(in_datafile, M_in, NpolarOut, Nb, NbBlock, NligBlock[Nb], Sub_Ncol, NwinL, NwinC, Off_lig, Off_col, Ncol); } if (strcmp(PolTypeOut,"T3")==0) T3_to_C3(M_in, NligBlock[Nb], Sub_Ncol + NwinC, 0, 0); CC11 = CC13_re = CC13_im = CC22 = CC33 = FS = FD = FV = 0.; ALPre = ALPim = BETre = BETim = 0.; HHHH = HVHV = VVVV = HHVVre = HHVVim = rtemp = ratio = 0.; #pragma omp parallel for private(col, M_avg) firstprivate(CC11, CC13_re, CC13_im, CC22, CC33, FS, FD, FV, ALPre, ALPim, BETre, BETim, HHHH, HVHV, VVVV, HHVVre, HHVVim, rtemp, ratio) shared(ligDone) for (lig = 0; lig < NligBlock[Nb]; lig++) { ligDone++; if (omp_get_thread_num() == 0) PrintfLine(ligDone,NligBlock[Nb]); M_avg = matrix_float(NpolarOut,Sub_Ncol); average_TCI(M_in, Valid, NpolarOut, M_avg, lig, Sub_Ncol, NwinL, NwinC, NwinLM1S2, NwinCM1S2); for (col = 0; col < Sub_Ncol; col++) { if (Valid[NwinLM1S2+lig][NwinCM1S2+col] == 1.) { CC11 = M_avg[C311][col]; CC13_re = M_avg[C313_re][col]; CC13_im = M_avg[C313_im][col]; CC22 = M_avg[C322][col]; CC33 = M_avg[C333][col]; HHHH = CC11; HVHV = CC22 / 2.; VVVV = CC33; HHVVre = CC13_re; HHVVim = CC13_im; /*Freeman - Yamaguchi algorithm*/ ratio = 10.*log10(VVVV/HHHH); if (ratio <= -2.) { FV = 15. * HVHV / 4.; HHHH = HHHH - 8.*FV/15.; VVVV = VVVV - 3.*FV/15.; HHVVre = HHVVre - 2.*FV / 15.; } if (ratio > 2.) { FV = 15. * HVHV / 4.; HHHH = HHHH - 3.*FV/15.; VVVV = VVVV - 8.*FV/15.; HHVVre = HHVVre - 2.*FV / 15.; } if ((ratio > -2.)&&(ratio <= 2.)) { FV = 8. * HVHV / 2.; HHHH = HHHH - 3.*FV/8.; VVVV = VVVV - 3.*FV/8.; HHVVre = HHVVre - 1.*FV / 8.; } /*Case 1: Volume Scatter > Total*/ if ((HHHH <= eps) || (VVVV <= eps)) { FD = 0.; FS = 0.; if ((ratio > -2.)&&(ratio <= 2.)) FV = (HHHH + 3.*FV/8.) + HVHV + (VVVV + 3.*FV/8.); if (ratio <= -2.) FV = (HHHH + 8.*FV/15.) + HVHV + (VVVV + 3.*FV/15.); if (ratio > 2.) FV = (HHHH + 3.*FV/15.) + HVHV + (VVVV + 8.*FV/15.); } else { /*Data conditionning for non realizable ShhSvv* term*/ if ((HHVVre * HHVVre + HHVVim * HHVVim) > HHHH * VVVV) { rtemp = HHVVre * HHVVre + HHVVim * HHVVim; HHVVre = HHVVre * sqrt(HHHH * VVVV / rtemp); HHVVim = HHVVim * sqrt(HHHH * VVVV / rtemp); } /*Odd Bounce*/ if (HHVVre >= 0.) { ALPre = -1.; ALPim = 0.; FD = (HHHH * VVVV - HHVVre * HHVVre - HHVVim * HHVVim) / (HHHH + VVVV + 2 * HHVVre); FS = VVVV - FD; BETre = (FD + HHVVre) / FS; BETim = HHVVim / FS; } /*Even Bounce*/ if (HHVVre < 0.) { BETre = 1.; BETim = 0.; FS = (HHHH * VVVV - HHVVre * HHVVre - HHVVim * HHVVim) / (HHHH + VVVV - 2 * HHVVre); FD = VVVV - FS; ALPre = (HHVVre - FS) / FD; ALPim = HHVVim / FD; } } M_odd[lig][col] = FS * (1 + BETre * BETre + BETim * BETim); M_dbl[lig][col] = FD * (1 + ALPre * ALPre + ALPim * ALPim); M_vol[lig][col] = FV; if (M_odd[lig][col] < 0.) M_odd[lig][col] = 0.; if (M_dbl[lig][col] < 0.) M_dbl[lig][col] = 0.; if (M_vol[lig][col] < 0.) M_vol[lig][col] = 0.; if (M_odd[lig][col] > SpanMax) M_odd[lig][col] = SpanMax; if (M_dbl[lig][col] > SpanMax) M_dbl[lig][col] = SpanMax; if (M_vol[lig][col] > SpanMax) M_vol[lig][col] = SpanMax; } else { M_odd[lig][col] = 0.; M_dbl[lig][col] = 0.; M_vol[lig][col] = 0.; } } free_matrix_float(M_avg,NpolarOut); } write_block_matrix_float(out_odd, M_odd, NligBlock[Nb], Sub_Ncol, 0, 0, Sub_Ncol); write_block_matrix_float(out_dbl, M_dbl, NligBlock[Nb], Sub_Ncol, 0, 0, Sub_Ncol); write_block_matrix_float(out_vol, M_vol, NligBlock[Nb], Sub_Ncol, 0, 0, Sub_Ncol); } // NbBlock /******************************************************************** ********************************************************************/ /* MATRIX FREE-ALLOCATION */ /* free_matrix_float(Valid, NligBlock[0]); free_matrix3d_float(M_avg, NpolarOut, NligBlock[0]); free_matrix_float(M_odd, NligBlock[0]); free_matrix_float(M_dbl, NligBlock[0]); free_matrix_float(M_vol, NligBlock[0]); */ /******************************************************************** ********************************************************************/ /* INPUT FILE CLOSING*/ for (Np = 0; Np < NpolarIn; Np++) fclose(in_datafile[Np]); if (FlagValid == 1) fclose(in_valid); /* OUTPUT FILE CLOSING*/ fclose(out_odd); fclose(out_dbl); fclose(out_vol); /******************************************************************** ********************************************************************/ return 1; }