在http://blog.csdn.net/piaoxuezhong/article/details/78213672中介绍了匹配滤波算法用于血管分割,本篇继续介绍血管分割的另一种方法:Gabor滤波算法,具体可以参见论文《Retinal Vessel Segmentation Using the 2-D GaborWavelet and Supervised Classification》。

Gabor滤波算法

维基里给出的解释,“In image processing, aGabor filter is a linear filter used fortextureanalysis, which means that it basically analyses whether there are any specific frequency content in the image in specific directions in a localized region around the point or region of analysis. Frequency and orientation representations of Gabor filters are similar to those of thehuman visual system, and they have been found to be particularly appropriate for texture representation and discrimination. In the spatial domain, a 2D Gabor filter is aGaussiankernel function modulated by asinusoidal plane wave.”

我这里大概翻译一下:Gaoor滤波是用于纹理分析的线性滤波器,它可以用来分析图像中某点或某区域周围在特定方向上是否存在特定的频率。Gaoor滤波器的频率和方向特性与人的视觉系统相似,尤其适合用于纹理表述方面。在空间域中,Gaoor滤波器是一种由正弦波调制而成的高斯核函数。扒下公式,毕竟数学是少不了的:

公式里的参数就不再说了,熟悉高斯函数的筒子自然就清楚了,这里说一下Gabor滤波与傅里叶变换的关系。

Gabor变换与傅里叶变换的关系

经典Fourier变换反映的是信号的整体特性(时域,频域),而对于傅里叶频谱中的某一频率,我们无法得知这个频率是什么时候产生的。傅里叶变换是信号在整个时域内的积分,反映的是信号频率的整体统计特性,所以不具备局部信号分析的功能。Gabor滤波正是针对Fourier变换的这点不足设计的,为了从Fourier变换中提取局部信息,引入了时间局部化的窗函数,变为窗口Fourier变换。由于窗口Fourier变换只依赖于部分时间的信号,窗口Fourier变换又称为短时Fourier变换,又称Gabor变换。(这样就清楚多了...)

信号x(t)的Gabor变换可以表示为:

高斯函数分布如下图所示:

高斯分布虽然是无穷范围,但可以选取部分区域,例如设置阈值0.00001,下式成立:

Gabor变换可以近似为如下形式,即忽略掉了阈值外的区域:

二维Gabor滤波器--图像处理领域中的应用

二维Gabor滤波器能够很好地描述空间频率、空间位置和方向选择等局部信息,而且对光照不敏感。同时Gabor滤波器的响应和脊椎动物大脑视觉皮层简单细胞的响应非常相似。Gabor滤波在光学字符识别、虹膜识别和指纹识别等图像处理应用中非常有用。

(这个考验数学功底了)从g(x,y)的形式来看,二维Gabor滤波函数可以看成经过正弦函数调制的广义高斯函数,当然也可以根据正弦函数的分解对g(x,y)进行进一步的分解。至于进一步的解析可以查阅论文《二维Gabor滤波器的快速实现》。

Gabor滤波算法实现

(1)使用opencv实现Gabor

Mat mkKernel(int ks, double sig, double th, double lm, double ps)
{int halfks = (ks - 1) / 2;double theta = th*CV_PI / 180;double psi = ps*CV_PI / 180;double delta = 2.0 / (ks - 1);double lmbd = lm;double sigma = sig / ks;double x_theta;double y_theta;Mat GaborKernel(ks, ks, CV_32F);for (int y = -halfks; y <= halfks; y++){for (int x = -halfks; x <= halfks; x++){x_theta = x*delta*cos(theta) + y*delta*sin(theta);y_theta = -x*delta*sin(theta) + y*delta*cos(theta);GaborKernel.at<float>(halfks + y, halfks + x) = (float)exp(-0.5*(pow(x_theta, 2) + pow(y_theta, 2)) / pow(sigma, 2))* cos(2 * CV_PI*x_theta / lmbd + psi);}}return GaborKernel;
}

在网上流传比较广的是ZhouMian写的opencv实现,感兴趣的可以查看:http://download.csdn.net/download/piaoxuezhong/10033028.

