Crop canvas based on objective property
This commit is contained in:
parent
6f997cc990
commit
01012f52a3
1 changed files with 28 additions and 2 deletions
|
|
@ -114,6 +114,24 @@ class SimulatedCamera(BaseCamera):
|
||||||
|
|
||||||
_show_sample: bool = True
|
_show_sample: bool = True
|
||||||
|
|
||||||
|
_objective: int = 40 # default 40x, our standard build
|
||||||
|
|
||||||
|
@lt.property
|
||||||
|
def objective(self) -> int:
|
||||||
|
"""Objective magnification (e.g. 4, 10, 20, 40, 60, 100)."""
|
||||||
|
return self._objective
|
||||||
|
|
||||||
|
@objective.setter
|
||||||
|
def _set_objective(self, value: int) -> None:
|
||||||
|
if value not in (4, 10, 20, 40, 60, 100):
|
||||||
|
raise ValueError("Objective must be one of 4, 10, 20, 40, 60, 100.")
|
||||||
|
self._objective = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def magnification_scale(self) -> float:
|
||||||
|
"""Magnification scale relative to 40x objective."""
|
||||||
|
return self._objective / 40.0
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
thing_server_interface: lt.ThingServerInterface,
|
thing_server_interface: lt.ThingServerInterface,
|
||||||
|
|
@ -300,7 +318,14 @@ class SimulatedCamera(BaseCamera):
|
||||||
:param pos: a 3-item tuple containing the x,y,z coordinates of the 'stage'
|
:param pos: a 3-item tuple containing the x,y,z coordinates of the 'stage'
|
||||||
"""
|
"""
|
||||||
canvas_width, canvas_height, _ = self.canvas_shape
|
canvas_width, canvas_height, _ = self.canvas_shape
|
||||||
image_width, image_height, _ = self.ds_shape
|
# Base image size
|
||||||
|
base_width, base_height, _ = self.ds_shape
|
||||||
|
|
||||||
|
# Scale crop size inversely with magnification
|
||||||
|
scale = self.magnification_scale
|
||||||
|
image_width = int(base_width / scale)
|
||||||
|
image_height = int(base_height / scale)
|
||||||
|
|
||||||
im_pos = (
|
im_pos = (
|
||||||
pos[0] * RATIO[0] / DOWNSAMPLE,
|
pos[0] * RATIO[0] / DOWNSAMPLE,
|
||||||
pos[1] * RATIO[1] / DOWNSAMPLE,
|
pos[1] * RATIO[1] / DOWNSAMPLE,
|
||||||
|
|
@ -336,7 +361,7 @@ class SimulatedCamera(BaseCamera):
|
||||||
np_img = fast_pil_blur(focused_np_img, sigma=np.abs(im_pos[2]) / 5)
|
np_img = fast_pil_blur(focused_np_img, sigma=np.abs(im_pos[2]) / 5)
|
||||||
|
|
||||||
# Add noise and convert to uint8
|
# Add noise and convert to uint8
|
||||||
np_img += RNG.normal(scale=self.noise_level, size=self.ds_shape).astype("int16")
|
np_img += RNG.normal(scale=self.noise_level, size=np_img.shape).astype("int16")
|
||||||
np.clip(np_img, 0, 255, out=np_img)
|
np.clip(np_img, 0, 255, out=np_img)
|
||||||
pl_img = Image.fromarray(np_img.astype("uint8"))
|
pl_img = Image.fromarray(np_img.astype("uint8"))
|
||||||
return pl_img.resize((self.shape[1], self.shape[0]), Image.Resampling.BILINEAR)
|
return pl_img.resize((self.shape[1], self.shape[0]), Image.Resampling.BILINEAR)
|
||||||
|
|
@ -521,6 +546,7 @@ class SimulatedCamera(BaseCamera):
|
||||||
property_control_for(self, "blob_density", label="Sample Density"),
|
property_control_for(self, "blob_density", label="Sample Density"),
|
||||||
property_control_for(self, "colour", label="Sample Colour"),
|
property_control_for(self, "colour", label="Sample Colour"),
|
||||||
property_control_for(self, "noise_level", label="Noise Level"),
|
property_control_for(self, "noise_level", label="Noise Level"),
|
||||||
|
property_control_for(self, "objective", label="Objective Magnification"),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue