1.图像模糊

图像模糊是图像处理中最简单和常用的操作之一。

⚠️使用该操作的原因之一是为了给图像预处理时降低噪声。

图像模糊操作背后是数学的卷积计算。

卷积操作的原理:

常用的图像模糊的方法:

均值模糊高斯模糊中值模糊双边模糊

这四种模糊方式有时也被称为:均值滤波、高斯滤波、中值滤波和双边滤波。因为模糊属于一种滤波操作,具体关系可参照下图:

其中,均值滤波、高斯滤波和中值滤波属于线性滤波;而双边滤波属于非线性滤波。

接下来我们结合OpenCV中的相关API来进一步了解这些图像模糊的方法。

2.均值模糊

均值模糊的卷积核为:

k

e

r

n

e

l

=

1

k

e

r

n

e

l

w

i

d

t

h

×

k

e

r

n

e

l

h

e

i

g

h

t

[

1

1

1

1

]

kernel=\frac{1}{kernel_{width}\times kernel_{height}} \begin{bmatrix} 1 & \cdots & 1 \\ \vdots & \ddots & \vdots \\ 1 & \cdots & 1 \\ \end{bmatrix}

kernel=kernelwidth​×kernelheight​1​

​1⋮1​⋯⋱⋯​1⋮1​

卷积核亦称掩膜。

OpenCV中的API:

void blur(

InputArray src,

OutputArray dst,

Size ksize,

Point anchor=Point(-1,-1),

int borderType = BORDER_DEFAULT

);

部分参数解释:

参数Size ksize表示卷积核的大小。Size(3,3)表示

3

×

3

3\times 3

3×3的核大小;Size(5,5)表示

5

×

5

5\times 5

5×5的核大小。边长必须是正奇数。参数Point anchor表示锚点(anchor)的位置,即被平滑的那个点。默认值Point(-1,-1)表示锚点位于核的中心。

现在我们看下原图进行均值模糊之后的结果(左侧为原图,右侧为均值模糊后的图):

blur(src,src_blur,Size(5,5),Point(-1,-1));

3.高斯模糊

3.1.高斯模糊的原理

高斯模糊所用的卷积核就是基于二维高斯分布生成的。

二维高斯分布见本文第6部分。

在高斯模糊中,二维高斯分布公式中的

x

1

,

x

2

x_1,x_2

x1​,x2​对应一个点的x,y坐标。因此可以假设

x

1

,

x

2

x_1,x_2

x1​,x2​是相互独立的,所以:

C

o

v

(

x

1

,

x

2

)

=

C

o

v

(

x

2

,

x

1

)

=

E

(

x

1

x

2

)

E

(

x

1

)

E

(

x

2

)

=

E

(

x

1

)

E

(

x

2

)

E

(

x

1

)

E

(

x

2

)

=

0

Cov(x_1,x_2)=Cov(x_2,x_1)=E(x_1x_2)-E(x_1)E(x_2)=E(x_1)E(x_2)-E(x_1)E(x_2)=0

Cov(x1​,x2​)=Cov(x2​,x1​)=E(x1​x2​)−E(x1​)E(x2​)=E(x1​)E(x2​)−E(x1​)E(x2​)=0

并且:

C

o

v

(

x

1

,

x

1

)

=

E

(

x

1

2

)

E

2

(

x

1

)

=

σ

1

2

Cov(x_1,x_1)=E(x_1^2)-E^2(x_1)=\sigma_1^2

Cov(x1​,x1​)=E(x12​)−E2(x1​)=σ12​

同理:

C

o

v

(

x

2

,

x

2

)

=

σ

2

2

Cov(x_2,x_2)=\sigma_2^2

Cov(x2​,x2​)=σ22​

代入协方差矩阵

\sum

∑:

=

[

C

o

v

(

x

1

,

x

1

)

C

o

v

(

x

1

,

x

2

)

C

o

v

(

x

2

,

x

1

)

C

o

v

(

x

2

,

x

2

)

]

=

[

σ

1

2

0

0

σ

2

2

]

\sum=\begin{bmatrix} Cov(x_1,x_1) & Cov(x_1,x_2) \\ Cov(x_2,x_1) & Cov(x_2,x_2) \\ \end{bmatrix}=\begin{bmatrix} \sigma_1^2 & 0 \\ 0 & \sigma_2^2 \end{bmatrix}

∑=[Cov(x1​,x1​)Cov(x2​,x1​)​Cov(x1​,x2​)Cov(x2​,x2​)​]=[σ12​0​0σ22​​]

求其行列式:

=

σ

1

2

σ

2

2

\mid \sum \mid=\sigma_1^2 \sigma_2^2

∣∑∣=σ12​σ22​

则二维高斯分布公式可简化为:

f

(

x

ˉ

)

=

1

(

2

π

)

(

σ

1

2

σ

2

2

)

1

/

2

e

1

2

[

(

x

1

μ

1

σ

1

)

2

+

(

x

2

μ

2

σ

2

)

2

]

