提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本章介绍空间域滤波中的低通滤波,也就是图像的模糊处理,也称图像的平滑处理。
1. 图像的卷积计算


简而言之,就是在图像上移动核的中心,并且在每个位置计算乘积之和
公式如下:
g
(
x
,
y
)
=
∑
s
=
−
a
a
∑
t
=
−
b
b
w
(
x
,
y
)
f
(
x
+
s
,
y
+
y
)
,即:
g(x,y)=\sum_{s=-a}^a \sum_{t=-b}^bw(x,y)f(x+s,y+y),即:
g(x,y)=s=−a∑at=−b∑bw(x,y)f(x+s,y+y),即:
g
(
x
,
y
)
=
w
(
−
1
,
−
1
)
f
(
x
−
1
,
y
−
1
)
+
w
(
−
1
,
0
)
f
(
x
−
1
,
y
)
+
w
(
−
1
,
1
)
f
(
x
−
1
,
y
+
1
)
+
w
(
0
,
−
1
)
f
(
x
,
y
−
1
)
+
w
(
0
,
0
)
f
(
x
,
y
)
+
w
(
0
,
1
)
f
(
x
,
y
+
1
)
+
w
(
1
,
−
1
)
f
(
x
+
1
,
y
−
1
)
+
w
(
1
,
0
)
f
(
x
+
1
,
y
)
+
w
(
1
,
1
)
f
(
x
+
1
,
y
+
1
)
\begin{aligned} g(x,y)&=w(-1,-1)f(x-1,y-1)+w(-1,0)f(x-1,y)+w(-1,1)f(x-1,y+1) \\ &+w(0,-1)f(x,y-1)+w(0,0)f(x,y)+w(0,1)f(x,y+1) \\ &+w(1,-1)f(x+1,y-1)+w(1,0)f(x+1,y)+w(1,1)f(x+1,y+1) \end{aligned}
g(x,y)=w(−1,−1)f(x−1,y−1)+w(−1,0)f(x−1,y)+w(−1,1)f(x−1,y+1)+w(0,−1)f(x,y−1)+w(0,0)f(x,y)+w(0,1)f(x,y+1)+w(1,−1)f(x+1,y−1)+w(1,0)f(x+1,y)+w(1,1)f(x+1,y+1)
2. 图像的低通滤波器
平滑(低通)滤波器用于降低灰度的急剧过度。有随机噪声通常由灰度的急剧过度组成,因此平滑的一个明显应用就是降噪。
2.1 均值滤波

均值滤波的卷积核以 5*5 举例说明
2.2 中值滤波

如上图所示对5*5区域进行中值滤波过滤,该区域内的中值是5,因此中心位置的值变成了5
2.3 高斯滤波
图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值,下图的所示的 33 和 55 邻域的高斯滤波。


2.4 联合双边滤波
原理后续添加
3. 示例
3.1 示例代码
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 定义卷积核大小
k1, k2, k3 = 5, 9, 25
def meanBlur(img):
"""
根据不同的卷积核大小进行均值平滑处理,卷积核越大,去噪音效果越好,花费的运算时间越多,同时图像越失真
:param img: 原图像
:return:
"""
img1 = cv.blur(img, (k1, k1))
img2 = cv.blur(img, (k2, k2))
img3 = cv.blur(img, (k3, k3))
return [img, img1, img2, img3]
def medianBlur(img):
"""
根据不同的卷积核大小进行中值平滑处理, 卷积核越大,去噪音效果越好,花费的运算时间越多,同时图像越失真
:param img: 原图像
:return:
"""
img1 = cv.medianBlur(img, k1)
img2 = cv.medianBlur(img, k2)
img3 = cv.medianBlur(img, k3)
return [img, img1, img2, img3]
def gaussianBlur(img):
"""
根据不同的卷积核大小进行高斯滤波平滑处理,卷积核越大,去噪音效果越好,花费的运算时间越多,同时图像越失真
:param img: 原图像
:return:
"""
img1 = cv.GaussianBlur(img, (k1, k1), 10, 0)
img2 = cv.GaussianBlur(img, (k2, k2), 10, 0)
img3 = cv.GaussianBlur(img, (k3, k3), 10, 0)
return [img, img1, img2, img3]
def bilateralFilter(img):
"""
根据不同的卷积核大小进行双边滤波平滑处理,卷积核越大,去噪音效果越好,花费的运算时间越多,同时图像越失真
:param img: 原图像
:return:
"""
sigmaColor,sigmaSpace = 200, 200
img1 = cv.bilateralFilter(img, k1, sigmaColor, sigmaSpace)
img2 = cv.bilateralFilter(img, k2, sigmaColor, sigmaSpace)
img3 = cv.bilateralFilter(img, k3, sigmaColor, sigmaSpace)
return [img, img1, img2, img3]
if "__main__" == __name__:
img = cv.imread('Image/Fig0501.tif')
imgMeans = meanBlur(img)
imgMedians = medianBlur(img)
imgGaussians = gaussianBlur(img)
imgBils = bilateralFilter(img)
imageList = imgMeans + imgMedians + imgGaussians + imgBils
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.size'] = 18
plt.figure(figsize=(20, 20))
titleList = ["原图像", "均值{0}*{0}".format(k1), "均值{0}*{0}".format(k2), "均值{0}*{0}".format(k3), "原图像", "中值{0}*{0}".format(k1), "中值{0}*{0}".format(k2), "中值{0}*{0}".format(k3), "原图像",
"高斯{0}*{0}".format(k1), "高斯{0}*{0}".format(k2), "高斯{0}*{0}".format(k3), "原图像", "双边{0}*{0}".format(k1), "双边{0}*{0}".format(k2), "双边{0}*{0}".format(k3)]
for i in range(16):
plt.subplot(4, 4, i + 1), plt.title(titleList[i]), plt.axis('off')
plt.imshow(imageList[i], vmin=0, vmax=255, cmap='gray')
plt.tight_layout()
plt.savefig("Image/tmp1.png")
plt.show()
3.2 示例效果


从上图可以看出不同的卷积核大小,对图像的平滑效果影响很大(双边滤波影响效果较小),大家可以自己调试参数。
1万+



被折叠的 条评论
为什么被折叠?



