Exemplo n.º 1
0
def single_crystal_sweep(image,
                         detector,
                         num_peaks,
                         min_sigma=1,
                         step_size=1,
                         max_sigma=None,
                         progress_bar=False):
    if max_sigma is None:
        max_sigma = np.max(image.shape) // 2

    sigmas = np.arange(min_sigma, max_sigma, step_size)

    detectors = [copy(detector) for _ in sigmas]
    for sigma, detector in noobar(zip(sigmas, detectors),
                                  num_iter=len(detectors),
                                  disable=not progress_bar):
        gl = -gaussian_laplace(image, sigma)
        points = find_local_peaks(gl, min_distance=10,
                                  exclude_border=1)  # .astype(float)

        gl_val = gl[points[:, 0], points[:, 1]]
        points = points[np.argsort(-gl_val)][:num_peaks]
        points = refine_peaks(gl, points, model=Polynomial2D(), extent=3)

        indices = detector.detect(points)

    return detectors
Exemplo n.º 2
0
def traverse_from_all(points,
                      adjacency,
                      max_per_point=1,
                      max_depth=None,
                      progress_bar=False):
    # TODO: Docstring
    clockwise = find_clockwise(points, adjacency)

    traversals = []
    for i, point in enumerate(
            noobar(points, units='traversals', disable=not progress_bar)):
        for j, k in enumerate(adjacency[i]):

            edge = (i, k)

            traversal, _ = clockwise_traversal_with_depth(
                edge, adjacency, clockwise, max_depth)

            traversals.append(traversal)

            if i > max_per_point - 1:
                break

    structures = Structures(points, traversals, adjacency)

    return structures
Exemplo n.º 3
0
def refine_peaks(image, points, model, extent=3, region_shape='disk', progress_bar=False):
    """Refine the position intensity extrema to sub-pixel accuracy.

    The positions of intensity extrema are refined by fitting a model function
    to a region close to the pixel positions of local extrema.
    
    Parameters
    ----------
    image : ndarray
        Input image.
    points : Points object
        Points object containing the pixel positions of local extrema
    region : int or ndarray
        
    model : PeakModel object
        
    progress_bar : bool
        If True, display a progress bar.
    """

    if (extent % 2) == 0:
        raise RuntimeError()

    if region_shape is 'disk':
        region = _disk(extent // 2, dtype=bool)
    elif region_shape is 'square':
        region = np.ones((extent,) * 2, dtype=bool)
    else:
        raise ValueError()

    r = (np.array(region.shape) - 1) // 2

    region = np.array(region).astype(bool)

    refined = np.zeros_like(points, dtype=float)

    # Point may be floats, if exclude_adjacent was passed
    # to find_local_peaks.  If so, round and cast.
    if not issubclass(points.dtype.type, np.integer):
        points = np.rint(points).astype(int)

    X, Y = np.indices(image.shape)

    u, v = np.indices(region.shape)
    u = u[region] - r[0]
    v = v[region] - r[1]

    for i, p in enumerate(noobar(points, units='fits', disable=not progress_bar)):
        x = X[p[0] - r[0]:p[0] + r[0] + 1, p[1] - r[1]:p[1] + r[1] + 1]
        y = Y[p[0] - r[0]:p[0] + r[0] + 1, p[1] - r[1]:p[1] + r[1] + 1]

        z = image[x, y][region]

        model.fit(u, v, z)
        x0, y0 = model.peak_position()

        refined[i, :] = [x0 + p[0], y0 + p[1]]

    return refined
Exemplo n.º 4
0
    def _get_mask(self, shape, mask, progress_bar=True):
        # TODO: Speed up mask calculation
        mask_array = np.zeros(shape)

        extent = _fft_extent_2d(self._fft_image.shape)

        centers = self._nyquist2pixels(self.centers -
                                       np.array([extent[0], extent[-1]]))

        for center in noobar(centers, disable=not progress_bar):
            mask_array += self._get_mask_array(center, shape, mask)

        mask_array[mask_array > 1] = 1

        return mask_array
Exemplo n.º 5
0
    def register(self, A, B, progress_bar=True):

        N, M = len(A), len(B)

        self._A, self._B = A, B
        self._rmsd = np.empty((N, M))
        self._rmsd[:] = np.nan

        if A == B:
            indices = itertools.combinations(range(N), 2)
            np.fill_diagonal(self._rmsd, 0)
            total = N * (N - 1) // 2
        else:
            indices = itertools.product(range(N), range(M))
            total = N * M

        precalced = self._do_precalc(A, B)

        for i, j in noobar(indices,
                           num_iter=total,
                           units='registrations',
                           disable=not progress_bar):

            is_connected, permutations = self.is_connected(A[i], B[j])

            if is_connected:
                rmsd, permutation = self.get_rmsd(A[i], B[j], precalced,
                                                  permutations)
                self._rmsd[i, j] = rmsd

                if self.permutations is not None:
                    self._permutations[(A[i], B[j])] = permutation

            if A == B:
                self._rmsd[j, i] = self._rmsd[i, j]

        return self._rmsd