f(\bar x)=\frac{1}{(2\pi)(\sigma_1^2 \sigma_2^2)^{1/2} } e^{-\frac{1}{2}[(\frac{x_1-\mu_1}{\sigma_1})^2 + (\frac{x_2-\mu_2}{\sigma_2})^2]}

f(xˉ)=(2π)(σ12​σ22​)1/21​e−21​[(σ1​x1​−μ1​​)2+(σ2​x2​−μ2​​)2]

假设我们要生成一个

3

×

3

3\times 3

3×3的高斯掩膜,锚点的坐标设置为(0,0),则周边点的坐标为:

(

x

1

,

x

2

)

(x_1,x_2)

(x1​,x2​)对应的值代入上述公式中即可求得高斯掩膜。

为了方便,我们这里假设

μ

1

=

μ

2

=

0

,

σ

1

=

σ

2

=

1

\mu_1=\mu_2=0,\sigma_1=\sigma_2=1

μ1​=μ2​=0,σ1​=σ2​=1,又因为系数

1

2

π

\frac{1}{2\pi}

2π1​为常数,因此可以省略,将二维高斯分布公式简化为:

e

1

2

(

x

1

2

+

x

2

2

)

e^{-\frac{1}{2}(x_1^2+x_2^2)}

e−21​(x12​+x22​)

据此可得到:

这9个点的权重总和不等于1,所以需要对其进行归一化处理:每个格子的数除以所有格子的数加起来的总和。这样即可得到一个

3

×

3

3\times 3

3×3的高斯掩膜:

3.2.高斯模糊的API

void GaussianBlur(

InputArray src,

OutputArray dst,

Size ksize,

double sigmaX,

double sigmaY = 0,

int borderType = BORDER_DEFAULT

);

其中,参数Size ksize表示卷积核的大小。sigmaX(高斯核在x方向的标准差)和sigmaY(高斯核在y方向的标准差)对应二维高斯分布公式中的

σ

1

,

σ

2

\sigma_1,\sigma_2

σ1​,σ2​。

如果

σ

\sigma

σ较小(其二维高斯分布概率密度函数图像见下图右),那么生成的掩膜的中心系数较大,而周围的系数较小,这样对图像的模糊效果就不是很明显;反之,

σ

\sigma

σ较大(其二维高斯分布概率密度函数图像见下图左),则生成的模版的各个系数相差就不是很大,比较类似均值模糊,对图像的模糊效果比较明显。

实际应用看下对比效果(左侧为原图,右侧为高斯模糊后的图):

GaussianBlur(src,src_gaussian_blur,Size(5,5),3,3);

4.中值模糊

中值模糊即用中位数填补中心像素。

中值滤波的扩展:最小值滤波、最大值滤波。

中值模糊对椒盐噪声有很好的抑制作用。

椒盐噪声:也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,也可能是亮的区域有黑色像素或是在暗的区域有白色像素(或者两者皆有)。

中值模糊的API:

void medianBlur(

InputArray src,

OutputArray dst,

int ksize

);

参数int ksize表示核的大小,必须大于1而且必须是奇数。

结果对比见下(左侧为加了椒盐噪声的原图,右侧为中值模糊后的图):

medianBlur(src_salt,src_median_blur,3);

5.双边模糊

均值模糊无法克服边缘像素信息丢失缺陷,原因是均值滤波是基于平均权重。

高斯模糊部分克服了该缺陷,但是无法避免,因为没有考虑像素值的不同。

高斯双边模糊是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变(边缘指的是物体的边缘、轮廓)。

5.1.双边模糊的原理

⚠️双边滤波器综合了高斯滤波器和

α

\alpha

α截尾均值滤波器的特点。高斯滤波器只考虑像素间的欧式距离,其使用的模版系数随着和窗口中心的距离增大而减小;

α

\alpha

α截尾均值滤波器则只考虑了像素灰度值之间的差值,去掉

α

\alpha

α%的最小值和最大值后再计算均值。

‼️双边滤波器就等于空间距离与灰度距离的乘积。其使用二维高斯函数生成距离模版,使用一维高斯函数生成值域模版(以下公式都省去了前面的系数)。

👉距离模版系数的生成公式如下:

d

(

i

,

j

,

k

,

l

)

=

e

x

p

(

(

i

k

)

2

+

(

j

l

)

2

2

σ

d

2

)

d(i,j,k,l)=exp(-\frac{(i-k)^2+(j-l)^2}{2\sigma_d^2})

d(i,j,k,l)=exp(−2σd2​(i−k)2+(j−l)2​)

这个公式和3.1部分中的公式其实是一样的。只不过省去了系数,并且假定

σ

1

=

σ

2

=

σ

d

\sigma_1=\sigma_2=\sigma_d

σ1​=σ2​=σd​。

(

k

,

l

)

(k,l)

(k,l)为模版窗口的中心坐标,通常为(0,0),也就是

(

μ

1

,

μ

2

)

(\mu_1,\mu_2)

(μ1​,μ2​)。

(

i

,

j

)

(i,j)

(i,j)为模版窗口的其他系数的坐标,即

(

x

1

,

x

2

)

(x_1,x_2)

(x1​,x2​)。

👉值域模版系数的生成公式如下:

r

