最近一直在做版面分析,其中文本行检测方面,许多文章涉及到了Anigauss也就是各向异性高斯滤波。

顾名思义,简单的理解就是参数不同的二维高斯滤波。

在文章Fast Anisotropic Gauss Filtering中阐明了Anisotropic Gauss Filter可以分解成想,y两个方向不同的一维高斯滤波,其中x,y不必垂直。

下面我们来看一下分解过程。

一个简单的各向同性二维高斯卷积滤波一般如下式

当x,y方向缩放比例不同时我们便得到了各向异性二维高斯滤波如图

当然也可以做其他方向的滤波,我们设旋转角度为θ如图,则旋转后坐标与x,y坐标关系为

因此可以得到一个通用的表达式

其中u轴为θ方向,v轴为垂直于θ方向。

根据傅里叶变换我们知道,空域卷积等于频域相乘

所以如果一个线性滤波的傅里叶变换可以写成两个分别关于Wx,Wy方程相乘的形式,那么在空域他可以写成两个子项的卷积

因此我们可以将 的傅里叶变换写成如下形式:

(7)

也就是

然而我们只对x,y感兴趣,因此我们将分解为

 (10)

然后我们可以得到a11,a12,a13的表达式

再一次明确我们的目标是将各向异性高斯滤波分解成一个x方向与一个延方向的一维滤波。

便于分解,我们(10)式写成所有与Wy无关和Wy有关的相加形式

并放入(10)式后得到

根据指数的性质也可写为

然后做傅里叶逆变换后得到

第一项表示x方向的滤波

第二项表示滤波

其中

至此分解完成:

文中作者应用了recursive filter去做了实现,具体需要参考源代码anigauss.c

具体效果如图

Anisotropic gauss filter的更多相关文章

  1. 二维高斯滤波器(gauss filter)的实现

    我们以一个二维矩阵表示二元高斯滤波器,显然此二维矩阵的具体形式仅于其形状(shape)有关: def gauss_filter(kernel_shape): 为实现二维高斯滤波器,需要首先定义二元高斯 ...

  2. opencl gauss filter优化(三)

    1.根据前两次的最终结果: 使用普通buffer,Horizontal 5ms, Vertical 17 ms 使用image buffer:Horizontal 9.4ms, Vertical 6. ...

  3. opencl gauss filter优化(二)

    1.buffer使用image的方式:Horizontal 与 Vertical 算法一样, 共需30ms,wait time 19ms. const sampler_t sampler = CLK_ ...

  4. opencl gauss filter优化(一)

    Platform: LG G3, Adreno 330 ,img size 3264x2448 C code neon GPU 300 60 29 单位:ms 1. 目前按如下行列分解的方式最快29m ...

  5. Texture Filter中的Bilinear、Trilinear以及Anistropic Filtering

    1. 为什么在纹理采样时需要texture filter(纹理过滤)?我们的纹理是要贴到三维图形表面的,而三维图形上的pixel中心和纹理上的texel中心并不一至(pixel不一定对应texture ...

  6. 各项异性滤波简单介绍Anisotropic Filtering(AF)

    本文主要整理简绍来自互联网的各项异性滤波的知识. 原文链接:http://www.linuxgraphics.cn/graphics/using_anisotropic_texture_filteri ...

  7. {ICIP2014}{收录论文列表}

    This article come from HEREARS-L1: Learning Tuesday 10:30–12:30; Oral Session; Room: Leonard de Vinc ...

  8. anisotropy texture filtering

    http://www.extremetech.com/computing/51994-the-naked-truth-about-anisotropic-filtering 1. 为什么在纹理采样时需 ...

  9. 【学习笔记】Learning OpenCV3——Ch8 working with video

    Reading Video with the cv::VideoCapture Object 对象创建的三种方法: // 1. Input filename cv::VideoCapture::Vid ...

随机推荐

  1. Altium Designer中使用差分对布线

    Contents Language 在原理图中定义差分对 在PCB中查看和管理差分对 在PCB中定义差分对 适用的设计规则 设置设计规则的辖域 使用差分对向导定义规则 差分对布线 包括管脚交换的FPG ...

  2. 许多js框架或js库的min版本是怎么做出来的?

    如jQuery,Bootstrap,AngularJs,这些都有min版本,代码更加精简,功能却相同.看了源代码,几乎不可读. 这种事情的工具类型叫做“minifier”.请看传送门:Minifica ...

  3. Linux grep 命令中的正则表达式详解

    在 Linux .类 Unix 系统中我该如何使用 Grep 命令的正则表达式呢? Linux 附带有 GNU grep 命令工具,它支持扩展正则表达式(extended regular expres ...

  4. JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)

    每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...

  5. [React Testing] Conditional className with Shallow Rendering

    Often our components have output that shows differently depending on the props it is given; in this ...

  6. ProtoBuf 的java使用

    碰巧用到Proto,算是笔记吧算是笔记吧, windows : 1,两个文件:proto.exe,  protobuf-java-2.4.1.jar 2,建立一个工程TestPb,在下面建立一个pro ...

  7. Android模块化编程之引用本地的aar

    随着项目越来越多,代码的复用就变得异常重要,这时候就要进行模块化编程,就是把一些通用的组件或者类库做成单独的模块,其他项目直接进行引用就好.针对Android开发最常见的就是Android Libra ...

  8. 关于driver_register做了些什么

    现在进入driver_register()函数去看看.在driver_register() 中,调用了driver_find(drv->name, drv->bus)函数,这里是干啥呢?这 ...

  9. hdu 2101

    #include <stdio.h> int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) { i ...

  10. Responsive Table 利用@media

    html <table> <thead> <tr> <th>First Name</th> <th>Last Name</ ...