高斯函数与高斯滤波

一维高斯函数我们都熟悉,形式如下:

G(x)=12π−−√σexp(−x22σ2)
G(x)=12πσexp⁡(−x22σ2)

计算机视觉中,高斯滤波使用的高斯核为xx和yy两个一维高斯的乘积,两个维度上的标准差σσ通常相同,形式如下:

G(x,y)=12πσ2exp(−x2+y22σ2)
G(x,y)=12πσ2exp⁡(−x2+y22σ2)

高斯滤波(平滑),即用某一尺寸的二维高斯核与图像进行卷积。高斯核是对连续高斯函数的离散近似,通常对高斯曲面进行离散采样和归一化得出,这里,归一化指的是卷积核所有元素之和为1,下图为标准高斯和σ=1.4σ=1.4大小为5×55×5的高斯核。

高斯核

标准差
当μ=0μ=0时,唯一需要控制的参数就是标准差σσ,多少合适呢?σσ的确定十分依赖于问题背景,需要具体问题具体分析。但理解σσ的作用,可以指导调整的方向。

高斯核可以看成是与中心距离负相关的权重。平滑时,调整σσ实际是在调整周围像素对当前像素的影响程度,调大σσ即提高了远处像素对中心像素的影响程度,滤波结果也就越平滑。高斯曲线随σσ变化的曲线如下:
标准高斯函数

从频域角度看,高斯函数的傅立叶变换仍是高斯,两者标准差间的关系如下:

σx=12πσw
σx=12πσw

其中,σxσx为空域高斯的标准差,σwσw为对应频域高斯的标准差,在空域进行高斯平滑相当于频域低通滤波,σxσx越大,σwσw越小,频域高斯越集中,高频成分削弱得越多,图像越平滑。

从低通滤波角度考虑,可以对图像做傅立叶变换进行频谱分析,叠加上频域高斯并调整查看效果,找到适合的σwσw,再推算出空域高斯所需的σxσx。

窗口大小
标准差σσ确定后,接下来需要确定窗口大小。上面讲了高斯核是对连续高斯的离散近似,窗口越大自然近似越好,但高斯函数是钟形曲线,距离中心越远数值越小,足够远处可以忽略不计,但多远算远呢?

钟型曲线在区间(μ−σ,μ+σ)(μ−σ,μ+σ)范围内的面积占曲线下总面积的68%68%,(μ−2σ,μ+2σ)(μ−2σ,μ+2σ)范围占95%95%,(μ−3σ,μ+3σ)(μ−3σ,μ+3σ)范围占99.7%99.7%,一般3σ3σ外的数值已接近于0,可忽略,半径为3σ3σ即窗口大小为6σ×6σ6σ×6σ即可,通常取最近的奇数。上述3个范围在一维和二维高斯中示意如下:

Gaussian n sigma 范围

OpenCV中标准差与窗口大小的换算
在OpenCV函数createGaussianFilter中,若未指定窗口大小,通过σσ推算窗口大小方式如下,半径为σσ的3或4倍:

Gaussian kernel size

若指定了窗口大小,但未指定σσ大小,则通过窗口大小推算σσ的方式如下:

σ=0.3×((ksize−1)×0.5−1)+0.8
σ=0.3×((ksize−1)×0.5−1)+0.8

具体地,在函数getGaussianKernel中,当ksize不大于7时,直接从内部的smallgaussiantabsmallgaussiantab取对应大小的高斯核,若大于7,则使用上式计算出σσ然后套用高斯公式,最后再归一化。

getGaussianKernel

在实际使用时,为了高效,卷积核通常取[0,255][0,255]范围内的整数(1个Byte),因此高斯核中心最大取值为255时,窗口尺寸的选取只需让高斯核边界值刚好大于0即可。令高斯核尺寸为nn,半径为rr,r=n−12r=n−12,高斯核xx轴上边界(r,0)(r,0)处与中心(0,0)(0,0)处数值之比如下:

G(r,0)G(0,0)=exp(−r22×(0.3(r−1)+0.8)2)
G(r,0)G(0,0)=exp⁡(−r22×(0.3(r−1)+0.8)2)

当rr足够大,其极限为exp(−12×0.32)=0.00386592exp⁡(−12×0.32)=0.00386592,若中心值为255,则边界值为255∗0.00386592=0.9858096≈1255∗0.00386592=0.9858096≈1,是合适的。但公式是如何设计出来的还不清楚,这里只是校验了其性质,sigh。
1. spring boot gradle项目为了使用此功能,加入如下依赖后,

 
compile group: 'org.apache.hadoop', name: 'hadoop-core', version: '1.2.1'
 
compile group: 'org.apache.hadoop', name: 'hadoop-hdfs', version: '2.7.2'
 
compile group: 'org.elasticsearch', name: 'elasticsearch-hadoop', version: '6.2.4'
发现spring boot启动报错A child container failed during start

查看gradle dependency

其中hadoop-core:1.2.1

 
+--- org.apache.hadoop:hadoop-core:1.2.1
 
| +--- commons-cli:commons-cli:1.2
 
| +--- xmlenc:xmlenc:0.52
 
| +--- com.sun.jersey:jersey-core:1.8 -> 1.9
 
| +--- com.sun.jersey:jersey-json:1.8
 
| | +--- org.codehaus.jettison:jettison:1.1
 
| | | \--- stax:stax-api:1.0.1
 
| | +--- com.sun.xml.bind:jaxb-www.fengshen157.com/ impl:2.2.3-1
 
| | | \--- javax.xml.bind:jaxb-api:2.2.2 -> 2.3.0
 
| | +--- org.codehaus.jackson:jackson-core-asl:1.7.1 -> 1.9.13
 
| | +--- org.codehaus.jackson:jackson-mapper-asl:1.7.1 -> 1.9.13
 
| | | \--- org.codehaus.jackson:jackson-core-asl:1.9.13
 
| | +--- org.codehaus.jackson:jackson-www.yongshiyule178.com jaxrs:1.7.1
 
| | | +--- org.codehaus.jackson:jackson-core-asl:1.7.1 -> 1.9.13

参考
getGaussianKernel
Calculate the Gaussian filter's sigma using the kernel's size
Gaussian blur
Gaussian Blur - Standard Deviation, Radius and Kernel Size
How to determine the window size of a Gaussian filter
Optimal Gaussian filter radius
Fast Almost-Gaussian Filtering

猜你喜欢

转载自blog.csdn.net/li123128/article/details/82763938