This commit is contained in:
Hazel Noack 2025-05-07 16:48:07 +02:00
parent 37a5da37b0
commit 54a2138746

View File

@ -41,7 +41,6 @@ def generate_kernel(radius, sigma=None):
size = 2 * radius + 1 size = 2 * radius + 1
if sigma is None: if sigma is None:
sigma = radius / 3.0 # Common default choice sigma = radius / 3.0 # Common default choice
print(f"radius: {radius}, sigma: {sigma}") print(f"radius: {radius}, sigma: {sigma}")
# Create a grid of (x,y) coordinates # Create a grid of (x,y) coordinates
@ -113,6 +112,7 @@ class KernelVisualizer(QWidget):
super().__init__() super().__init__()
self.setWindowTitle("Gaussian Kernel Visualizer") self.setWindowTitle("Gaussian Kernel Visualizer")
self.image = None self.image = None
self.deconvolved = None
self.load_button = QPushButton("Load Image") self.load_button = QPushButton("Load Image")
self.load_button.clicked.connect(self.load_image) self.load_button.clicked.connect(self.load_image)
@ -125,8 +125,8 @@ class KernelVisualizer(QWidget):
self.sigma_slider.setRange(1, 300) self.sigma_slider.setRange(1, 300)
self.sigma_slider.setValue(15) self.sigma_slider.setValue(15)
# self.radius_slider.valueChanged.connect(self.update_visualization) self.radius_slider.valueChanged.connect(self.update_visualization)
# self.sigma_slider.valueChanged.connect(self.update_visualization) self.sigma_slider.valueChanged.connect(self.update_visualization)
self.kernel_fig = Figure(figsize=(3, 3)) self.kernel_fig = Figure(figsize=(3, 3))
self.kernel_canvas = FigureCanvas(self.kernel_fig) self.kernel_canvas = FigureCanvas(self.kernel_fig)
@ -139,7 +139,7 @@ class KernelVisualizer(QWidget):
self.iter_slider.setValue(10) self.iter_slider.setValue(10)
self.apply_button = QPushButton("Do Deconvolution.") self.apply_button = QPushButton("Do Deconvolution.")
self.apply_button.clicked.connect(self.update_visualization) self.apply_button.clicked.connect(self.apply_kernel)
layout = QVBoxLayout() layout = QVBoxLayout()
layout.addWidget(self.load_button) layout.addWidget(self.load_button)
@ -188,12 +188,26 @@ class KernelVisualizer(QWidget):
img = cv2.imread(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.image = cv2.resize(self.image, (200, 200))
self.update_visualization() self.update_visualization()
def apply_kernel(self):
radius = self.radius_slider.value()
sigma = self.sigma_slider.value() / 10.0
iterations = self.iter_slider.value()
kernel = generate_kernel(radius, sigma)
self.deconvolved = richardson_lucy(self.image, kernel, iterations=iterations)
self.update_visualization()
def update_visualization(self): def update_visualization(self):
radius = self.radius_slider.value() radius = self.radius_slider.value()
sigma = self.sigma_slider.value() / 10.0 * (radius / 3) sigma = self.sigma_slider.value() / 10.0 * (radius / 3)
kernel = generate_kernel(radius, sigma) kernel = generate_kernel(radius, sigma)
iterations = self.iter_slider.value()
# Kernel Visualization # Kernel Visualization
self.kernel_fig.clear() self.kernel_fig.clear()
@ -204,30 +218,17 @@ class KernelVisualizer(QWidget):
self.kernel_canvas.draw() self.kernel_canvas.draw()
if self.image is not None: if self.image is not None:
radius = self.radius_slider.value()
sigma = self.sigma_slider.value() / 10.0
iterations = self.iter_slider.value()
kernel = generate_kernel(radius, sigma)
blurred = cv2.filter2D(self.image, -1, kernel)
deconvolved = richardson_lucy(blurred, kernel, iterations=iterations)
self.image_fig.clear() self.image_fig.clear()
ax1 = self.image_fig.add_subplot(131) ax1 = self.image_fig.add_subplot(131)
ax1.imshow(self.image, cmap='gray') ax1.imshow(self.image, cmap='gray')
ax1.set_title("Original") ax1.set_title("Original")
ax1.axis('off') ax1.axis('off')
ax2 = self.image_fig.add_subplot(132) if self.deconvolved is not None:
ax2.imshow(blurred, cmap='gray') ax3 = self.image_fig.add_subplot(133)
ax2.set_title("Blurred") ax3.imshow(self.deconvolved, cmap='gray')
ax2.axis('off') ax3.set_title(f"Deconvolved (RL, {iterations} iter)")
ax3.axis('off')
ax3 = self.image_fig.add_subplot(133)
ax3.imshow(deconvolved, cmap='gray')
ax3.set_title(f"Deconvolved (RL, {iterations} iter)")
ax3.axis('off')
self.image_canvas.draw() self.image_canvas.draw()
else: else: