# -*- coding: utf-8 -*- #!/usr/local/bin/python """ Description : ------------- BUT REALISER UNE MOYENNE D'IMAGE SUR JEU DE DONNEEES A LA FOIS TEMPORELLE (fichier(s) en entrée) ET SPATIALE (subsetting) Usage : ------- EN COMMANDES UNIX : exemple : python MEAN_IMAGE.py -s [valeurs_du_subsetting] -d nom_du_sds -f output_id (pour l'enregistrment en .png ou hdf) chemin_de_lecture_du_ou_des_fichiers.hdf + autres options Example : --------- Prerequisites : --------------- python >= 2.5 ; not tested but probably all versions Author : -------- CGTD-ICARE/UDEV Nicolas THOMAS ( nicolas.thomas-at-icare.univ-lille1.fr ) License : --------- This file must be used under the terms of the CeCILL. This source file is licensed as described in the file COPYING, which you should have received as part of this distribution. The terms are also available at http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt History : --------- v0.0.0 : 2009/12/01 - creation """ from Average_management import prog_options,get_input_files,get_name_sds,image_size,subsetting,mean_2_hdf,get_read import sys,re from numpy import * from pyhdf.SD import* import warnings warnings.filterwarnings("ignore") from hdf2img.data2img import * def data_2_mean(options,data_read,row_min,row_max,col_min,col_max): mask_list={} out_val_list={} attributes_list={} hdf_name=data_read.keys()[0] hdf_file = SD(hdf_name) # ____ list of attributes (HDF)_____ hdf_attributes=hdf_file.attributes() attributes_list['HDF']=hdf_attributes sds_name=data_read.values()[0][0] sds=hdf_file.select(sds_name).get() sds_attributes=hdf_file.select(sds_name).attributes() attributes_list['sds']=sds_attributes sds=sds[row_min:row_max,col_min:col_max] lin,col=sds.shape #___ give the fill value and space value (255)____ _fill_value=hdf_file.select(sds_name).getfillvalue() if re.search('SEVIRI',hdf_name) : out_val_list['_fill_value']=254. else : out_val_list['_fill_value']=_fill_value if options.fixed_value is not None : fixed_value=options.fixed_value.split(',') list_fixed_value=sds_attributes.keys() for name in fixed_value : if name not in list_fixed_value : raise ValueError ( "Unsupported Variable %s Must be in [%s]"%( name, list_fixed_value ) ) mask_list[name]=(sds==sds_attributes[name]) out_val_list[name]=sds_attributes[name] else : mask_list=None sds_numpy=zeros((lin,col),dtype=float64) SDS_nb_data=zeros((lin,col),dtype=float64) return sds_numpy,SDS_nb_data,hdf_name,mask_list,out_val_list,attributes_list # #_____________________________________________________ # def get_Bad_input_files (fname,data_read) : print 'BadInputFile : ' BadInputFile=sys.stderr.write(fname+'\n') sys.stderr.flush() del data_read[fname] #idx=data_read.index(fname) #del data_read[idx] pass # def get_list_SDS (nb_data,sds_numpy,sds_std,sds_numpy_min,sds_numpy_max,options): SDS={} SDS['nb_data']=nb_data SDS['mean']=sds_numpy if options.stats is True : SDS['std']=sds_std SDS['min']=sds_numpy_min SDS['max']=sds_numpy_max return SDS def get_sds (sds_numpy): lin,col=sds_numpy.shape sds_numpy_min=array([[NaN]*col]*lin) sds_numpy_max=array([[NaN]*col]*lin) sds_numpy_carre=zeros((lin,col),dtype=float64) return sds_numpy_min,sds_numpy_max,sds_numpy_carre # def sds_math (Mask_fill_value,sds_numpy,SDS_nb_data,sds_numpy_min,sds_numpy_max,sds_numpy_carre,sds,options): lin,col=sds.shape SDS_nb_data[Mask_fill_value]+=1. sds_numpy[Mask_fill_value]+=( sds[Mask_fill_value]) if options.stats is True : sds_numpy_carre[Mask_fill_value]+= pow(sds[Mask_fill_value],2.) sds_numpy_compare=array([[NaN]*col]*lin) sds_numpy_compare[Mask_fill_value]=( sds[Mask_fill_value]) Mask_nan=( isnan(sds_numpy_min) & invert(isnan(sds_numpy_compare)) ) sds_numpy_max[Mask_nan]=sds_numpy_compare[Mask_nan] sds_numpy_min[Mask_nan]=sds_numpy_compare[Mask_nan] Mask_min=(sds_numpy_compare < sds_numpy_min) Mask_max=(sds_numpy_max < sds_numpy_compare) sds_numpy_min[Mask_min]=sds_numpy_compare[Mask_min] sds_numpy_max[Mask_max]=sds_numpy_compare[Mask_max] return SDS_nb_data,sds_numpy,sds_numpy_carre,sds_numpy_min,sds_numpy_max # def treatment_mean(mask_list,out_val_list,row_min,row_max,col_min,col_max,sds_numpy,SDS_nb_data,data_read,hdf_name,options) : sds_numpy_min,sds_numpy_max,sds_numpy_carre=get_sds (sds_numpy) for fname in data_read.keys() : try : hdf_file = SD(fname) for keys in data_read[fname]: sds=hdf_file.select(keys).get() sds=sds[row_min:row_max,col_min:col_max] if mask_list is None : Mask_fill_value=(sds!=out_val_list['_fill_value']) sds=sds.astype(float64) else : Mask_fill_value=(sds==out_val_list['_fill_value']) for mask in mask_list.values() : Mask_fill_value+=mask Mask_fill_value=invert(Mask_fill_value) sds=sds.astype(float64) SDS_nb_data,sds_numpy,sds_numpy_carre,sds_numpy_min,sds_numpy_max=sds_math (Mask_fill_value,sds_numpy,SDS_nb_data,sds_numpy_min,sds_numpy_max,sds_numpy_carre,sds,options) except : BadInputFile=get_Bad_input_files(fname,data_read) nb_data=SDS_nb_data.copy() SDS_nb_data[SDS_nb_data==0]=1. sds_numpy=sds_numpy/SDS_nb_data sds_numpy.round() sds_std=[] if options.stats is True : sds_std=sqrt((sds_numpy_carre/SDS_nb_data) - (sds_numpy**2) ) SDS=get_list_SDS (nb_data,sds_numpy,sds_std,sds_numpy_min,sds_numpy_max,options) #Mask's application if mask_list is not None : for name in mask_list.keys() : MASK=mask_list[name] VAL=out_val_list[name] for keys in SDS: if keys=='min' or keys=='max' or keys=='mean' or keys=='std': SDS[keys][MASK]=VAL for keys in SDS : S=SDS[keys].copy() if keys=='min' or keys=='max' : M=isnan(SDS[keys]) S[M]=out_val_list['_fill_value'] SDS[keys]=S elif keys=='mean' or keys=='std': S[S==0.]=out_val_list['_fill_value'] SDS[keys]=S else : S=SDS[keys].copy() SDS[keys]=S return SDS # #_____________________________________________________ # def main(): list_parameters=sys.argv options,args=prog_options ( list_parameters ) args,options.dataset=get_input_files(args,options) sds_name=get_name_sds(options,args) data_read=get_read(options,args) lin,col=image_size(args,sds_name,options) row_min,row_max,col_min,col_max=subsetting(options,lin,col) sds_numpy,SDS_nb_data,hdf_name,mask_list,out_val_list,attributes_list=data_2_mean(options,data_read,row_min,row_max,col_min,col_max) if options.verbose is True : print "\n" print " ################################# MOYENNE IMAGES ##################################" print " # #" print " # ICARE-CGTD #" print " #####################################################################################" print "\n" print " ---------------------------------- Parametres recuperes--------------------------------" print "\n" if options.verbose is True : print "data_read : ",data_read print "out_val : ",out_val_list print "Mask of fixed value : ",mask_list print "sds_name : ",options.dataset print "\n" print " -------------------------------- Traitement de l'image --------------------------------" print "\n" SDS=treatment_mean(mask_list,out_val_list,row_min,row_max,col_min,col_max,sds_numpy,SDS_nb_data,data_read,hdf_name,options) print " ---------------- Fin du Traitement de l'image et enregistrement en .hdf ---------------" print "\n" filename=mean_2_hdf(SDS,attributes_list,data_read,options,out_val_list) if options.verbose is True : print "filename_hdf :",filename if options.command_line is True : cmd="python Average_display_image.py "+filename+' -r '+str(options.sensor) +' -y ' os.system(cmd) print "\n" print " ------------------------- Fin du programme Average_Processor.py ------------------------" print "\n" # #_____________________________________________________ # if __name__== "__main__": import time start_time=time.time() main() end_time=time.time() print "elapsed time :"+time.strftime("%H:%M:%S",time.gmtime(end_time-start_time))+"######\n"