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))
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)