(2)使用matlab实现Gabor

function [OutImg, GaborFilter] = gabor(I, gamma, lambda, b, theta, phi, shape)
if nargin < 7, shape = 'same'; end;
if isa(I, 'double') ~= 1, I = double(I); end
sigma = (1 / pi) * sqrt(log(2)/2) * (2^b+1) / (2^b-1) * lambda;
Sy = sigma * gamma;
for x = -fix(sigma):fix(sigma)for y = -fix(Sy):fix(Sy)xp = x * cos(theta) + y * sin(theta);yp = y * cos(theta) - x * sin(theta);% GF is Gabor FilterGaborFilter(fix(Sy)+y+1,fix(sigma)+x+1) = ...exp(-.5*(xp^2+gamma^2*yp^2)/sigma^2) * cos(2*pi*xp/lambda+phi);end
endOutImg = conv2(I, double(GaborFilter), shape);end

另外,参照opencv的实现,matlab附带案例测试文件的链接如下:http://download.csdn.net/download/piaoxuezhong/10033075

这里,我只贴下效果图:

参考:

  • https://en.wikipedia.org/wiki/Gabor_filter
  • http://www.cppblog.com/polly-yang/archive/2012/07/14/183327.aspx
  • http://blog.csdn.net/watkinsong/article/details/7872764
  • http://blog.csdn.net/chenbang110/article/details/7561846
  • https://blog.csdn.net/dxinbin/article/details/73250571        ---matlab---
  • http://blog.csdn.net/watkinsong/article/details/7876361     ---matlab---
  • http://blog.csdn.net/u013288466/article/details/72636485
  • http://blog.csdn.net/jinshengtao/article/details/17797641   ---opencv---
  • http://blog.csdn.net/lichengyu/article/details/24534245
  • http://blog.csdn.net/lichengyu/article/details/20743877       ---opencv---
  • https://code.google.com/p/gaborboosting/source/checkout
  • http://blog.csdn.net/jbb0523/article/details/42028587
  • 《利用2D-Gabor滤波器提取纹理方向特征的虹膜识别方法》[J].计算机应用研究
  • 《二维Gabor滤波器的快速实现》[J]自动化学报
  • 《Gabor-Boosting Face Recognition》

附录几篇视网膜血管分割的文章:

  • https://wenku.baidu.com/view/f42a5018763231126edb11f1.html
  • http://xueshu.baidu.com/s?wd=paperuri%3A%28746181cea26c0e0ae8243ebc001c6396%29&filter=sc_long_sign&tn=SE_xueshusource_2kduw22v&sc_vurl=http%3A%2F%2Fwww.doc88.com%2Fp-1428507894322.html&ie=utf-8&sc_us=12351080291907237713

