您的位置  > 互联网

中介绍了匹配算法用于血管分割的另一种方法

Gabor滤波器算法

维基百科给出的解释是,“在图像 中, 是一个被使用的 ,这意味着图像中的任何一个点 或 的 。 和 Gabor 是 的那些,并且它们被发现是 和……在 中,二维 Gabor 是平面波。”

这里我粗略翻译一下:Gaoor滤波是一种用于纹理分析的线性滤波器。 可用于分析图像中某个点或区域周围特定方向上是否存在特定频率。 Gauor滤波器的频率和方向特性与人类视觉系统相似,特别适合纹理表示。 在空间域中,Gaoor滤波器是由正弦波调制的高斯核函数。 把公式记下来,毕竟数学是少不了的:

公式里的参数我就不再讲了。 如果你熟悉高斯函数就会很清楚了。 这里我讲一下Gabor滤波和傅里叶变换的关系。

Gabor变换与变换的关系

经典变换反映了信号的整体特征(时域、频域),但是对于傅里叶谱中的某个频率,我们无法知道这个频率是何时产生的。 傅里叶变换是信号在整个时域的积分,反映了信号频率的整体统计特性,因此不具备局部信号分析的功能。 Gabor 过滤就是为了解决变换的这个缺点而设计的。 为了从变换中提取局部信息,引入了时间局部化的窗函数,成为窗变换。 由于窗变换仅依赖于部分时间信号,因此窗变换也称为短时变换,也称为Gabor变换。 (这会让事情变得更清楚......)

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

,

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

虽然高斯分布的范围是无穷大,但可以选择部分区域,例如将阈值设置为0.00001,则以下公式成立:

1.9143\end{案例}}" src="" />

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

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

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

(这个考验你的数学功底)从g(x,y)的形式来看,二维Gabor滤波器函数可以看成是正弦函数调制的广义高斯函数。 当然,g(x,y)也可以基于正弦函数的分解来计算。 )进行进一步分解。 进一步的分析可以参考论文《二维Gabor滤波器的快速实现》。

Gabor滤波器算法实现

(1) 使用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(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;
}

网上广泛流传的是书面实施。 如果您有兴趣,可以查看:

(2) 使用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

另外,参考实现以及所附案例测试文件的链接如下:

这里我只贴出效果图:

参考:

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