Commit 1ec8cbd7 authored by Jay's avatar Jay
Browse files

Updates cause I have to bail.

parent 980f016f
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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))
+4 −3
Original line number Diff line number Diff line
@@ -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)
@@ -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])
    
+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
@@ -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):
@@ -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?

@@ -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):
@@ -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
@@ -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, 
@@ -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, 
@@ -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)