Фильтр Гаусса используется для уменьшения шума в изображении, а также деталей изображения. Гауссовский фильтр всегда предпочтительнее прямоугольного фильтра.

Шаги по внедрению фильтра Гаусса с нуля на изображение:

  1. Определение функции свертки, которая выполняет итерацию по изображению на основе размера ядра (фильтр Гаусса). На рисунке внизу слева представлено старое изображение с красной рамкой в ​​качестве ядра, вычисляющего значение из всех девяти пикселей и вставляющего в центральный пиксель.

def convolution(oldimage, kernel):
    #image = Image.fromarray(image, 'RGB')
    image_h = oldimage.shape[0]
    image_w = oldimage.shape[1]
    
    
    kernel_h = kernel.shape[0]
    kernel_w = kernel.shape[1]
    
    if(len(oldimage.shape) == 3):
        image_pad = np.pad(oldimage, pad_width=(
            \(kernel_h // 2, kernel_h // 2),(kernel_w // 2, 
            \kernel_w // 2),(0,0)), mode='constant', 
            \constant_values=0).astype(np.float32)
    elif(len(oldimage.shape) == 2):
        image_pad = np.pad(oldimage, pad_width=(
            \(kernel_h // 2, kernel_h // 2),(kernel_w // 2, 
            \kernel_w // 2)), mode='constant', constant_values=0)
            \.astype(np.float32)
    
    
    h = kernel_h // 2
    w = kernel_w // 2
    
    image_conv = np.zeros(image_pad.shape)
    
    for i in range(h, image_pad.shape[0]-h):
        for j in range(w, image_pad.shape[1]-w):
            #sum = 0
            x = image_pad[i-h:i-h+kernel_h, j-w:j-w+kernel_w]
            x = x.flatten()*kernel.flatten()
            image_conv[i][j] = x.sum()
    h_end = -h
    w_end = -w
    
    if(h == 0):
        return image_conv[h:,w:w_end]
    if(w == 0):
        return image_conv[h:h_end,w:]
return image_conv[h:h_end,w:w_end]

2. Определение функции Гаусса на основе размера сигмы (стандартное отклонение).

Формула:

def GaussianBlurImage(image, sigma):
    #image = imread(image)
    image = Image.open(image)
    image = np.asarray(image)
    #print(image)
    filter_size = 2 * int(4 * sigma + 0.5) + 1
    gaussian_filter = np.zeros((filter_size, filter_size), np.float32)
    m = filter_size//2
    n = filter_size//2
    
    for x in range(-m, m+1):
        for y in range(-n, n+1):
            x1 = 2*np.pi*(sigma**2)
            x2 = np.exp(-(x**2 + y**2)/(2* sigma**2))
            gaussian_filter[x+m, y+n] = (1/x1)*x2
    
    im_filtered = np.zeros_like(image, dtype=np.float32)
    for c in range(3):
        im_filtered[:, :, c] = convolution(image[:, :, c], gaussian_filter)
    return (im_filtered.astype(np.uint8))

Исходное изображение:

Окончательное изображение после применения фильтра Гаусса:

Спасибо за прочтение.