При применении фильтра Гаусса изображение становится темным - PullRequest
0 голосов
/ 22 апреля 2020

Когда я запускаю следующий код, результат получается размытым, но изображение становится темнее, когда я увеличиваю значение сигмы.
Импорт

import numpy as np
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
import math
import copy

Код фильтра Гаусса

e = 2.71828182845904
pi = 3.1415926535897

def gaus(mat_l,sigma):
    Matrix = [[0.0 for x in range(mat_l)] for y in range(mat_l)] 
    for x in range(-(int(mat_l/2)),(int(mat_l/2))+1):
        for y in range(-(int(mat_l/2)),(int(mat_l/2))+1):
            ee = pow(e,(-(((pow(x,2)+pow(y,2))/(2*(pow(sigma,2)))))))
            aa = (1/(2*pi*pow(sigma,2)))
            result = ee*aa
            Matrix[x+int(mat_l/2)][y+int(mat_l/2)] = round(result,6)
    return Matrix

Код свертки

def matrix_convolve(image,kernel,a,b,mul=1):
    print(kernel)
    img_x, img_y = image.shape
    kernl_x, kernl_y = kernel.shape

    result = copy.deepcopy(image)
    for i in range(img_x-int(len(kernel)/2)):
        for j in range(img_y-int(len(kernel)/2)):
            result[i][j] = 0
            summ = 0
            for s in range(-a,a+1):
                for t in range(-b,b+1):
                    summ += kernel[s,t] * image[i+s,j+t]
            result[i][j] = math.ceil(mul*summ)
    return result

Драйвер

image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

kernal = gaus(5,5)
kernal = np.array([kernal[0],kernal[1],kernal[2],kernal[3],kernal[4]])

result3 = matrix_convolve(image,kernal,2,2)
plt.imshow(result3.astype(np.uint8),cmap='gray')
plt.show()

Когда сигма равна 5 , выходное изображение output_with_sigma_5

, когда сигма равно 2, выходное изображение output_with_sigma_2

result3=cv2.GaussianBlur(image,(5,5),5)
plt.imshow(result3.astype(np.uint8),cmap='gray')
plt.show()

При размытии с использованием OpenCV следующий вывод для сигма 5 opencv

1 Ответ

4 голосов
/ 22 апреля 2020

Проблема в том, что вы выбираете только 5x5 сетку гауссова ядра. Чем больше сигма, тем больше ядра вы отсекаете, и тем больше энергии вы теряете.

Размытое ядро ​​всегда должно составлять до 1. Если оно прибавляет, например, 0,5, средняя интенсивность выходного изображения будет вдвое меньше, чем на входе.

Решение имеет два аспекта:

  1. Пример большей части вашего ядра. По крайней мере 1+ceil(2*sigma), но желательно 3 раза вместо 2.

  2. Нормализуйте ваше ядро. Даже если вы берете до 3 * сигма из центра, вы все равно теряете немного энергии в выборке, особенно для маленькой сигмы. Нормализация ядра так же проста, как сложение всех значений ядра, а затем деление каждого значения ядра на эту сумму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...