Example #1
0
class Widget(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        # pciture manager

        self.manager_img = pictures.Manager()
        self.layers = []

        self.btn_add_layer = QPushButton("Add layer")

        self.btn_remove_layer = QPushButton("Remove 1 layer")
        self.btn_clear = QPushButton("Clear All Layers")

        self.sbox_alpha = QSpinBox()
        self.sbox_alpha.setRange(0, 100)
        self.sbox_alpha.setValue(50)

        self.sbox_rgb = QSpinBox()
        self.sbox_rgb.setRange(0, 100)
        self.sbox_rgb.setValue(50)

        # connect buttons
        # Signals and Slots
        self.btn_add_layer.clicked.connect(self.add_layer)

        self.btn_remove_layer.clicked.connect(self.remove_layer)
        self.sbox_remove_index = QSpinBox()
        self.sbox_remove_index.setValue(0)
        self.sbox_remove_index.setRange(0, 0)
        self.sbox_remove_index.setSingleStep(1)

        self.lbl_index_remove = QLabel("index calque")

        self.btn_clear.clicked.connect(self.clear)

        self.pic_res = QLabel()

        # self.pic_1.setGeometry(QRect(10, 40, 500, 500))
        # self.pic_1.setGeometry(QRect(10, 540, 500, 500))
        # self.pic_1.setPixmap(pixmap)
        # self.pic_2.setPixmap(pixmap)
        # self.pic_res.setPixmap(pixmap)

        self.cbox_actions = QComboBox()
        self.cbox_definitions = QComboBox()
        self.setup_cbox()

        self.form_layout = QFormLayout()
        self.form_layout.addRow("alpha:", self.sbox_alpha)
        self.form_layout.addRow("rgb:", self.sbox_rgb)

        self.h_layout_add_layer = QHBoxLayout()
        self.h_layout_add_layer.addWidget(self.btn_add_layer)
        self.h_layout_add_layer.addWidget(self.cbox_actions)
        self.h_layout_add_layer.addWidget(self.cbox_definitions)
        self.h_layout_add_layer.addLayout(self.form_layout)

        self.h_layout_remove = QHBoxLayout()
        self.h_layout_remove.addWidget(self.btn_remove_layer)
        self.h_layout_remove.addWidget(self.lbl_index_remove)
        self.h_layout_remove.addWidget(self.sbox_remove_index)
        self.h_layout_remove.addWidget(self.btn_clear)

        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.pic_res)
        self.v_layout.addLayout(self.h_layout_add_layer)
        # self.v_layout.addLayout(self.form_layout)
        self.v_layout.addLayout(self.h_layout_remove)

        self.setLayout(self.v_layout)

        self.connect_signals()

    def connect_signals(self):
        self.manager_img.pixmap_updated.connect(self.pic_res.setPixmap)
        self.cbox_actions.currentTextChanged.connect(
            self.set_overlay_blendmode)
        self.cbox_definitions.currentTextChanged.connect(self.set_definition)

    def set_overlay_blendmode(self, blend_mode):
        self.manager_img.set_blend_mode(self.sbox_remove_index.value() - 1,
                                        self.cbox_actions.currentText())

    def set_definition(self, str_def):
        self.manager_img.set_definition(self.cbox_definitions.currentText())

    def remove_layer(self):
        self.manager_img.remove_layer(self.sbox_remove_index.value() - 1)

        self.sbox_remove_index.setMaximum(self.sbox_remove_index.maximum() - 1)
        if not self.manager_img.layers:
            self.sbox_remove_index.setRange(0, 0)

    def clear(self):
        self.layers = []
        self.manager_img.clear()

    def setup_cbox(self):
        for action in pictures.BLEND_MODES:
            self.cbox_actions.addItem(action)
        for key, _ in pictures.DEFINITIONS.items():
            self.cbox_definitions.addItem(key)

    def add_layer(self):
        path_filename = QFileDialog.getOpenFileName(
            self,
            "Choose Image",
            "/home/",
        )

        #self.manager_img.set_alpha(0, self.sbox_alpha.value())
        #self.manager_img.set_definition(self.cbox_definitions.currentText())

        self.manager_img.add_layer(path_filename[0],
                                   blend_mode=self.cbox_actions.currentText())

        self.sbox_remove_index.setRange(1, len(self.manager_img.layers))
        self.sbox_remove_index.setValue(len(self.manager_img.layers))