眼底图像血管增强与分割--(2)Gabor滤波算法原理及实现相关推荐

  1. 眼底图像血管增强与分割--(5)基于Hessian矩阵的Frangi滤波算法

    在最优化里面提到过的hessian矩阵(http://blog.csdn.net/piaoxuezhong/article/details/60135153),本篇讲的方法主要是基于Hessian矩阵 ...

  2. Unet简明代码实现眼底图像血管分割

      Unet是一种自编码器网络结构,常用于医学图像分割任务,比如眼底图像血管分割.这位大佬已经开源了非常棒的代码,但是这套代码比较复杂,我初学菜鸟硬是啃了好几天才啃下来.现在我代码进行重写,仅保留最必 ...

  3. 零基础基于U-Net网络实战眼底图像血管提取

    文章目录 1 前言 2 血管提取任务概述 3 U-Net架构简介 4 眼底图像血管分割代码 5 结果评估可视化(ROC曲线) 6 改进U-Net网络完成眼底图像血管提取任务思路 1 前言 本文基于U- ...

  4. 基于GNet网络和Keras框架实战眼底图像视杯视盘分割

    个人简介:李响Superb,CSDN百万访问量博主,普普通通男大学生,目前在读软件工程,计算机视觉.深度学习和医学图像处理专攻,偶尔也搞迁移学习和全栈开发. 博客地址:lixiang.blog.csd ...

  5. 基于U-Net的眼底图像血管分割实例

    [英文说明]https://github.com/orobix/retina-unet#retina-blood-vessel-segmentation-with-a-convolution-neur ...

  6. 简明代码实现Unet眼底图像血管分割

    项目工程文件结构如下: 参考了Retina_Unet项目,决定自己用代码来实现一遍,数据增强不是像Retina_Unet那样随机裁剪,而是将20个训练数据集按顺序裁剪,每张裁剪成48x48大小的144 ...

  7. 传统语音增强——最小均方(LMS)自适应滤波算法

    一.语音降噪的意义 语音降噪主要研究如何利用信号处理技术消除信号中的强噪声干扰,从而提高输出信噪比以提取出有用信号的技术.消除信号中噪声污染的通常方法是让受污染的信号通过一个能抑制噪声而让信号相对不变 ...

  8. 基于matlab的眼底视网膜静脉血管分割仿真

    目录 1.算法概述 2.仿真效果 3.MATLAB源码 1.算法概述 随着图像数字化处理的快速发展,医学图像处理越来越受到人们的广泛关注.研究表明,人体许多全身性疾病都与眼底血管的异常有着密切的联系, ...

  9. 基于MATLAB的眼底视网膜静脉血管分割实现

    基于MATLAB的眼底视网膜静脉血管分割实现 眼底的视网膜图像对于眼科医生来说是非常重要的.其中,视网膜上血流情况可以为医生提供丰富的信息,如视网膜动脉硬化等.因此,对于眼底图像的分割和特征提取,对于 ...

  10. 【深度学习】眼底图像的视杯和视盘分割解析

    [深度学习]眼底图像的视杯和视盘分割解析 文章目录 1 背景 2 概念2.1 视盘2.2 视杯 3 数据 4 医学图像分割-Attention Unet 5 注意力机制到底是什么-资源分配给更重要的特 ...

最新文章

  1. 一次搞懂所有排序算法(一)
  2. 全球地区资料json 含中英文 经纬度_含乳饮料行业发展趋势及市场化程度分析(附报告目录)...
  3. configure: error: Neither flex nor lex was found.
  4. 基本套接字TCP和UDP
  5. java删除文件模糊_Java实现的模糊匹配某文件夹下的文件并删除功能示例
  6. mysql 导出数据字典_操作MySQL?这个库比pymysql香一百倍
  7. 2、Collections操作(自定义类)的各种实现
  8. 自己开发的一款基于PagedDataSource的datalist repeater控件,只需要在源程序中添加三行代码,即可实现通用分页
  9. JavaScript:对象都是这样生成的!
  10. centos yum mysql-devel 5.5_CentOS 6.5通过yum安装 MySQL-5.5
  11. LAMP架构调优(三)——模块的安装与调用
  12. java调用tuxedo中间件_初探TUXEDO中间件
  13. C语言:cJSON库用法详解
  14. 监控之Promethus+grafana概述及问题处理
  15. 网页使用中文字体的两种解决方案
  16. Nginx 连接限制和访问控制Nginx 连接限制和访问控制
  17. 微信小程序上传多张图片
  18. 数据库SQL实战11_获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date=‘9999-01-01‘, 结果第一列给出员工的emp_no, 第二列给出其manager
  19. 华为k662c的虚拟服务器,华为k662c路由器怎么设置 | 华为k662c路由器设置_什么值得买...
  20. Xshell的下载与安装

热门文章

  1. 大数据技术Hadoop介绍
  2. 2018.07.09 顺序对齐(线性dp)
  3. nginx配置openssl证书
  4. 梦断代码读后感(二)
  5. [SAP ABAP开发技术总结]动态修改选择屏幕
  6. 20/23种设计模式---C++实现
  7. Java面试题超详细讲解系列之六【网络协议篇】
  8. Java操作MongoDB(聚合函数)向Mongo插入及查询数据
  9. JAVAWeb项目 微型商城项目-------(五)用户登录实现
  10. json字符串中的大括号转义传到后台_string.format格式化字符串中转义大括号“{}”...