예제 #1
0
 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)
예제 #2
0
    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)
예제 #3
0
 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())
     }