(

i

,

j

,

k

,

l

)

=

e

x

p

(

f

(

i

,

j

)

f

(

k

,

l

)

2

2

σ

r

2

)

r(i,j,k,l)=exp(-\frac{\parallel f(i,j)-f(k,l) \parallel ^2}{2\sigma_r^2})

r(i,j,k,l)=exp(−2σr2​∥f(i,j)−f(k,l)∥2​)

其中,

f

(

x

,

y

)

f(x,y)

f(x,y)表示图像在点

(

x

,

y

)

(x,y)

(x,y)处的像素值;

(

k

,

l

)

(k,l)

(k,l)为模版窗口的中心坐标;

(

i

,

j

)

(i,j)

(i,j)为模版窗口的其他系数的坐标;

σ

r

2

\sigma_r^2

σr2​为高斯函数的方差。

将上述两个模版相乘就得到了双边滤波器的模版:

w

(

i

,

j

,

k

,

l

)

=

d

(

i

,

j

,

k

,

l

)

r

(

i

,

j

,

k

,

l

)

=

e

x

p

(

(

i

k

)

2

+

(

j

l

)

2

2

σ

d

2

f

(

i

,

j

)

f

(

k

,

l

)

2

2

σ

r

2

)

w(i,j,k,l)=d(i,j,k,l)*r(i,j,k,l)=exp(-\frac{(i-k)^2+(j-l)^2}{2\sigma_d^2} -\frac{\parallel f(i,j)-f(k,l) \parallel ^2}{2\sigma_r^2})

w(i,j,k,l)=d(i,j,k,l)∗r(i,j,k,l)=exp(−2σd2​(i−k)2+(j−l)2​−2σr2​∥f(i,j)−f(k,l)∥2​)

双边滤波也可以用下图表示,对P点进行模糊,Q点的距离虽然很近,但是像素值差距过大,所以Q点的权重很小,不会过多的考虑到Q点的信息,所以说双边滤波考虑到了边缘信息,避免了边缘信息的丢失。

5.2.双边模糊的API

void bilateralFilter(

InputArray src,

OutputArray dst,

int d,

double sigmaColor,

double sigmaSpace,

int borderType=BORDER_DEFAULT

);

部分参数解释:

int d是计算直径,范围内的像素都会被纳入计算。如果这个值我们设其为非正数,那么OpenCV会从第五个参数sigmaSpace来计算出它来。double sigmaColor即为公式中的

σ

r

\sigma_r

σr​。这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起。double sigmaSpace即为公式中的

σ

d

\sigma_d

σd​。数值越大,意味着越远的像素会相互影响。

其效果见下(左侧为原图,右侧为双边模糊后的图):

bilateralFilter(src,src_bilateral,3,100,3);

6.高斯分布

高斯分布(Gaussian distribution)又名正态分布。

👉一维高斯分布的概率密度函数为:

f

(

x

)

=

1

2

π

σ

e

(

x

μ

)

2

2

σ

2

f(x)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma ^2}}

f(x)=2π

​σ1​e−2σ2(x−μ)2​

👉高维高斯分布的概率密度函数为:

f

(

x

ˉ

)

=

1

(

2

π

)

D

/

2

1

1

/

2

e

1

2

(

x

ˉ

μ

ˉ

)

T

1

(

x

ˉ

μ

ˉ

)

f(\bar x)=\frac{1}{(2\pi)^{D/2}} \frac{1}{\mid \sum \mid ^{1/2}} e^{ -\frac{1}{2} (\bar x-\bar \mu)^T \sum^{-1} (\bar x-\bar \mu) }

f(xˉ)=(2π)D/21​∣∑∣1/21​e−21​(xˉ−μˉ​)T∑−1(xˉ−μˉ​)

其中,

x

ˉ

\bar x

xˉ表示维度为D的向量,

μ

ˉ

\bar \mu

μˉ​则是这些向量的平均值,

\sum

∑表示所有向量

x

ˉ

\bar x

xˉ的协方差矩阵,

\mid \sum \mid

∣∑∣表示协方差矩阵的行列式。

因此根据高维高斯分布的公式,我们可以得到二维高斯分布的概率密度函数为:

f

(

x

ˉ

)

=

1

(

2

π

)

1

/

2

e

1

2

[

(

x

1

μ

1

σ

1

)

2

+

(

x

2

μ

2

σ

2

)

2

]

f(\bar x)=\frac{1}{(2\pi)\mid \sum \mid ^{1/2}} e^{-\frac{1}{2}[(\frac{x_1-\mu_1}{\sigma_1})^2 + (\frac{x_2-\mu_2}{\sigma_2})^2]}

f(xˉ)=(2π)∣∑∣1/21​e−21​[(σ1​x1​−μ1​​)2+(σ2​x2​−μ2​​)2]

二维高斯分布的图像为:

7.代码地址

图像模糊

8.参考资料

Convolutional Neural Networks - Basics

想要获取最新文章推送或者私聊谈人生,请关注我的个人微信公众号:⬇️x-jeff的AI工坊⬇️

个人博客网站:https://shichaoxin.com

GitHub:https://github.com/x-jeff