1.图像噪声
在图像采集、处理、传输等过程不可避免地会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有:高斯噪声、椒盐噪声等。
1.1 椒盐噪声
椒盐噪声,即脉冲噪声,是图像中经常见到的一种噪声。它是一种随机出现的白点或黑点,即可能是亮的区域有黑色像素或者可能是暗的区域有白色像素(或者二者都有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如:失效的感应器导致像素值位最小值,饱和的感应器导致像素值为最大值。
1.2 高斯噪声
高斯噪声,即正态噪声,是指噪声密度函数服从高斯分布的一类噪声。由于高斯噪声在空间和频域中数学上的易处理性,这种噪声模型经常被用于实践中。高斯随机变量Z的概率密度函数由下式给出:
p
(
z
)
=
1
2
π
σ
e
−
(
z
−
u
)
2
2
σ
2
p(z) = \frac{1}{\sqrt{2\pi \sigma}} e^{\frac{-(z-u)^2}{2\sigma^2}}
p(z)=2πσ1e2σ2−(z−u)2
其中,
z
z
z表示灰度值,
u
u
u表示
z
z
z的平均值或期望值,
σ
\sigma
σ表示
z
z
z的标准差。标准差的平方
σ
2
\sigma^2
σ2称为
z
z
z的方差。高斯函数的曲线如图所示:
2 图像平滑简介
图像平滑,从信号处理的角度来言:去除其中的高频信息,保留低频信息。因此,可以对图像进行低通滤波。低通滤波可以去除图像中的噪声,对图像进行平滑。
根据滤波器的不同可以分为:均值滤波、高斯滤波、中值滤波、双边滤波。
2.1 均值滤波
采用均值滤波模板对图像噪声进行滤除。令
S
x
y
S_{xy}
Sxy表示中心在
(
x
,
y
)
(x,y)
(x,y)点,尺寸为
m
×
n
m×n
m×n的矩形子图像窗口的坐标组。均值滤波器可表示为:
f
^
(
x
,
y
)
=
1
m
n
∑
(
s
,
t
)
∈
S
x
y
g
(
s
,
t
)
\widehat{f}(x,y) = \frac{1}{mn} \sum_{(s,t ) \in S_{xy}}g(s,t)
f
(x,y)=mn1(s,t)∈Sxy∑g(s,t)
由一个归一化卷积框完成的。它只是用卷积框覆盖区域所有像素的平均值来代替中心元素。
均值滤波的优点是算法简单,计算速度较快;缺点是去噪的同时去除了很多细节部位,将图像变得模糊。
API接口:cv2.blur(src, ksize, anchor, borderType)
参数:
- src:输入图像
- ksize:卷积核大小
- anchor:默认值(-1,-1),表示核中心
- bordertype:边界类型
- BORDER_DEFAULT - (边界默认)openCV中默认的处理方法,自动填充图像边界(效果像是映像一样)
- BORDER_CONSTANT – (边界常数)填充边缘用指定像素值,使用常数填充边界。
- BORDER_REPLICATE – (边界复制)填充边缘像素用已知的边缘像素值,复制原图中最临近的行或者列。
- BORDER_WRAP – (边界包装)用另外一边的像素来补偿填充。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 1 图像读取
img = cv.imread('./image/dogsp.jpeg')
# 2 均值滤波
blur = cv.blur(img,(5,5))
# 3 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('均值滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()
2.2 高斯滤波
二维高斯是构建高斯滤波器的基础,其概率分布函数如下所示:
G
(
x
,
y
)
=
1
2
π
σ
2
e
x
p
{
−
x
2
+
y
2
2
σ
2
}
G(x,y) = \frac{1}{2 \pi \sigma^2}exp \{ - \frac{ x^2 + y^2 }{ 2 \sigma^2} \}
G(x,y)=2πσ21exp{−2σ2x2+y2}
G
(
x
,
y
)
G(x, y)
G(x,y)的分布为一个突起帽子的形状。
σ
\sigma
σ可看作为两个值,一个是
x
x
x方向的标准差
σ
x
\sigma_x
σx,另一个方向的标准差
σ
y
\sigma_y
σy
当 σ x \sigma_x σx和 σ y \sigma_y σy取值越大,整个形状趋于扁平;当 σ x \sigma_x σx和 σ y \sigma_y σy取值越小,整个形状越突起。
正态分布是一种钟形曲线,越接近中心,取值越大;越远离中心,取值越小。计算平滑结果时,只需将中心点作为原点,其他店按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。
高斯平滑在从图像中去除高斯噪声方面非常有效。
高斯平滑的流程:
- 首先确定权重矩阵,假定中心点坐标为
(
0
,
0
)
(0, 0)
(0,0),那么距离它最近的8个点坐标如下:
- 为计算权重矩阵,需要设定
σ
\sigma
σ的值,假定
σ
=
1.5
\sigma = 1.5
σ=1.5,则模糊半径为1的权重矩阵如下:
- 在计算这9个点的加权平均时,还须让他们的权重值之和为1,因此,将这9个点分别除以其目前九个值之和,得到最终的权重矩阵:
- 计算高斯模糊。得到权重矩阵后,进而计算高斯模糊的值。假设现有9个像素点,灰度值(0-255)如下:
每个点乘以对应的权重值:
将这9个值加起来,就是中心点的高斯模糊值。
对所有点重复这个过程,就可以得到高斯模糊后的图像;原图为彩色图像时,可以对RGB三个通道分别做高斯平滑。
API接口cv2.GaussianBlur(src,ksize,sigmaX,sigmay,borderType)
参数:
- src:输入图像
- ksize:高斯卷积核大小。注:卷积核的宽度核高度都应为奇数且可以不同
- sigmaX:水平方向的标准差
- sigmaY:垂直方向的标准差,默认为0,表示与sigmaX相同
- bordertype:填充边界类型
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 1 图像读取
img = cv.imread('./image/dogGasuss.jpeg')
# 2 高斯滤波
blur = cv.GaussianBlur(img,(3,3),1)
# 3 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('高斯滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()
2.3 中值滤波
中值滤波是一种典型的非线性滤波技术,基本思想是用像素点领域灰度值的中值来代替该像素点的灰度值。
中值滤波对椒盐噪声尤其有用,因为它并不依赖于领域内那些与典型值差别很大的值。
API:cv.medianBlur(src, ksize )
参数:
- src:输入图像
- ksize:卷积核大小
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 1 图像读取
img = cv.imread('./image/dogsp.jpeg')
# 2 中值滤波
blur = cv.medianBlur(img,5)
# 3 图像展示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('中值滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()