Я хотел понять реализацию фильтра Гаусса. В этом коде я реализовал ядро Гаусса и применил его к изображению с filter2D
. Но вместо размытого изображения я получаю только более темный (для высокого значения дисперсии) и очень яркий (для низкого значения дисперсии). Я попробовал фиксированное np.ones(3,3)/2
для ядра, и оно успешно размыло изображение. В чем может быть проблема?
import cv2
import math
import numpy as np
filename = "lenna.png"
winname = "G Team Lets Go"
original = cv2.imread(filename)
cv2.namedWindow(winname)
def gaussian_blurr(image, variance, kernel_size):
def gaussian(x, y):
return (1 / (2 * np.pi * variance) * np.exp(-1 * ((math.pow(x, 2) + math.pow(y, 2)) / (2 * variance))))
kernel = np.zeros((kernel_size, kernel_size))
for x in range(-int(kernel_size/2), kernel_size-int(kernel_size/2)):
for y in range(-int(kernel_size/2), kernel_size-int(kernel_size/2)):
kernel[x+int(kernel_size/2), y+int(kernel_size/2)] = gaussian(x, y)
padding_size = int(kernel_size/2)
withBorder = cv2.copyMakeBorder(
image, padding_size, padding_size, padding_size, padding_size, cv2.BORDER_REPLICATE)
return cv2.filter2D(image, -1, kernel)
variance = 1
size = 3
def handle_variance(value):
if value == 0:
value = 1
variance = value/100
cv2.imshow(winname, gaussian_blurr(original, variance, size))
def handle_size(value):
if value == 0:
value = 1
size = value
cv2.imshow(winname, gaussian_blurr(original, variance, size))
cv2.createTrackbar("Variance", winname, 0, 500, handle_variance)
cv2.createTrackbar("Size", winname, 0, 5, handle_size)
cv2.imshow(winname, gaussian_blurr(original, 0.2, 3))
cv2.waitKey(0)