studia/jezyki-skryptowe/image-editor/editor/ImageProcessingWorker.py

75 lines
2.3 KiB
Python

import numpy as np
import cv2
from PyQt6.QtCore import pyqtSignal, pyqtSlot, QThread
from queue import Queue
class ImageProcessingWorker(QThread):
result_ready = pyqtSignal(np.ndarray)
update_values = pyqtSignal(dict)
def __init__(self, image, process_function):
super().__init__()
self.image = image
self.process_function = process_function
self.values_queue = Queue(maxsize=1)
@pyqtSlot(dict)
def process_image(self, values):
self.queue(values)
def queue(self, value):
if self.values_queue.full():
try:
self.values_queue.get_nowait()
except Queue.Empty:
pass
self.values_queue.put(value)
def run(self):
while True:
values = self.values_queue.get()
if values is None: # A way to exit the thread
break
img = self.image.copy()
processed_image = self.process_function(img, values)
postprocessed_image = self.postprocess(processed_image)
self.result_ready.emit(postprocessed_image)
def postprocess(self, processed_image):
return processed_image
def stop(self):
self.queue(None)
self.wait()
class RGBImageProcessingWorker(ImageProcessingWorker):
def __init__(self, image, process_function):
img = image.astype('float32')
super().__init__(img, process_function)
def postprocess(self, processed_image):
return processed_image.astype('uint8')
class HSVImageProcessingWorker(ImageProcessingWorker):
def __init__(self, image, process_function):
img = cv2.cvtColor(image, cv2.COLOR_RGB2HSV).astype('float32')
super().__init__(img, process_function)
def postprocess(self, processed_image):
processed_image = processed_image.astype('uint8')
return cv2.cvtColor(processed_image, cv2.COLOR_HSV2RGB)
class HLSImageProcessingWorker(ImageProcessingWorker):
def __init__(self, image, process_function):
img = cv2.cvtColor(image, cv2.COLOR_RGB2HLS).astype('float32')
super().__init__(img, process_function)
def postprocess(self, processed_image):
processed_image = processed_image.astype('uint8')
return cv2.cvtColor(processed_image, cv2.COLOR_HLS2RGB)