diff --git a/deblur/symetric_kernel.py b/deblur/symetric_kernel.py index 052b783..c3c8d5f 100644 --- a/deblur/symetric_kernel.py +++ b/deblur/symetric_kernel.py @@ -8,6 +8,7 @@ from PyQt5.QtWidgets import ( from PyQt5.QtCore import Qt from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure +import scipy.signal import os os.environ.pop("QT_QPA_PLATFORM_PLUGIN_PATH", None) @@ -43,7 +44,7 @@ def generate_kernel(radius, sigma=None): class KernelVisualizer(QWidget): - def __init__(self): + def __init__(self, image_path=None): super().__init__() self.setWindowTitle("Gaussian Kernel Visualizer") self.image = None @@ -80,16 +81,23 @@ class KernelVisualizer(QWidget): layout.addLayout(sliders_layout) layout.addWidget(QLabel("Kernel Visualization:")) layout.addWidget(self.kernel_canvas) - layout.addWidget(QLabel("Original and Blurred Image:")) + layout.addWidget(QLabel("Original and Deconvolved Image:")) layout.addWidget(self.image_canvas) self.setLayout(layout) - self.update_visualization() + + if image_path: + self.load_image(image_path) + else: + self.update_visualization() - def load_image(self): - fname, _ = QFileDialog.getOpenFileName(self, "Open Image", "", "Images (*.png *.jpg *.bmp *.jpeg)") - if fname: - img = cv2.imread(fname) + def load_image(self, image_path=None): + if not image_path: + fname, _ = QFileDialog.getOpenFileName(self, "Open Image", "", "Images (*.png *.jpg *.bmp *.jpeg)") + image_path = fname + + if image_path: + img = cv2.imread(image_path) if img is not None: self.image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) self.update_visualization() @@ -109,7 +117,21 @@ class KernelVisualizer(QWidget): if self.image is not None: kernel_size = 2 * radius + 1 - blurred = cv2.GaussianBlur(self.image, (kernel_size, kernel_size), sigma) + + # Apply row-by-row deconvolution + deconvolved_image = np.zeros_like(self.image) + + # Perform row-wise deconvolution with padded kernel + for i in range(self.image.shape[0]): + padded_kernel = np.pad(kernel, ((0, self.image.shape[1] - kernel_size), (0, 0)), mode='constant') + deconvolved_image[i, :], _ = scipy.signal.deconvolve(self.image[i, :], padded_kernel[i, :]) + + # Perform column-wise deconvolution with padded kernel + for j in range(self.image.shape[1]): + padded_kernel = np.pad(kernel, ((0, self.image.shape[0] - kernel_size), (0, 0)), mode='constant') + deconvolved_image[:, j], _ = scipy.signal.deconvolve(self.image[:, j], padded_kernel[:, j]) + + deconvolved_image = np.clip(deconvolved_image, 0, 255).astype(np.uint8) # Ensure valid range self.image_fig.clear() ax1 = self.image_fig.add_subplot(121) @@ -118,8 +140,8 @@ class KernelVisualizer(QWidget): ax1.axis('off') ax2 = self.image_fig.add_subplot(122) - ax2.imshow(blurred, cmap='gray') - ax2.set_title("Blurred") + ax2.imshow(deconvolved_image, cmap='gray') + ax2.set_title("Deconvolved") ax2.axis('off') self.image_canvas.draw() @@ -132,7 +154,12 @@ class KernelVisualizer(QWidget): if __name__ == "__main__": + image_path = None + if len(sys.argv) > 1: + image_path = sys.argv[1] # Get image path from command-line argument + print(image_path) + app = QApplication(sys.argv) - viewer = KernelVisualizer() + viewer = KernelVisualizer(image_path=image_path) viewer.show() sys.exit(app.exec_())