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

2023-11-17

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变换可以表示为:

 

G_{x}(t,f)=\int _{​{-\infty }}^{\infty }e^{​{-\pi (\tau -t)^{2}}}e^{​{-j2\pi f\tau }}x(\tau )\,d\tau

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

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

{\begin{cases}e^{​{-{\pi }a^{2}}}\geq 0.00001;&\left|a\right|\leq 1.9143\\e^{​{-{\pi }a^{2}}}<0.00001;&\left|a\right|>1.9143\end{cases}}

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

G_{x}(t,f)=\int _{​{-1.9143+t}}^{​{1.9143+t}}e^{​{-\pi (\tau -t)^{2}}}e^{​{-j2\pi f\tau }}x(\tau )\,d\tau

二维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 Filter
        GaborFilter(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
end

OutImg = 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • (一)linux系统简介, centos简介及特点,设置静态IP,防火墙

    本章重点 linux系统简介及特点 下载安装 网络和防火墙的相关命令 具体内容 linux系统简介 Linux 内核最初只是由芬兰人林纳斯 托瓦兹 Linus Torvalds 在赫尔辛基大学上学时出于个人爱好而编写的 git 代码同步技术
  • [007]爬虫系列

    一 背景 有些时候网站开发者为了反爬 会做一些状态码欺骗的处理 原理如下 例如 浏览器发送一个请求 获取一个js文件 服务器返回状态码 例如 503等 此时浏览器就会按照状态码503给它做相应的处理 即 浏览器为了速度 会清缓存 所以直接s
  • 压力测试工具apache-ab讲解

    最近在做webservices 得到的数据是从德国那边的服务器 要将这些数据整合到现在网站中去 不知道性能如何 就做个压力测试 现在有些压力测试工具都是收费的 在开源的apache中自带个ab工具 就在C Apache2 2 bin ab
  • Leetcode初级算法——链表

    删除链表中的节点 请编写一个函数 使其可以删除某个链表中给定的 非末尾 节点 传入函数的唯一参数为 要被删除的节点 现有一个链表 head 4 5 1 9 它可以表示为 示例 输入 head 4 5 1 9 node 5 输出 4 1 9
  • pycharm使用anaconda

    一 Anaconda 1 简介 Anaconda就是可以方便的对的python包进行管理 并且可以通过可视化界面对虚拟环境进行管理 Anaconda包含大部分python库 且自带jupyter notebook等一系列应用 实在是学习py
  • Anaconda Prompt 如何切换工作路径

    Anaconda Prompt 默认路径 默认路径是你的用户名路径 切换路径 Anaconda Prompt在默认路径下 无法直接cd到其他盘 只能在根目录下进行切换盘符 在用户名路径下 输入cd 切换到根目录 返回根目录 使用cd 切换到
  • Office 之将 PPT 图片完美插入 Word

    将 PPT 图片完美插入 Word 原始文档 https www yuque com lart tools wdg4ww 前言 PPT 提供了简单易用的基本绘图支持 而 Word 则提供了专业的文档撰写和处理的支持 但这些工具并不是独立且互
  • 国内版ChatGPT插件来了,快速帮你阅读分析一本书,拆书神器

    好消息 我们都知道 自 OpenAI 开放插件后 其插件数量一直在迅速增加 据国外网友统计 最新的插件总数已经有 430 个 与 5 月 13 日刚开放时的 74 个相比 增长超过 400 而现在 文心一言网页版也正式添加了插件机制 普通用
  • 数据库操作不再困难,MyBatis动态Sql标签解析

    系列文章目录 MyBatis缓存原理 Mybatis的CachingExecutor与二级缓存 Mybatis plugin 的使用及原理 MyBatis四大组件Executor StatementHandler ParameterHand
  • 网页设计,前端大作业-个人主页网站

    个人主页网站 下载链接在文末 个人介绍 比较简单的一个网站适合初学者学习使用 点我下载
  • 简单有效,如何彻底卸载删除AlibabaProtect.exe

    简单有效 如何彻底卸载删除AlibabaProtect exe Process Hacker https www isharepc com 33781 html
  • Java常量池理解和经典总结

    Java常量池理解和经典总结 一 相关知识 1 什么是常量 第一种 是一个值 这个值本身 我们就叫做常量 整型常量 1024 实型常量 1 024 字符常量 g c w 字符串常量 gcw 逻辑常量 true false 这只是我们平时我们
  • JPEG数据格式分析

    添加链接描述 参考如让 感谢原创分享 JPEG数据分析 分析对象是一幅8x8的jpg图片 如下 图片已被放大并被虚线切分 这里写图片描述 用windows照片查看器查看图片详细信息 信息 参数 大小 667字节 尺寸 8x8 宽度 8像素
  • 【干货】Spring远程命令执行漏洞(CVE-2022-22965)原理分析和思考

    前言 上周网上爆出Spring框架存在RCE漏洞 野外流传了一小段时间后 Spring官方在3月31日正式发布了漏洞信息 漏洞编号为CVE 2022 22965 本文章对该漏洞进行了复现和分析 希望能够帮助到有相关有需要的人员进一步研究 1
  • 《热题100》字符串、双指针、贪心算法篇

    思路 对于输入的的字符串 只有三种可能 ipv4 ipv6 和neither ipv4 四位 十进制 无前导0 小于256 ipv6 八位 十六进制 无多余0 00情况不允许 不为空 class Solution def solve sel
  • 区块链扩容系列之Plasma MVP

    以太坊低TPS一直被诟病 最近V神提出一种将以太坊TPS提升到500的方案 一经发表就被BM调侃 可见以太坊低TPS目前确实严重阻碍了以太坊的发展 连V神都不得不经常发声 我们知道以太坊低TPS的一个关键原因是以太坊采用POW 因而将部分交
  • selenium爬虫检测之如何避免对isTrusted属性检测

    如何避免对isTrusted属性检测 检测原理 什么是isTrusted属性 在web api官方网站mozilla org有如下解释 Event接口的 isTrusted 属性是一个只读属性 它是一个布尔值 Boolean 当事件是由用户

随机推荐