如何用python实现图像的一维高斯滤波器

Python018

如何用python实现图像的一维高斯滤波器,第1张

如何用python实现图像的一维高斯滤波器

现在把卷积模板中的值换一下,不是全1了,换成一组符合高斯分布的数值放在模板里面,比如这时中间的数值最大,往两边走越来越小,构造一个小的高斯包。实现的函数为cv2.GaussianBlur()。对于高斯模板,我们需要制定的是高斯核的高和宽(奇数),沿x与y方向的标准差(如果只给x,y=x,如果都给0,那么函数会自己计算)。高斯核可以有效的出去图像的高斯噪声。当然也可以自己构造高斯核,相关函数:cv2.GaussianKernel().

import cv2

import numpy as np

import matplotlib.pyplot as plt

img = cv2.imread(‘flower.jpg‘,0) #直接读为灰度图像

for i in range(2000): #添加点噪声

temp_x = np.random.randint(0,img.shape[0])

temp_y = np.random.randint(0,img.shape[1])

img[temp_x][temp_y] = 255

blur = cv2.GaussianBlur(img,(5,5),0)

plt.subplot(1,2,1),plt.imshow(img,‘gray‘)#默认彩色,另一种彩色bgr

plt.subplot(1,2,2),plt.imshow(blur,‘gray‘)

如何用python实现图像的一维高斯滤波

建议你不要使用高斯滤波。

推荐你使用一维中值滤波

matlab的函数为

y = medfilt1(x,n)

x为数组,是你要处理原始波形,n是中值滤波器的参数(大于零的整数)。y是滤波以后的结果(是数组)

后面再

plot(y)

就能看到滤波以后的结果

经过medfilt1过滤以后,y里储存的是低频的波形,如果你需要高频波形,x-y就是高频波形

顺便再说一点,n是偶数的话,滤波效果比较好。

N越小,y里包含的高频成分就越多,y越大,y里包含的高频成分就越少。

记住,无论如何y里保存的都是整体的低频波。(如果你看不懂的话,滤一下,看y波形,你马上就懂了)

borderType= None)函数

此函数利用高斯滤波器平滑一张图像。该函数将源图像与指定的高斯核进行卷积。

src:输入图像

ksize:(核的宽度,核的高度),输入高斯核的尺寸,核的宽高都必须是正奇数。否则,将会从参数sigma中计算得到。

dst:输出图像,尺寸与输入图像一致。

sigmaX:高斯核在X方向上的标准差。

sigmaY:高斯核在Y方向上的标准差。默认为None,如果sigmaY=0,则它将被设置为与sigmaX相等的值。如果这两者都为0,则它们的值会从ksize中计算得到。计算公式为:

borderType:像素外推法,默认为None(参考官方文档 BorderTypes

)

在图像处理中,高斯滤波主要有两种方式:

1.窗口滑动卷积

2.傅里叶变换

在此主要利用窗口滑动卷积。其中二维高斯函数公式为:

根据上述公式,生成一个3x3的高斯核,其中最重要的参数就是标准差 ,标准差 越大,核中心的值与周围的值差距越小,曲线越平滑。标准差 越小,核中心的值与周围的值差距越大,曲线越陡峭。

从图像的角度来说,高斯核的标准差 越大,平滑效果越不明显。高斯核的标准差 越小,平滑效果越明显。

可见,标准差 越大,图像平滑程度越大

参考博客1:关于GaussianBlur函数

参考博客2:关于高斯核运算