Каталог статей
предисловие
Ранее в операторе Кэнни 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:
нормализуйте эту часть, чтобы получить: