def createImages(self): #the fortran code used to read in short, convert to float and convert back to short. #let's use the image api and the casters to do that. The image in input can be of any # comptible type inImage = self._dem.clone() #reads short and convert to float inImage.initImage(self.inputFilename,'read',self.width,self.dataType) #create a suitable caster from self.dataType to self._dataTypeBindings inImage.setCaster('read',self._dataTypeBindings) inImage.createImage() self._numberLines = inImage.getLength() outImage = Image() #if name not provided assume overwrite of input import random if(not self.outputFilename): self.outputFilename = os.path.basename(self.inputFilename) + str(int(random.random()*100000)) #add 6 digit random number to input filename self.overwriteInputFileFlag = True #manages float and writes out short outImage.initImage(self.outputFilename,'write',self.width,self.dataType) outImage.metadatalocation = self.outputFilename #create a suitable caster from self._dataTypeBindings to self.dataType outImage.setCaster('write',self._dataTypeBindings) outImage.createImage() return inImage,outImage
class BandExtractor(Filter): #Use kwargs so each subclass can add parameters to the init function. #If nameOut is a string then create the image using the input image info, #otherwise check if it is an image object and raise an exceptio if not. def init(self,imgIn,nameOut,**kwargs): if isinstance(nameOut,str): #create generic image self._imgOut = Image() width = imgIn.getWidth() accessmode = 'write' bands = imgIn.getBands() scheme = imgIn.getInterleavedScheme() typec = imgIn.getDataType() #For now extract one band at the time. Might extend to do #multiple bands band = 1 #create output image of the same type as input self._imgOut.initImage(nameOut,accessmode,width,typec,band,scheme) self._imgOut.createImage() #if created here then need to finalize at the end self._outCreatedHere = True elif(nameOut,Image): self._imgOut = nameOut else: print("Error. The second argument of BandExtractor.init() must be a string or an Image object") raise TypeError imgIn.createImage() # just in case has not been run before. if it was run then it does not have any effect accessorIn = imgIn.getImagePointer() accessorOut = self._imgOut.getImagePointer() FL.init(self._filter,accessorIn,accessorOut) def finalize(self):#extend base one if self._outCreatedHere: self._imgOut.finalizeImage() Filter.finalize(self) def __getstate__(self): d = dict(self.__dict__) del d['logger'] return d def __setstate__(self,d): self.__dict__.update(d) self.logger = logging.getLogger('isce.isceobj.ImgeFilter.BandExtractor') return def __init__(self,typeExtractor,band): Filter.__init__(self) self.logger = logging.getLogger('isce.isceobj.ImageFilter.BandExtractor') #get the filter C++ object pointer self._filter = FL.createFilter(typeExtractor,band) self._outCreatedHere = False self._imgOut = None
def AmpcorPrep(self): """ Prepare to be used in ampcor. Ampcor package in ISCE uses a special file pointer for accessing geotiff data. Therefore, we need ISCE module "Image" for this purpose. """ import isce from isceobj.Image.Image import Image # ==== need a vrt file # >= Python 3.4 from pathlib import Path vrtpath = Path(self.fpath + '.vrt') if not vrtpath.is_file(): print('Calling gdalbuildvrt...') gdalbuildvrt_cmd = 'gdalbuildvrt ' + self.fpath + '.vrt ' + self.fpath print(gdalbuildvrt_cmd) retcode = subprocess.call(gdalbuildvrt_cmd, shell=True) if retcode != 0: print( 'gdalbuildvrt failed. Please check if all the input parameters are properly set.' ) sys.exit(retcode) # ==================== obj = Image() obj.setFilename(self.fpath) obj.setWidth(self.GetRasterXSize()) # gdalinfo, first number if self.GetDataType() <= 3: obj.setDataType('SHORT') elif 4 <= self.GetDataType() <= 5: obj.setDataType('LONG') elif self.GetDataType() == 6: obj.setDataType('FLOAT') elif self.GetDataType() == 7: obj.setDataType('DOUBLE') # SHORT, LONG, FLOAT, DOUBLE, etc else: obj.setDataType('CFLOAT') # not totally right, may be wrong # obj.setBands(1) # "self" requires a single band # obj.setAccessMode('read') obj.setCaster('read', 'FLOAT') # fixed as float obj.createImage() self.iscepointer = obj
class ComplexExtractor(Filter): """Extracts components (real, imaginary, magnitude, phase) from a complex datatype""" #Use kwargs so each subclass can add parameters to the init function. #If nameOut is a string then create the image using the input image info, #otherwise check if it is an image object and raise an exception if not. def init(self, imgIn, nameOut, **kwargs): """Method to pass the input and output image to the filter""" # check if the output image nameOut is provided. If it is a string create the image here using # the input image as template if isinstance(nameOut, str): #create generic image self._imgOut = Image() width = imgIn.getWidth() accessmode = 'write' bands = imgIn.getBands() scheme = imgIn.getInterleavedScheme() typec = imgIn.getDataType() #The assumption is that the imgIn is complex. The single component is the imgIn data type without the C # for instace CREAL becomes REAL typeF = typec[1:] #create output image of the same type as input self._imgOut.initImage(nameOut, accessmode, width, typeF, bands, scheme) self._imgOut.createImage() #if created here then need to finalize at the end self._outCreatedHere = True elif (nameOut, Image): self._imgOut = nameOut else: print( "Error. The second argument of ComplexExtractor.init() must be a string or an Image object" ) raise TypeError imgIn.createImage( ) # just in case has not been run before. if it was run then it does not have any effect accessorIn = imgIn.getImagePointer() accessorOut = self._imgOut.getImagePointer() FL.init(self._filter, accessorIn, accessorOut) def finalize(self): #extend base one """Finalize filter baseclass and output accessor if created here and not passed""" if self._outCreatedHere: self._imgOut.finalizeImage() Filter.finalize(self) def __getstate__(self): d = dict(self.__dict__) del d['logger'] return d def __setstate__(self, d): self.__dict__.update(d) self.logger = logging.getLogger( 'isce.isceobj.ImageFilter.ComplexExtractor') return def __init__(self, typeExtractor, fromWhat): """Initialize the filter passing what is extracted and from what type of complex image""" Filter.__init__(self) self.logger = logging.getLogger( 'isce.isceobj.ImageFilter.ComplexExtractor') #possible inputs #(MagnitudeExctractor,'cartesian') #(MagnitudeExctractor,'polar') #(PhaseExctractor,'cartesian') #(PhaseExctractor,'polar') #(RealExctractor,'cartesian') #(ImagExctractor,'cartesian') #(RealExctractor,'polar') #(ImagExctractor,'polar') #get the filter C++ object pointer calling the Filtermodule.cpp which calls the FilterFactory.cpp self._filter = FL.createFilter(typeExtractor, fromWhat) self._outCreatedHere = False self._imgOut = None
import matplotlib.pyplot as plt # import xml.etree.ElementTree as ET def getImageSize(infile): ds = gdal.Open(infile + ".vrt") b = ds.GetRasterBand(1) return b.XSize, b.YSize if __name__ == '__main__': listFile = "/media/jiechencyz/Experiments_1/P120_Lena_stackProcess/merged/interferograms/unw_list" with open(listFile, 'r') as fileHandle: try: for fileName in fileHandle: fileName = fileName.rstrip() imageWidth, imageLength = getImageSize(fileName) unw = ts.load_mmap(fileName, imageWidth, imageLength, quiet=True, map='BIL', nchannels=2, channel=2, conv=False) # print(unw[1000:1004, 1000:1005]) # print(getImageSize(fileName)) finally: fileHandle.close() obj = Image() obj.load(fileName + ".xml") obj.setAccessMode('read') obj.createImage() imageOut = obj.memMap('r', 1) plt.imshow(imageOut, cmap='jet', vmin=-60, vmax=-30) plt.colorbar() plt.show()