二维Gabor 滤波加速

以下内容原创首发,如需转载请注明来源!

实验题目:

选取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σ2x2+γ2y2)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 xy分别与x,y都相关,所以无法直接分解计算,即对 x ′ 与 y ′ x^\prime与y^\prime xy的计算必须使用二重循环,这样无疑提升了时间复杂度。因此,如果能够实现对(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)γ=1x2+γ2y2=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:yxtanα=0进行分解,得到坐标变换 x → x + c o s α ; y → t t a n α x\rightarrow x+cos\alpha;y\rightarrow ttan\alpha xx+cosα;yttanα与新元表示 σ 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((1r21)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σx2x2)cos(λ2πxcosθ);f2(x)=exp(2σx2x2)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σt2t2)cos(λ2πtcos(θα));g2(t)= exp(2σt2t2)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代码实现:

源代码:
https://download.csdn.net/download/NiZjiTouA/82308648

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K_K_Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值