以下内容原创首发,如需转载请注明来源!
实验题目:
选取5个尺度,36个方向共180个二维模板对一幅图像分别做二维卷积,得到180幅滤波结果图像,以此作为基准Gabor滤波结果。由于这个基准算法处理速度很慢,故请试着对该方法进行改进,改进方法在要求得到同样180个卷积的结果图像的前提下,尽量提高其处理速度。
实验算法:
基本算法:
在图像处理中主要应用的是对gabor滤波的实部公式,其表达式如下:
g
(
x
,
y
;
λ
,
θ
,
ψ
,
σ
,
γ
)
=
e
x
p
(
?
x
′
2
+
γ
2
y
′
2
2
σ
2
)
c
o
s
(
2
π
x
′
λ
+
ψ
)
(
1
)
g(x,y;\lambda,\theta,\psi,\sigma,\gamma) = exp(-\frac{x^{\prime2}+\gamma^2y^{\prime2}}{2\sigma^2})cos(2\pi\frac{x^\prime}{\lambda}+\psi) (1)
g(x,y;λ,θ,ψ,σ,γ)=exp(?2σ2x′2+γ2y′2?)cos(2πλx′?+ψ)(1) 其中
x
′
=
x
c
o
s
θ
+
y
s
i
n
θ
;
y
′
=
?
x
s
i
n
θ
+
y
c
o
s
θ
x^{\prime}=xcos{\theta}+ysin{\theta};y^\prime=-xsin{\theta}+ycos{\theta}
x′=xcosθ+ysinθ;y′=?xsinθ+ycosθ 上述公式的常规代码实现为二重循环,对于每一项计算的时间复杂度均为
O
(
n
2
)
O(n^2)
O(n2),当其kernel取值较大时,计算效率较低。本实验主要通过对公式的正交与非正交两种方法进行分解,使其复杂乘方的计算时间复杂度仅为O(2n),仅需执行
O
(
n
2
)
O(n^2)
O(n2)次的乘法与加法运算即可。
具体步骤:
(1)式的计算复杂度主要体现在幂方运算上,且
x
′
与
y
′
x^\prime与y^\prime
x′与y′分别与x,y都相关,所以无法直接分解计算,即对
x
′
与
y
′
x^\prime与y^\prime
x′与y′的计算必须使用二重循环,这样无疑提升了时间复杂度。因此,如果能够实现对(1)式的分解,使用数组存储x与y的n次计算结果,再在最后进行赋值就可以降低时间复杂度;下文提供正交与非正交两种方法进行分解。 正交分解:
观
察
(
1
)
式
,
当
γ
=
1
时
,
x
′
2
+
γ
2
y
′
2
=
x
2
+
y
2
观察(1)式,当\gamma=1时,x^{\prime2}+\gamma^2y^{\prime2}=x^2+y^2
观察(1)式,当γ=1时,x′2+γ2y′2=x2+y2,此时即可以对(1)式进行正交分解:
g
(
x
,
y
;
λ
,
θ
,
ψ
,
σ
,
γ
)
=
e
x
p
(
?
x
2
+
y
2
2
σ
2
)
c
o
s
(
2
π
x
′
λ
+
ψ
)
g(x,y;\lambda,\theta,\psi,\sigma,\gamma)=exp(-\frac{x^2+y^2}{2\sigma^2})cos(2\pi\frac{x^\prime}{\lambda}+\psi)
g(x,y;λ,θ,ψ,σ,γ)=exp(?2σ2x2+y2?)cos(2πλx′?+ψ)
对
x
′
x^\prime
x′展开,可得(由于
ψ
\psi
ψ是常数,为方便公式推导,这里取0):
g
(
x
,
y
;
λ
,
θ
,
ψ
,
σ
,
γ
)
=
e
x
p
(
?
x
2
+
y
2
2
σ
2
)
c
o
s
(
2
π
λ
(
x
c
o
s
θ
+
y
s
i
n
θ
)
)
g(x,y;\lambda,\theta,\psi,\sigma,\gamma)=exp(-\frac{x^2+y^2}{2\sigma^2})cos(\frac{2\pi}{\lambda}(xcos\theta+ysin\theta))
g(x,y;λ,θ,ψ,σ,γ)=exp(?2σ2x2+y2?)cos(λ2π?(xcosθ+ysinθ))
继续展开可得:
e
x
p
(
?
x
2
2
σ
2
)
e
x
p
(
?
y
2
2
σ
2
)
(
c
o
s
(
2
π
λ
x
c
o
s
θ
)
c
o
s
(
2
π
λ
y
s
i
n
θ
)
?
s
i
n
(
2
π
λ
x
c
o
s
θ
)
s
i
n
(
2
π
λ
y
s
i
n
θ
)
)
exp\left(-\frac{x^2}{2\sigma^2}\right)exp\left(-\frac{y^2}{2\sigma^2}\right)\left(cos{\left(\frac{2\pi}{\lambda}xcos\theta\right)}cos\left(\frac{2\pi}{\lambda}ysin\theta\right)-sin\left(\frac{2\pi}{\lambda}xcos\theta\right)sin\left(\frac{2\pi}{\lambda}ysin\theta\right)\right)
exp(?2σ2x2?)exp(?2σ2y2?)(cos(λ2π?xcosθ)cos(λ2π?ysinθ)?sin(λ2π?xcosθ)sin(λ2π?ysinθ))
对x,y分别构造函数有:
f
1
(
x
)
=
e
x
p
(
?
x
2
2
σ
2
)
cos
?
(
2
π
λ
x
c
o
s
θ
)
;
f
2
(
x
)
=
e
x
p
(
?
x
2
2
σ
2
)
sin
?
(
2
π
λ
x
c
o
s
θ
)
f_1\left(x\right)=exp\left(-\frac{x^2}{2\sigma^2}\right)\cos{\left(\frac{2\pi}{\lambda}xcos\theta\right)};f_2\left(x\right)=exp\left(-\frac{x^2}{2\sigma^2}\right)\sin{\left(\frac{2\pi}{\lambda}xcos\theta\right)}
f1?(x)=exp(?2σ2x2?)cos(λ2π?xcosθ);f2?(x)=exp(?2σ2x2?)sin(λ2π?xcosθ)
g
1
(
y
)
=
?
e
x
p
(
?
y
2
2
σ
2
)
c
o
s
(
2
π
λ
y
s
i
n
θ
)
;
g
2
(
y
)
=
?
e
x
p
(
?
y
2
2
σ
2
)
s
i
n
(
2
π
λ
y
s
i
n
θ
)
g_1\left(y\right)=\ exp\left(-\frac{y^2}{2\sigma^2}\right)cos\left(\frac{2\pi}{\lambda}ysin\theta\right);g_2\left(y\right)=\ exp\left(-\frac{y^2}{2\sigma^2}\right)sin\left(\frac{2\pi}{\lambda}ysin\theta\right)
g1?(y)=?exp(?2σ2y2?)cos(λ2π?ysinθ);g2?(y)=?exp(?2σ2y2?)sin(λ2π?ysinθ)
则gabor核的计算公式可化为:
k
(
x
,
?
y
)
=
f
1
(
x
)
g
1
(
y
)
?
f
2
(
x
)
g
2
(
y
)
k(x,\ y)=f_1\left(x\right)g_1\left(y\right)-f_2\left(x\right)g_2\left(y\right)
k(x,?y)=f1?(x)g1?(y)?f2?(x)g2?(y)
伪代码:
for x in kernel_size:
f1(x),f2(x)
for y in kernel_size:
g1(y),g2(y)
for x in kernel_size:
for y in kernel_size:
k(x,y)=f1(x)g1(y)-f2(x)g2(y)
此时,复杂的幂方与三角函数的计算只需进行O(n)次,而简单的乘法与加法运算才需进行
O
(
n
2
)
O(n^2)
O(n2)次。 非正交分解: 上述分解仅适用于
γ
=
1
\gamma=1
γ=1,对于
γ
\gamma
γ任意取值的更普遍情况,实验使用非正交分解。对,分别沿着
x
,
,
y
,
x^,{,y}^,
x,,y,与直线
t
:
y
?
x
t
a
n
α
=
0
t:y-xtan\alpha=0
t:y?xtanα=0进行分解,得到坐标变换
x
→
x
+
c
o
s
α
;
y
→
t
t
a
n
α
x\rightarrow x+cos\alpha;y\rightarrow ttan\alpha
x→x+cosα;y→ttanα与新元表示
σ
x
=
1
c
o
s
θ
2
+
s
i
n
θ
2
γ
2
;
σ
t
=
σ
c
o
s
θ
2
γ
2
+
s
i
n
θ
2
;
α
=
a
r
c
t
a
n
(
c
o
s
θ
2
γ
2
+
s
i
n
θ
2
(
1
?
1
r
2
)
c
o
s
θ
s
i
n
θ
)
\sigma_x=\frac{1}{{cos\theta}^2+{sin\theta}^2\gamma^2};\sigma_t=\sigma\sqrt{\frac{{cos\theta}^2}{\gamma^2}+{sin\theta}^2};\alpha=arctan(\frac{\frac{{cos\theta}^2}{\gamma^2}+{sin\theta}^2}{(1-\frac{1}{r^2})cos\theta sin\theta})
σx?=cosθ2+sinθ2γ21?;σt?=σγ2cosθ2?+sinθ2
?;α=arctan((1?r21?)cosθsinθγ2cosθ2?+sinθ2?)将上述变换及新元表达式带入(1)式分解得:
f
1
(
x
)
=
e
x
p
(
?
x
2
2
σ
x
2
)
cos
?
(
2
π
λ
x
c
o
s
θ
)
;
f
2
(
x
)
=
e
x
p
(
?
x
2
2
σ
x
2
)
sin
?
(
2
π
λ
x
c
o
s
θ
)
f_1\left(x\right)=exp\left(-\frac{x^2}{2{\sigma_x}^2}\right)\cos{\left(\frac{2\pi}{\lambda}xcos\theta\right)};f_2\left(x\right)=exp\left(-\frac{x^2}{2{\sigma_x}^2}\right)\sin{\left(\frac{2\pi}{\lambda}xcos\theta\right)}
f1?(x)=exp(?2σx?2x2?)cos(λ2π?xcosθ);f2?(x)=exp(?2σx?2x2?)sin(λ2π?xcosθ)
g
1
(
t
)
=
?
e
x
p
(
?
t
2
2
σ
t
2
)
c
o
s
(
2
π
λ
t
c
o
s
(
θ
?
α
)
)
;
g
2
(
t
)
=
?
e
x
p
(
?
t
2
2
σ
t
2
)
s
i
n
(
2
π
λ
t
c
o
s
(
θ
?
α
)
)
g_1\left(t\right)=\ exp\left(-\frac{t^2}{2{\sigma_t}^2}\right)cos\left(\frac{2\pi}{\lambda}tcos(\theta-\alpha)\right);g_2\left(t\right)=\ exp\left(-\frac{t^2}{2{\sigma_t}^2}\right)sin\left(\frac{2\pi}{\lambda}tcos(\theta-\alpha)\right)
g1?(t)=?exp(?2σt?2t2?)cos(λ2π?tcos(θ?α));g2?(t)=?exp(?2σt?2t2?)sin(λ2π?tcos(θ?α))
则gabor核的计算公式可化为:
k
(
x
,
?
y
)
=
f
1
(
x
)
g
1
(
t
)
?
f
2
(
x
)
g
2
(
t
)
k(x,\ y)=f_1\left(x\right)g_1\left(t\right)-f_2\left(x\right)g_2\left(t\right)
k(x,?y)=f1?(x)g1?(t)?f2?(x)g2?(t)
实验结果:
实
验
选
取
的
5
个
尺
度
为
[
3
,
11
,
33
,
77
,
111
]
,
36
个
方
向
为
(
s
t
a
r
t
=
0
,
e
n
d
=
π
,
s
t
r
i
d
e
=
π
/
36
)
,
滤
波
参
数
为
:
λ
=
π
/
2
;
γ
=
1
;
ψ
=
0
。
样
例
图
片
的
大
小
为
(
h
e
i
g
h
t
=
675
,
w
i
d
t
h
=
1200
)
,
经
过
10
次
实
验
三
种
滤
波
方
式
的
平
均
时
间
花
费
如
下
:
实验选取的5个尺度为[3, 11, 33, 77, 111],36个方向为(start = 0, end = \pi, stride = \pi/36),滤波参数为:\lambda=\pi/2;\gamma=1;\psi=0。样例图片的大小为(height = 675, width = 1200),经过10次实验三种滤波方式的平均时间花费如下:
实验选取的5个尺度为[3,11,33,77,111],36个方向为(start=0,end=π,stride=π/36),滤波参数为:λ=π/2;γ=1;ψ=0。样例图片的大小为(height=675,width=1200),经过10次实验三种滤波方式的平均时间花费如下:
加速方式 | 花费时间(s) |
---|
无加速 | 11.076 | 正交分解加速 | 3.153 | 非正交分解加速 | 3.129 |
python代码实现:
如有需要请留言邮箱。
|