Loading autocnet/matcher/subpixel.py +4 −4 Original line number Diff line number Diff line Loading @@ -281,15 +281,15 @@ def subpixel_template(reference_roi, # Apply the shift to the center of the moving roi to the center of the reference ROI in index space. One pixel == one index (unitless). # All this does is adjust from the upper left of the maximum correlation to the origin of the 2d array. new_affine_transformed_center_x = moving_roi.center[0] - matcher_shift_x #Center is indices. new_affine_transformed_center_y = moving_roi.center[1] - matcher_shift_y new_affine_transformed_center_x = moving_roi.clip_center - matcher_shift_x #Center is indices. new_affine_transformed_center_y = moving_roi.clip_center- matcher_shift_y # Invert the affine transformation of the new center. This result is plotted in the second figure as a red dot. inverse_transformed_affine_center_x, inverse_transformed_affine_center_y = affine.inverse((new_affine_transformed_center_x, new_affine_transformed_center_y))[0] # Take the original x,y (moving_roi.x, moving_roi.y) and subtract the delta between the original ROI center and the newly computed center. translation_x = - (moving_roi.center[0] - inverse_transformed_affine_center_x) translation_y = - (moving_roi.center[1] - inverse_transformed_affine_center_y) translation_x = - (moving_roi.clip_center - inverse_transformed_affine_center_x) translation_y = - (moving_roi.clip_center - inverse_transformed_affine_center_y) new_affine = tf.AffineTransform(translation=(translation_x, translation_y)) Loading autocnet/transformation/affine.py +4 −3 Original line number Diff line number Diff line Loading @@ -112,8 +112,8 @@ def estimate_local_affine(reference_roi, moving_roi): """ # get initial affine roi_buffer = reference_roi.buffer size_x = reference_roi.size_x + roi_buffer size_y = reference_roi.size_y + roi_buffer size_x = reference_roi.clip_center + roi_buffer size_y = reference_roi.clip_center + roi_buffer affine_transform = estimate_affine_from_sensors(reference_roi.data, moving_roi.data, reference_roi.x, reference_roi.y, size_x=size_x, size_y=size_y) ref_center = (reference_roi.x, reference_roi.y) Loading @@ -131,7 +131,8 @@ def estimate_local_affine(reference_roi, moving_roi): scale=affine_transform.scale) # This rotates about the center of the image shift_x, shift_y = moving_roi.center shift_x = moving_roi.clip_center shift_y = moving_roi.clip_center tf_shift = tf.SimilarityTransform(translation=[shift_x, shift_y]) tf_shift_inv = tf.SimilarityTransform(translation=[-shift_x, -shift_y]) Loading autocnet/transformation/roi.py +32 −35 Original line number Diff line number Diff line from math import modf, floor import numpy as np form plio.io.io_gdal import GeoDataset import scipy.ndimage as ndimage from skimage import transform as tf Loading Loading @@ -36,18 +36,26 @@ class Roi(): bottom_y : int The bottom image coordinate in imge space """ def __init__(self, data, x, y, ndv=None, ndv_threshold=0.5, buffer=5): def __init__(self, data, x, y, size_x=200, size_y=200, ndv=None, ndv_threshold=0.5, buffer=5): if not isinstance(data, GeoDataset): raise TypeError('Error: data object must be a plio GeoDataset') self.data = data self.x = x self.y = y self.size_x = size_x self.size_y = size_y self.ndv = ndv self._ndv_threshold = ndv_threshold self.buffer = buffer self.clipped_array = None @property def center(self): ie = self.image_extent return ((ie[1] - ie[0])-1)/2. + 0.5, ((ie[3]-ie[2])-1)/2. + 0.5 return (self.x, self.y) @property def clip_center(self): return (self.size_x + 0.5, self.size_y + 0.5) @property def x(self): Loading Loading @@ -117,12 +125,8 @@ class Roi(): In full image space, this method computes the valid pixel indices that can be extracted. """ try: # Geodataset object raster_size = self.data.raster_size except: # Numpy array in y,x form raster_size = self.data.shape[::-1] # Should this modify (+-) and then round to whole pixel? Loading @@ -137,10 +141,6 @@ class Roi(): return [left_x, right_x, top_y, bottom_y] @property def center(self): ie = self.image_extent return ((ie[1] - ie[0])-1)/2. + 0.5, ((ie[3]-ie[2])-1)/2. + 0.5 @property def is_valid(self): Loading @@ -167,7 +167,7 @@ class Roi(): return self.clip() def clip(self, size_x, size_y, affine=None, dtype=None, mode="reflect"): def clip(self, size_x=None, size_y=None, affine=None, dtype=None, mode="reflect"): """ Compatibility function that makes a call to the array property. Warning: The dtype passed in via this function resets the dtype attribute of this Loading @@ -189,26 +189,23 @@ class Roi(): : ndarray The array attribute of this object. """ pixels = self.image_extent if (np.asarray(pixels) - self.buffer < 0).any(): if size_x: self.size_x = size_x if size_y: self.size_y = size_y min_x = self._whole_x - size_x - self.buffer min_y = self._whole_y - size_y - self.buffer x_read_length = (size_x * 2) + 1 + self.buffer y_read_length = (size_y * 2) + 1 + self.buffer pixels = [min_x, min_y, x_read_length, y_read_length] if (np.asarray(pixels) < 0).any(): raise IndexError('Image coordinates plus read buffer are outside of the available data. Please select a smaller ROI and/or a smaller read buffer.') if isinstance(self.data, np.ndarray): data = self.data[pixels[2]-self.buffer:pixels[3]+1+self.buffer, pixels[0]-self.buffer:pixels[1]+1+self.buffer] else: # Have to reformat to [xstart, ystart, xnumberpixels, ynumberpixels] # TODO: I think this will result in an incorrect obj.center when the passed data is a GeoDataset pixels = [pixels[0]-self.buffer, pixels[2]-self.buffer, pixels[1]-pixels[0]+(self.buffer*2)+1, pixels[3]-pixels[2]+(self.buffer*2)+1] pixels = map(floor, [self.x-size_x, self.y-size_y, size_x*2+1, size_y*2+1]) data = self.data.read_array(pixels=pixels, dtype=dtype) return data # CENTER SHIFTING? if affine: # The cval is being set to the mean of the array, af = tf.warp(data, Loading @@ -224,7 +221,7 @@ class Roi(): af = af[floor(new_center[0])-self.size_y:floor(new_center[0])+self.size_y+1, floor(new_center[1])-self.size_x:floor(new_center[1])+self.size_x+1] return af self.clipped_array = ar """if affine: # The cval is being set to the mean of the array, d2 = tf.warp(data, Loading Loading @@ -269,4 +266,4 @@ class Roi(): self.buffer:-self.buffer] # Ohh is buffer doing something here? Yeah, post clip, so we should be safe. # Buffers don't matter - wtf return img_as_float32(pixel_locked) self.clipped_array = img_as_float32(pixel_locked) Loading
autocnet/matcher/subpixel.py +4 −4 Original line number Diff line number Diff line Loading @@ -281,15 +281,15 @@ def subpixel_template(reference_roi, # Apply the shift to the center of the moving roi to the center of the reference ROI in index space. One pixel == one index (unitless). # All this does is adjust from the upper left of the maximum correlation to the origin of the 2d array. new_affine_transformed_center_x = moving_roi.center[0] - matcher_shift_x #Center is indices. new_affine_transformed_center_y = moving_roi.center[1] - matcher_shift_y new_affine_transformed_center_x = moving_roi.clip_center - matcher_shift_x #Center is indices. new_affine_transformed_center_y = moving_roi.clip_center- matcher_shift_y # Invert the affine transformation of the new center. This result is plotted in the second figure as a red dot. inverse_transformed_affine_center_x, inverse_transformed_affine_center_y = affine.inverse((new_affine_transformed_center_x, new_affine_transformed_center_y))[0] # Take the original x,y (moving_roi.x, moving_roi.y) and subtract the delta between the original ROI center and the newly computed center. translation_x = - (moving_roi.center[0] - inverse_transformed_affine_center_x) translation_y = - (moving_roi.center[1] - inverse_transformed_affine_center_y) translation_x = - (moving_roi.clip_center - inverse_transformed_affine_center_x) translation_y = - (moving_roi.clip_center - inverse_transformed_affine_center_y) new_affine = tf.AffineTransform(translation=(translation_x, translation_y)) Loading
autocnet/transformation/affine.py +4 −3 Original line number Diff line number Diff line Loading @@ -112,8 +112,8 @@ def estimate_local_affine(reference_roi, moving_roi): """ # get initial affine roi_buffer = reference_roi.buffer size_x = reference_roi.size_x + roi_buffer size_y = reference_roi.size_y + roi_buffer size_x = reference_roi.clip_center + roi_buffer size_y = reference_roi.clip_center + roi_buffer affine_transform = estimate_affine_from_sensors(reference_roi.data, moving_roi.data, reference_roi.x, reference_roi.y, size_x=size_x, size_y=size_y) ref_center = (reference_roi.x, reference_roi.y) Loading @@ -131,7 +131,8 @@ def estimate_local_affine(reference_roi, moving_roi): scale=affine_transform.scale) # This rotates about the center of the image shift_x, shift_y = moving_roi.center shift_x = moving_roi.clip_center shift_y = moving_roi.clip_center tf_shift = tf.SimilarityTransform(translation=[shift_x, shift_y]) tf_shift_inv = tf.SimilarityTransform(translation=[-shift_x, -shift_y]) Loading
autocnet/transformation/roi.py +32 −35 Original line number Diff line number Diff line from math import modf, floor import numpy as np form plio.io.io_gdal import GeoDataset import scipy.ndimage as ndimage from skimage import transform as tf Loading Loading @@ -36,18 +36,26 @@ class Roi(): bottom_y : int The bottom image coordinate in imge space """ def __init__(self, data, x, y, ndv=None, ndv_threshold=0.5, buffer=5): def __init__(self, data, x, y, size_x=200, size_y=200, ndv=None, ndv_threshold=0.5, buffer=5): if not isinstance(data, GeoDataset): raise TypeError('Error: data object must be a plio GeoDataset') self.data = data self.x = x self.y = y self.size_x = size_x self.size_y = size_y self.ndv = ndv self._ndv_threshold = ndv_threshold self.buffer = buffer self.clipped_array = None @property def center(self): ie = self.image_extent return ((ie[1] - ie[0])-1)/2. + 0.5, ((ie[3]-ie[2])-1)/2. + 0.5 return (self.x, self.y) @property def clip_center(self): return (self.size_x + 0.5, self.size_y + 0.5) @property def x(self): Loading Loading @@ -117,12 +125,8 @@ class Roi(): In full image space, this method computes the valid pixel indices that can be extracted. """ try: # Geodataset object raster_size = self.data.raster_size except: # Numpy array in y,x form raster_size = self.data.shape[::-1] # Should this modify (+-) and then round to whole pixel? Loading @@ -137,10 +141,6 @@ class Roi(): return [left_x, right_x, top_y, bottom_y] @property def center(self): ie = self.image_extent return ((ie[1] - ie[0])-1)/2. + 0.5, ((ie[3]-ie[2])-1)/2. + 0.5 @property def is_valid(self): Loading @@ -167,7 +167,7 @@ class Roi(): return self.clip() def clip(self, size_x, size_y, affine=None, dtype=None, mode="reflect"): def clip(self, size_x=None, size_y=None, affine=None, dtype=None, mode="reflect"): """ Compatibility function that makes a call to the array property. Warning: The dtype passed in via this function resets the dtype attribute of this Loading @@ -189,26 +189,23 @@ class Roi(): : ndarray The array attribute of this object. """ pixels = self.image_extent if (np.asarray(pixels) - self.buffer < 0).any(): if size_x: self.size_x = size_x if size_y: self.size_y = size_y min_x = self._whole_x - size_x - self.buffer min_y = self._whole_y - size_y - self.buffer x_read_length = (size_x * 2) + 1 + self.buffer y_read_length = (size_y * 2) + 1 + self.buffer pixels = [min_x, min_y, x_read_length, y_read_length] if (np.asarray(pixels) < 0).any(): raise IndexError('Image coordinates plus read buffer are outside of the available data. Please select a smaller ROI and/or a smaller read buffer.') if isinstance(self.data, np.ndarray): data = self.data[pixels[2]-self.buffer:pixels[3]+1+self.buffer, pixels[0]-self.buffer:pixels[1]+1+self.buffer] else: # Have to reformat to [xstart, ystart, xnumberpixels, ynumberpixels] # TODO: I think this will result in an incorrect obj.center when the passed data is a GeoDataset pixels = [pixels[0]-self.buffer, pixels[2]-self.buffer, pixels[1]-pixels[0]+(self.buffer*2)+1, pixels[3]-pixels[2]+(self.buffer*2)+1] pixels = map(floor, [self.x-size_x, self.y-size_y, size_x*2+1, size_y*2+1]) data = self.data.read_array(pixels=pixels, dtype=dtype) return data # CENTER SHIFTING? if affine: # The cval is being set to the mean of the array, af = tf.warp(data, Loading @@ -224,7 +221,7 @@ class Roi(): af = af[floor(new_center[0])-self.size_y:floor(new_center[0])+self.size_y+1, floor(new_center[1])-self.size_x:floor(new_center[1])+self.size_x+1] return af self.clipped_array = ar """if affine: # The cval is being set to the mean of the array, d2 = tf.warp(data, Loading Loading @@ -269,4 +266,4 @@ class Roi(): self.buffer:-self.buffer] # Ohh is buffer doing something here? Yeah, post clip, so we should be safe. # Buffers don't matter - wtf return img_as_float32(pixel_locked) self.clipped_array = img_as_float32(pixel_locked)