generated from Hazel/python-project
	feat:
This commit is contained in:
		| @@ -8,6 +8,7 @@ from PyQt5.QtWidgets import ( | |||||||
| from PyQt5.QtCore import Qt | from PyQt5.QtCore import Qt | ||||||
| from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas | from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas | ||||||
| from matplotlib.figure import Figure | from matplotlib.figure import Figure | ||||||
|  | import scipy.signal | ||||||
|  |  | ||||||
| import os | import os | ||||||
| os.environ.pop("QT_QPA_PLATFORM_PLUGIN_PATH", None) | os.environ.pop("QT_QPA_PLATFORM_PLUGIN_PATH", None) | ||||||
| @@ -43,7 +44,7 @@ def generate_kernel(radius, sigma=None): | |||||||
|  |  | ||||||
|  |  | ||||||
| class KernelVisualizer(QWidget): | class KernelVisualizer(QWidget): | ||||||
|     def __init__(self): |     def __init__(self, image_path=None): | ||||||
|         super().__init__() |         super().__init__() | ||||||
|         self.setWindowTitle("Gaussian Kernel Visualizer") |         self.setWindowTitle("Gaussian Kernel Visualizer") | ||||||
|         self.image = None |         self.image = None | ||||||
| @@ -80,16 +81,23 @@ class KernelVisualizer(QWidget): | |||||||
|         layout.addLayout(sliders_layout) |         layout.addLayout(sliders_layout) | ||||||
|         layout.addWidget(QLabel("Kernel Visualization:")) |         layout.addWidget(QLabel("Kernel Visualization:")) | ||||||
|         layout.addWidget(self.kernel_canvas) |         layout.addWidget(self.kernel_canvas) | ||||||
|         layout.addWidget(QLabel("Original and Blurred Image:")) |         layout.addWidget(QLabel("Original and Deconvolved Image:")) | ||||||
|         layout.addWidget(self.image_canvas) |         layout.addWidget(self.image_canvas) | ||||||
|  |  | ||||||
|         self.setLayout(layout) |         self.setLayout(layout) | ||||||
|  |          | ||||||
|  |         if image_path: | ||||||
|  |             self.load_image(image_path) | ||||||
|  |         else: | ||||||
|             self.update_visualization() |             self.update_visualization() | ||||||
|  |  | ||||||
|     def load_image(self): |     def load_image(self, image_path=None): | ||||||
|  |         if not image_path: | ||||||
|             fname, _ = QFileDialog.getOpenFileName(self, "Open Image", "", "Images (*.png *.jpg *.bmp *.jpeg)") |             fname, _ = QFileDialog.getOpenFileName(self, "Open Image", "", "Images (*.png *.jpg *.bmp *.jpeg)") | ||||||
|         if fname: |             image_path = fname | ||||||
|             img = cv2.imread(fname) |          | ||||||
|  |         if image_path: | ||||||
|  |             img = cv2.imread(image_path) | ||||||
|             if img is not None: |             if img is not None: | ||||||
|                 self.image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) |                 self.image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | ||||||
|                 self.update_visualization() |                 self.update_visualization() | ||||||
| @@ -109,7 +117,21 @@ class KernelVisualizer(QWidget): | |||||||
|  |  | ||||||
|         if self.image is not None: |         if self.image is not None: | ||||||
|             kernel_size = 2 * radius + 1 |             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() |             self.image_fig.clear() | ||||||
|             ax1 = self.image_fig.add_subplot(121) |             ax1 = self.image_fig.add_subplot(121) | ||||||
| @@ -118,8 +140,8 @@ class KernelVisualizer(QWidget): | |||||||
|             ax1.axis('off') |             ax1.axis('off') | ||||||
|  |  | ||||||
|             ax2 = self.image_fig.add_subplot(122) |             ax2 = self.image_fig.add_subplot(122) | ||||||
|             ax2.imshow(blurred, cmap='gray') |             ax2.imshow(deconvolved_image, cmap='gray') | ||||||
|             ax2.set_title("Blurred") |             ax2.set_title("Deconvolved") | ||||||
|             ax2.axis('off') |             ax2.axis('off') | ||||||
|  |  | ||||||
|             self.image_canvas.draw() |             self.image_canvas.draw() | ||||||
| @@ -132,7 +154,12 @@ class KernelVisualizer(QWidget): | |||||||
|  |  | ||||||
|  |  | ||||||
| if __name__ == "__main__": | 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) |     app = QApplication(sys.argv) | ||||||
|     viewer = KernelVisualizer() |     viewer = KernelVisualizer(image_path=image_path) | ||||||
|     viewer.show() |     viewer.show() | ||||||
|     sys.exit(app.exec_()) |     sys.exit(app.exec_()) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user