54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
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" |