def transform( cls, image: Image, arguments: dict, callback_function: Optional[Callable[[str, int], None]] = None) -> Image: keys = [x for x in arguments if x.startswith("scale")] keys_order = Image.axis_order.lower() scale_factor = [1.0] * len(keys_order) if len(keys) == 1 and keys[0] == "scale": for letter in image.get_dimension_letters().lower(): scale_factor[keys_order.index(letter)] = arguments["scale"] spacing = [x / arguments["scale"] for x in image.spacing] else: # assume that all keys are in format scale_{} for key in keys: letter = key[-1] scale_factor[keys_order.index(letter)] = arguments[key] spacing = [ x / arguments[f"scale_{y}"] for x, y in zip(image.spacing, image.get_dimension_letters().lower()) ] array = zoom(image.get_data(), scale_factor, mode="mirror") if image.mask is not None: mask = zoom(image.mask, scale_factor[:-1], mode="mirror") else: mask = None return image.substitute(data=array, image_spacing=spacing, mask=mask)
def __init__(self, image: Image, transform_dict: Dict[str, TransformBase] = None): super().__init__() if transform_dict is None: transform_dict = image_transform_dict self.choose = QComboBox() self.stacked = QStackedWidget() for key, val in transform_dict.items(): self.choose.addItem(key) initial_values = val.calculate_initial(image) form_widget = FormWidget( val.get_fields_per_dimension(image.get_dimension_letters()), initial_values) self.stacked.addWidget(form_widget) self.choose.currentIndexChanged.connect(self.stacked.setCurrentIndex) self.cancel_btn = QPushButton("Cancel") self.cancel_btn.clicked.connect(self.reject) self.process_btn = QPushButton("Process") self.process_btn.clicked.connect(self.process) self.transform_dict = transform_dict self.result_val: ImageAdjustTuple = None layout = QGridLayout() layout.addWidget(self.choose, 0, 0, 1, 3) layout.addWidget(self.stacked, 1, 0, 1, 3) layout.addWidget(self.cancel_btn, 2, 0) layout.addWidget(self.process_btn, 2, 2) self.setLayout(layout)
def calculate_initial(cls, image: Image): min_val = min(image.spacing) return { f"scale_{l}": x / min_val for x, l in zip(image.spacing, image.get_dimension_letters().lower()) }