Гауссов фильтр только затемняет изображение, не размывает - PullRequest
0 голосов
/ 02 апреля 2019

Я хотел понять реализацию фильтра Гаусса. В этом коде я реализовал ядро ​​Гаусса и применил его к изображению с 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)
...