08 Фильтр Гаусса


предисловие

Ранее в операторе Кэнни 07 первым шагом было выполнение гауссовской фильтрации.В этой статье реализована написанная от руки функция для завершения функции гауссовой фильтрации.


1. Что такое фильтрация по Гауссу?

Гауссова фильтрация — это линейный сглаживающий фильтр, который подходит для устранения гауссовского шума и широко используется в процессе шумоподавления при обработке изображений.

С точки зрения непрофессионала, фильтрация по Гауссу — это процесс взвешенного среднего всего изображения, а значение каждого пикселя получается путем взвешенного среднего его самого и других значений пикселей по соседству. Конкретная операция гауссовой фильтрации: использовать шаблон (или свертку, маску) для сканирования каждого пикселя изображения и использовать средневзвешенное значение серого пикселей в окрестности, определяемой шаблоном, для замены значения пикселя в центр шаблона.
Просто этот шаблон подчиняется распределению Гаусса.

2. Теоретический резерв

1. Одномерный гауссиан

Одномерная функция Гаусса строится следующим образом:
вставьте сюда описание изображения

Код выглядит следующим образом (пример):

import numpy as np
import matplotlib.pyplot as plt
mu=0        #均值
#sigma=0.2   #标准差
x=np.linspace(-3,3,60)
for i in range(2,10,2):
    sigma = i/10
    y=np.exp((-(x-mu)**2)/(2*(sigma**2)))/(np.sqrt(2*np.pi)*sigma)
    plt.plot(x,y,"b-",)
plt.grid(True)
plt.show()

вставьте сюда описание изображения
На рисунке выше показана одномерная функция Гаусса, которая меняет только сигму. Но это выглядит грязно, и я не знаю соответствующую сигму.

import numpy as np
import matplotlib.pyplot as plt
mu=0        #均值
#sigma=0.2   #标准差
x=np.linspace(-3,3,60)
colors = ['b', 'g', 'r', 'c', 'm']  # 定义不同颜色
for i in range(2,10,2):
    sigma = i/10
    y=np.exp((-(x-mu)**2)/(2*(sigma**2)))/(np.sqrt(2*np.pi)*sigma)
    plt.plot(x,y,color=colors[(i//2)-1], label='sigma={}'.format(sigma))
plt.grid(True)
plt.legend()  # 显示图例
plt.show()

Поэтому измените приведенный выше код следующим образом:
вставьте сюда описание изображения

2. Двумерная функция Гаусса

Поскольку изображение двумерное, одномерная функция Гаусса, конечно, не может удовлетворить наши потребности. Среди них x представляет расстояние между соседними пикселями и центральной точкой в ​​горизонтальном направлении, а y представляет расстояние в вертикальном направлении:

вставьте сюда описание изображения

Код выглядит следующим образом (пример):

import numpy as np
import matplotlib.pyplot as plt
def two_dim_gaussian(x, y, sigma_x, sigma_y, x0, y0):
    Z = np.exp((-0.5)*((x-x0)**2/(sigma_x)**2 +(y-y0)**2/(sigma_y)**2))/(np.pi*2*sigma_y*sigma_x)
    return Z
X = np.arange(-3, 3.1, 0.1,dtype=np.float64).reshape(-1,1)
Y = np.arange(-3, 3.1, 0.1,dtype=np.float64)
mux,muy=0,0
sigmax,sigmay = 0.8,0.8
Z = two_dim_gaussian(X,Y,sigmax,sigmay,mux,muy)
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot_surface(X, Y, Z, cmap='coolwarm')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()

вставьте сюда описание изображения

3 Создайте ядро ​​свертки Гаусса

import numpy as np
import matplotlib.pyplot as plt
def two_dim_gaussian(x, y, sigma_x, sigma_y, x0, y0):
    Z = np.exp((-0.5)*((x-x0)**2/(sigma_x)**2 +(y-y0)**2/(sigma_y)**2))/(np.pi*2*sigma_y*sigma_x)
    return Z
X = np.arange(-2, 3, 1,dtype=np.float64).reshape(-1,1)
Y = np.arange(-2, 3, 1,dtype=np.float64)
mux,muy=0,0
sigmax,sigmay = 0.8,0.8
Z = two_dim_gaussian(X,Y,sigmax,sigmay,mux,muy)
print(Z)

Создайте ядро ​​свертки 5 * 5:
вставьте сюда описание изображения
нормализуйте эту часть, чтобы получить:
вставьте сюда описание изображения


Supongo que te gusta

Origin blog.csdn.net/CSDN_Yangk/article/details/129860400
Recomendado
Clasificación