Example #2
0
class GradientWidget(ToolWidget):
    def __init__(self, image, parent=None):
        super(GradientWidget, self).__init__(parent)
        self.levels_spin = QSpinBox()
        self.levels_spin.setRange(-1, 16)
        self.levels_spin.setSpecialValueText(self.tr('Auto'))
        self.levels_spin.setValue(-1)
        self.invert_check = QCheckBox(self.tr('Invert'))
        self.abs_check = QCheckBox(self.tr('Absolute'))

        self.grad_viewer = ImageViewer(image, image)
        self.image = image
        self.process()

        self.levels_spin.valueChanged.connect(self.process)
        self.invert_check.toggled.connect(self.process)
        self.abs_check.toggled.connect(self.process)

        top_layout = QHBoxLayout()
        top_layout.addWidget(QLabel(self.tr('Levels:')))
        top_layout.addWidget(self.levels_spin)
        top_layout.addWidget(self.invert_check)
        top_layout.addWidget(self.abs_check)
        top_layout.addStretch()

        main_layout = QVBoxLayout()
        main_layout.addLayout(top_layout)
        main_layout.addWidget(self.grad_viewer)

        self.setLayout(main_layout)

    def process(self):
        intensity = self.levels_spin.value()
        invert = self.invert_check.isChecked()
        absolute = self.abs_check.isChecked()
        self.levels_spin.setEnabled(not absolute)
        self.invert_check.setEnabled(not absolute)

        gray = cv.cvtColor(self.image, cv.COLOR_BGR2GRAY)
        diff_x = cv.Scharr(gray, cv.CV_32F, 1, 0)
        diff_y = cv.Scharr(gray, cv.CV_32F, 0, 1)
        diff_z = cv.normalize(np.abs(diff_x + diff_y), None, 0, 255,
                              cv.NORM_MINMAX)
        diff_z = cv.LUT(diff_z.astype(np.uint8), create_lut(0, 90))
        grad_x = +diff_x if invert else -diff_x
        grad_y = +diff_y if invert else -diff_y
        grad_z = diff_z

        if not absolute:
            min_x, max_x, _, _ = cv.minMaxLoc(grad_x)
            lim_x = max(abs(min_x), abs(max_x))
            grad_x = (grad_x / lim_x + 1) * 127
            min_y, max_y, _, _ = cv.minMaxLoc(grad_y)
            lim_y = max(abs(min_y), abs(max_y))
            grad_y = (grad_y / lim_y + 1) * 127
        else:
            grad_x = cv.normalize(np.abs(grad_x), None, 0, 255, cv.NORM_MINMAX)
            grad_y = cv.normalize(np.abs(grad_y), None, 0, 255, cv.NORM_MINMAX)
        grad_x = grad_x.astype(np.uint8)
        grad_y = grad_y.astype(np.uint8)

        if intensity >= 0 and not absolute:
            max_intensity = self.levels_spin.maximum()
            low = 127 - (max_intensity - intensity)
            high = 127 + (max_intensity - intensity)
            lut_xy = create_lut(low, high)
            grad_x = cv.LUT(grad_x, lut_xy)
            grad_y = cv.LUT(grad_y, lut_xy)
        else:
            grad_x = cv.equalizeHist(grad_x)
            grad_y = cv.equalizeHist(grad_y)
        gradient = np.stack((grad_z, grad_x, grad_y), axis=2)
        self.grad_viewer.update_processed(gradient)