高斯滤波原理及python实现

qlmx
qlmx
qlmx
54
文章
2
评论
2020年2月22日23:54:19 评论 6,537阅读8分10秒

高斯滤波器时一种线性平滑滤波器,主要适用处理高斯噪声,所以在了解高斯滤波之前,我们首先熟悉一下高斯噪声。噪声在图像中表现的通常是引起视觉效果的孤立像素点和像素块,简单说噪声点就是会给图像带来干扰,让图像变的不清楚。而高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。

高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。由于图像都是二维的,所以在图像处理中我们需要的是二维高斯函数。高斯函数的一维形式是:
$$
f(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}
$$
其中μ是x的均值,δ是x的方差。当中心点为原点时,u为0,此时的公式如下:
$$
f(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{x^2}{2\sigma{^2}}}
$$
根据一维高斯函数,可以推导出二维高斯函数(中心为原点):
$$
f(x)=\frac{1}{2\pi\sigma{^2}}e^{-\frac{x^2+y^2}{2\sigma{^2}}}
$$
通过上述两个维度的高斯滤波器函数可以得到下图的函数图像。其中$\delta$的大小决定了高斯函数的宽度, σ越大函数图像跨幅越宽,反之则越窄。

高斯滤波原理及python实现

在图像处理中,高斯滤波一般有两种实现方式,一是用离散化窗口滑窗卷积,另一种通过傅里叶变换。最常见的就是第一种滑窗实现,只有当离散化的窗口非常大,用滑窗计算量非常大(即使用可分离滤波器的实现)的情况下,可能会考虑基于傅里叶变化的实现方法。

高斯滤波也是一个非常典型的图像卷积例子,本质上,高斯滤波就是将(灰度)图像 和一个高斯核进行卷积操作,具体的方式和上面的两个滤波方法相似,只是卷积核存在差别。理论上,高斯分布在所有定义域上都有非负值,这就需要一个无限大的卷积核。在实际的计算过程中,卷积核是固定大小的,只需要将待计算的“中心点”作为原点,将周围的点按照正态分布函数分配权重,计算加权平均值,得到最终的值,这个过程就是二维高斯核的卷积过程。

具体过程如下图所示,假定中心点坐标为(0,0),当设定卷积核为3时,只需计算距离它最近的8个点,如图中的第一个矩阵所示。以此矩阵中的坐标,带入到公式2-14中,并且取σ=1.5,则半径为1的权重矩阵如图中第二个矩阵所示。因为需要利用该权重矩阵做加权平均,故需要对原始的矩阵做归一化。具体操作方式是求出第二个矩阵的总和为0.4783,然后再将该矩阵的9个值分别除以0.4783,得到最终的卷积核(权重矩阵)。

高斯滤波原理及python实现

通过上述步骤计算出高斯核,基于该高斯核便可进行高斯滤波操作。假设现有9个像素点,灰度值(0-255)如下图中第一个卷积核所示,计算图中中心点的滤波后的值。每个像素点乘以相对应的权重值,得到最终的分布值。将这9个像素的值相加得到的结果,就是中心位置图像滤波后的值。对所有点重复这个过程,就得到了高斯滤波后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯滤波。

高斯滤波原理及python实现

讲解完卷积核的过程,通过代码具体的实现高斯滤波。由于高斯滤波主要针对高斯噪声表现的比较好,所有gasuss_noise在原始图片中添加随机噪声,其中的参数mean和var对应二维高斯核函数的 和 。调用了opencv的GaussianBlur函数,针对下面代码中的(3,3)是高斯矩阵的长和宽,0是高斯核的标准差是0,具体代码如下:

def gasuss_noise(img, mean=0, var=0.005):
  '''
    添加高斯噪声
    mean : 均值
    var : 方差
  '''
  image = img.copy()
  image = np.array(image/255, dtype=float)
  noise = np.random.normal(mean, var ** 0.5, image.shape)
  out = image + noise
  if out.min() < 0:
    low_clip = -1.
  else:
    low_clip = 0.
  out = np.clip(out, low_clip, 1.0)
  out = np.uint8(out*255)
  return out

#读取图片
gasuss_noise_img = gasuss_noise(img)    

#均值滤波
gasuss_filter_img = cv2.GaussianBlur(img, (3, 3), 1.1)
gasuss_filter_img1 = cv2.GaussianBlur(gasuss_noise_img, (3, 3), 1.1)
gasuss_filter_img2 = cv2.GaussianBlur(gasuss_noise_img, (9, 9), 1.1)

## 显示
plt.figure(figsize=(15, 10))
plt.subplot(2, 2, 1), plt.imshow(img)
plt.axis('off'); plt.title('原图')
plt.subplot(2, 2, 2), plt.imshow(gasuss_noise_img)
plt.axis('off'); plt.title('添加随机高斯噪声')
plt.subplot(2, 2, 3), plt.imshow(gasuss_filter_img1)
plt.axis('off'); plt.title('高斯核为3')
plt.subplot(2, 2, 4), plt.imshow(gasuss_filter_img2)
plt.axis('off'); plt.title('高斯核为9')
plt.show()

运行代码得到,通过matplotlib函数可以得到下图所示的图像。从结果图中可以看出卷积核越大,高斯噪声过滤的效果越好,但是最终的结果图也就越模糊,清晰度越差。具体过滤需要结果过滤效果和图像清晰度综合选取滤波卷积核尺寸半径。

高斯滤波原理及python实现

继续阅读
  • 我的微信小程序
  • 这是我的微信小程序扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
qlmx
  • 本文由 发表于 2020年2月22日23:54:19
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
python磨皮祛斑了解一下 计算机视觉

python磨皮祛斑了解一下

前言 在深度学习的加持下,计算机视觉进入了快车道,在使用深度的同时,自己可做的东西就比较局限,为了更深入的学习计算机视觉,对传统数字图像处理做了一下回顾。本文分享的就是基于传统的数字图像滤波技术:高斯...
双边滤波原理及python实现 计算机视觉

双边滤波原理及python实现

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。...
opencv-python写入视频无法打开 技术杂谈

opencv-python写入视频无法打开

1. 问题 今天测试opencv文件的视频抓取和保存功能,测试代码如下,运行时视频可以正常播放,但是保存的output.mp4文件打不开(mac os),换了多个播放器都不行,仔细看才发现文件之后不到...
详细图像数据集增强原理的python代码 计算机视觉

详细图像数据集增强原理的python代码

导读 在深度学习时代,数据的规模越大、质量越高,模型就能够拥有更好的泛化能力,数据直接决定了模型学习的上限。然而在实际工程中,采集的数据很难覆盖全部的场景,比如图像的光照条件,同一场景拍摄的图片可能由...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: