import numpy as np
from fibsem.mocktypes import MockAdornedImage, MockPixelSize
def _angle_to_matplotlib(theta):
"""Convert Autoscript rotation angle to matplotlib angle.
Autoscript requires: Positive direction is clockwise, value in radians.
Matplotlib requires: Positive direction is anti-clockwise, in degrees.
Parameters
----------
theta : in radians, positive direction is clockwise.
Returns
-------
np.rad2deg(-theta) : in degrees, positive direction is anti-clockwise.
"""
return np.rad2deg(-theta)
[docs]def convert_to_adornedimage(image, pixelsize_x=None, pixelsize_y=None):
"""Mock an adorned image type.
Parameters
----------
image : numpy array
Equivalent to image.data on a real AdornedImage type.
pixelsize_x : float, optional.
Pixel size in x dimension, in meters.
pixelsize_y : float, optional.
Pixel size in y dimension, in meters.
Returns
-------
MockAdornedImage
"""
return MockAdornedImage(image=image,
pixelsize_x=pixelsize_x,
pixelsize_y=pixelsize_y)
[docs]def convert_to_numpy(image):
"""Return numpy image array from AdornedImage type."""
try:
from autoscript_sdb_microscope_client.structures import AdornedImage
except ImportError:
pass
else:
if isinstance(image, AdornedImage):
return image.data
if isinstance(image, np.ndarray):
return image
elif isinstance(image, MockAdornedImage):
return image.data
else:
raise TypeError('Unexpected data type: {}'.format(type(image)))
[docs]def meters_to_pixels(amount, pixel_size):
"""Convert meters to pizels."""
return amount / pixel_size.x
[docs]def pixels_to_meters(amount, pixel_size):
"""Convert pixel size to meters."""
return amount * pixel_size.x
def _realspace_coord_to_pixels(coord, pixel_size, image_shape):
"""Converts a real space coordinate to a pixel coordinate.
Parameters
----------
coord : Listlike.
Realspace coordinate; in row, column format.
pixel_size : Pixel size object, with attributes x and y. Units of meters.
image_shape : tuple
Shape of image dimensions, numpy shape attribute.
Returns
-------
pixel_coordinate
Pixel space coordinate; in row, column format.
Image origin for pixel coordinates is at the top left corner.
"""
coord[0] = -coord[0] / pixel_size.y # remember sign flip in y
coord[1] = coord[1] / pixel_size.x
pixel_coordinate = np.array(coord) + (np.array(image_shape) / 2)
return pixel_coordinate
def _pixel_coord_to_realspace(coord, pixel_size, image_shape):
"""Converts a pixel space coordinate to real space.
Parameters
----------
coord : Listlike.
Pixel space coordinate; in row, column format.
pixel_size : Pixel size object, with attributes x and y. Units of meters.
image_shape : tuple
Shape of image dimensions, numpy shape attribute.
Returns
-------
realspace_coordinate
Realspace coordinate; in row, column format.
Real space image origin is at the center of the field of view.
"""
realspace_coordinate = np.array(coord) - (np.array(image_shape) / 2)
realspace_coordinate[0] = -1 * realspace_coordinate[0] * pixel_size.y
realspace_coordinate[1] = realspace_coordinate[1] * pixel_size.x
return realspace_coordinate