PyCuAmpcor: offer an option to add gross offset to output offset image
parent
563568561d
commit
7c40da5a74
|
@ -170,11 +170,15 @@ def runDenseOffsetsGPU(self):
|
|||
m = isceobj.createSlcImage()
|
||||
m.load(reference + '.xml')
|
||||
m.setAccessMode('READ')
|
||||
# re-create vrt in terms of merged full slc
|
||||
m.renderHdr()
|
||||
|
||||
### Load the secondary object
|
||||
s = isceobj.createSlcImage()
|
||||
s.load(secondary + '.xml')
|
||||
s.setAccessMode('READ')
|
||||
# re-create vrt in terms of merged full slc
|
||||
s.renderHdr()
|
||||
|
||||
# get the dimension
|
||||
width = m.getWidth()
|
||||
|
@ -244,6 +248,9 @@ def runDenseOffsetsGPU(self):
|
|||
objOffset.snrImageName = os.path.join(self._insar.mergedDirname, self._insar.snrfile)
|
||||
objOffset.covImageName = os.path.join(self._insar.mergedDirname, self._insar.covfile)
|
||||
|
||||
# merge gross offset to final offset
|
||||
objOffset.mergeGrossOffset = 1
|
||||
|
||||
### print the settings
|
||||
print('\nReference frame: %s' % (mf))
|
||||
print('Secondary frame: %s' % (sf))
|
||||
|
|
|
@ -89,6 +89,8 @@ def createParser():
|
|||
help='Gross range offset (default: %(default)s).')
|
||||
gross.add_argument('--gf', '--gross-file', type=str, dest='gross_offset_file',
|
||||
help='Varying gross offset input file')
|
||||
gross.add_argument('--mg', '--merge-gross-offset', type=int, dest='merge_gross_offset', default=0,
|
||||
help='Whether to merge gross offset to the output offset image (default: %(default)s).')
|
||||
|
||||
corr = parser.add_argument_group('Correlation surface')
|
||||
corr.add_argument('--corr-stat-size', type=int, dest='corr_stat_win_size', default=21,
|
||||
|
@ -238,6 +240,9 @@ def estimateOffsetField(reference, secondary, inps=None):
|
|||
print("snr: ",objOffset.snrImageName)
|
||||
print("cov: ",objOffset.covImageName)
|
||||
|
||||
# whether to include the gross offset in offsetImage
|
||||
objOffset.mergeGrossOffset = inps.merge_gross_offset
|
||||
|
||||
offsetImageName = objOffset.offsetImageName
|
||||
grossOffsetImageName = objOffset.grossOffsetImageName
|
||||
snrImageName = objOffset.snrImageName
|
||||
|
|
|
@ -87,6 +87,8 @@ cdef extern from "cuAmpcorParameter.h":
|
|||
int *grossOffsetAcross ## Gross offsets between reference and secondary windows (across)
|
||||
int grossOffsetDown0 ## constant gross offset (down)
|
||||
int grossOffsetAcross0 ## constant gross offset (across)
|
||||
int mergeGrossOffset ## whether to merge gross offset to final offset
|
||||
|
||||
int referenceStartPixelDown0 ## the first pixel of reference image (down), be adjusted with margins and gross offset
|
||||
int referenceStartPixelAcross0 ## the first pixel of reference image (across)
|
||||
int *referenceChunkStartPixelDown ## array of starting pixels for all reference chunks (down)
|
||||
|
@ -337,6 +339,13 @@ cdef class PyCuAmpcor(object):
|
|||
def offsetImageName(self, str a):
|
||||
self.c_cuAmpcor.param.offsetImageName = <string> a.encode()
|
||||
|
||||
@property
|
||||
def mergeGrossOffset(self):
|
||||
return self.c_cuAmpcor.param.mergeGrossOffset
|
||||
@mergeGrossOffset.setter
|
||||
def mergeGrossOffset(self, int a):
|
||||
self.c_cuAmpcor.param.mergeGrossOffset = a
|
||||
|
||||
@property
|
||||
def snrImageName(self):
|
||||
return self.c_cuAmpcor.param.snrImageName.decode("utf-8")
|
||||
|
|
|
@ -129,12 +129,32 @@ void cuAmpcorController::runAmpcor()
|
|||
cuArraysCopyExtract(offsetImageRun, offsetImage, make_int2(0,0), streams[0]);
|
||||
cuArraysCopyExtract(snrImageRun, snrImage, make_int2(0,0), streams[0]);
|
||||
cuArraysCopyExtract(covImageRun, covImage, make_int2(0,0), streams[0]);
|
||||
// save outputs to files
|
||||
offsetImage->outputToFile(param->offsetImageName, streams[0]);
|
||||
|
||||
/* save the offsets and gross offsets */
|
||||
// copy the offset to host
|
||||
offsetImage->allocateHost();
|
||||
offsetImage->copyToHost(streams[0]);
|
||||
// construct the gross offset
|
||||
cuArrays<float2> *grossOffsetImage = new cuArrays<float2>(param->numberWindowDown, param->numberWindowAcross);
|
||||
grossOffsetImage->allocateHost();
|
||||
for(int i=0; i< param->numberWindows; i++)
|
||||
grossOffsetImage->hostData[i] = make_float2(param->grossOffsetDown[i], param->grossOffsetAcross[i]);
|
||||
|
||||
// check whether to merge gross offset
|
||||
if (param->mergeGrossOffset)
|
||||
{
|
||||
// if merge, add the gross offsets to offset
|
||||
for(int i=0; i< param->numberWindows; i++)
|
||||
offsetImage->hostData[i] += grossOffsetImage->hostData[i];
|
||||
}
|
||||
// output both offset and gross offset
|
||||
offsetImage->outputHostToFile(param->offsetImageName);
|
||||
grossOffsetImage->outputHostToFile(param->grossOffsetImageName);
|
||||
delete grossOffsetImage;
|
||||
|
||||
// save the snr/cov images
|
||||
snrImage->outputToFile(param->snrImageName, streams[0]);
|
||||
covImage->outputToFile(param->covImageName, streams[0]);
|
||||
// also save the gross offsets
|
||||
outputGrossOffsets();
|
||||
|
||||
// Delete arrays.
|
||||
delete offsetImage;
|
||||
|
@ -155,19 +175,4 @@ void cuAmpcorController::runAmpcor()
|
|||
delete secondaryImage;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Output gross offset fields
|
||||
*/
|
||||
void cuAmpcorController::outputGrossOffsets()
|
||||
{
|
||||
cuArrays<float2> *grossOffsets = new cuArrays<float2>(param->numberWindowDown, param->numberWindowAcross);
|
||||
grossOffsets->allocateHost();
|
||||
|
||||
for(int i=0; i< param->numberWindows; i++)
|
||||
grossOffsets->hostData[i] = make_float2(param->grossOffsetDown[i], param->grossOffsetAcross[i]);
|
||||
grossOffsets->outputHostToFile(param->grossOffsetImageName);
|
||||
delete grossOffsets;
|
||||
}
|
||||
|
||||
// end of file
|
||||
|
|
|
@ -27,8 +27,6 @@ public:
|
|||
~cuAmpcorController();
|
||||
// run interface
|
||||
void runAmpcor();
|
||||
// output gross offsets
|
||||
void outputGrossOffsets();
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
|
@ -59,6 +59,8 @@ cuAmpcorParameter::cuAmpcorParameter()
|
|||
useMmap = 1; // use mmap
|
||||
mmapSizeInGB = 1;
|
||||
|
||||
mergeGrossOffset = 0; // default to separate gross offset
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -112,6 +112,7 @@ public:
|
|||
int grossOffsetAcross0; ///< gross offset static component (across)
|
||||
int *grossOffsetDown; ///< Gross offsets between reference and secondary windows (down)
|
||||
int *grossOffsetAcross; ///< Gross offsets between reference and secondary windows (across)
|
||||
int mergeGrossOffset; ///< whether to merge gross offsets into the final offsets
|
||||
|
||||
int *referenceChunkStartPixelDown; ///< reference starting pixels for each chunk (down)
|
||||
int *referenceChunkStartPixelAcross; ///< reference starting pixels for each chunk (across)
|
||||
|
|
|
@ -4,7 +4,9 @@
|
|||
*
|
||||
*/
|
||||
|
||||
// my module dependencies
|
||||
#include "cuAmpcorUtil.h"
|
||||
// for FLT_MAX
|
||||
#include <cfloat>
|
||||
|
||||
// find the max between two elements
|
||||
|
@ -254,6 +256,7 @@ void cuDetermineSecondaryExtractOffset(cuArrays<int2> *maxLoc, cuArrays<int2> *m
|
|||
int blockspergrid=IDIVUP(maxLoc->size, threadsperblock);
|
||||
cudaKernel_determineSecondaryExtractOffset<<<blockspergrid, threadsperblock, 0, stream>>>
|
||||
(maxLoc->devData, maxLocShift->devData, maxLoc->size, xOldRange, yOldRange, xNewRange, yNewRange);
|
||||
getLastCudaError("cuDetermineSecondaryExtractOffset");
|
||||
}
|
||||
|
||||
// end of file
|
||||
|
|
Loading…
Reference in New Issue