import numpy as np import cv2 from PyQt6.QtWidgets import QVBoxLayout, QLabel, QSlider from PyQt6.QtCore import Qt from .ImageParameterDialog import ImageParameterDialog from .. import ImageProcessingWorker class BrightnessContrastDialog(ImageParameterDialog): def __init__(self, image): super().__init__(image, ImageProcessingWorker.RGBImageProcessingWorker) self.setWindowTitle("Brightness/Contrast Adjustment") self.layout = QVBoxLayout() self.brightness_slider = QSlider(Qt.Orientation.Horizontal) self.brightness_slider.setRange(-127, 127) self.contrast_slider = QSlider(Qt.Orientation.Horizontal) self.contrast_slider.setRange(-127, 127) self.label1 = QLabel("Brightness: 0") self.label2 = QLabel("Contrast: 0") self.brightness_slider.valueChanged.connect(lambda value: self.update(self.label1, value, "Brightness")) self.contrast_slider.valueChanged.connect(lambda value: self.update(self.label2, value, "Contrast")) self.layout.addWidget(self.label1) self.layout.addWidget(self.brightness_slider) self.layout.addWidget(self.label2) self.layout.addWidget(self.contrast_slider) self.layout.addWidget(self.button_box) self.setLayout(self.layout) def update(self, label, value, slider_name): label.setText(f"{slider_name}: {value}") self.send_to_process({ 'brightness': self.brightness_slider.value(), 'contrast': self.contrast_slider.value(), }) def process_image(self, image, values): brightness = values.get('brightness', 0.0) + 1 contrast = values.get('contrast', 0.0) + 1 c = (259 * (contrast + 255)) / (255 * (259 - contrast)) scaled = c * (image - 128) + 128 + brightness return np.clip(scaled, 0, 255) @classmethod def dialog_name(cls): return "Brightness-Contrast"