1 Gabor滤波算法原理
Gabor核函数定义:
式中:依次作为主轴方向上的高斯尺度、主轴方向正交的高斯尺度, 是滤波器的中心频率;是调制平面波以及高斯主轴旋转的角度,它沿着逆时针方向,和是常数。Gabor滤波器它的虚部适合用来提取图像的边缘信息,性能对噪声有较好的鲁棒特性。
在以、作为变量构建不同尺度和方向的滤波器组,分别可以检测出图像不同方向的边缘信息,再对非边缘点进行抑制,融合不同方向的边缘信息,得到完整的边缘信息。最后对图像进行边缘连接得到完整边缘。
2 Gabor滤波器检测步骤
选取如下图所示的图像作为边缘检测对象。该图像边缘主要为直线,方向清晰,易于作为图像的边缘检测。
2.1 多尺度多方向Gabor滤波核
由于Gabor滤波函数的虚部比较适合提取图像的边缘信息,选用不同的中心频率和方向构建一组滤波核
根据所选的检测图样,选取f = 0.15 , 0.3 , 0.45 theta为0,pi/4,pi/2,3pi/4。得到滤波核组如图1所示:
function [ Gabor_k ] = makeGabor(x,y, f0,theta )
%生成Gabor滤波
%gama,eta为常数
% f0^2
% G(Z)=------------------*exp(-(f0^2*x1^2/gama^2+f0^2*y1^2/eta^2))*exp(i*2*pi*f0*x1)
% pi*gama*eta
gama = 1;eta = 2;
x1 = x*cos(theta)+y*sin(theta);
y1 = -x*sin(theta)+y*cos(theta);
Gabor_k = f0^2/(pi*gama*eta)*exp(-(f0^2*x1^2/gama^2+f0^2*y1^2/eta^2))*exp(i*2*pi*f0*x1);%Gabor的滤波函数
end
2.2 图像初步边缘检测
首先对图像进行灰度化处理,处理后的图像与所构建的多尺度多方向滤波核依次进行卷积得到不同尺度下,各个方向的边缘检测图样,每个图像都代表不同方向和尺度下的边缘信息。
function [filtered] = filteredImage(I,h,w ,f0,theta)
%得到梯度幅值图和相位图,实部与虚部
%I------输入图像
%h------Gabor窗口高,为偶数
%w------Gabor窗口的宽,为偶数
%filtered--边缘检测图像
%--------------检测输入的h,w为偶数
if (mod(h,2)~=0 || mod(w,2)~=0)
error('"h" or "w" is odd');
end
%--------------对输入图像进行判断和灰度处理
if (size(I,3)>1)
I=rgb2gray(I);
end
%---------------生成(h+1)*(w+1)窗口大小的Gabor滤波器
x=0;
z=zeros(h+1,w+1);
for m = linspace(-h/2,h/2,11)
x=x+1;
y=0;
for n = linspace(-w/2,w/2,11)
y=y+1;
z(y,x) = makeGabor(m,n, f0,theta );
end
end
%-------利用Gabor滤波器的虚部进行边缘检测
I = double(I);
z_img = imag(z);
filtered = conv2(I,z_img,'same');
%figure;
filtered = filtered/max(filtered(:));
end
2.3 图像非极大值抑制
将初步边缘检测得到的图像,按照检测的方向,对相应图像每个点附近两个点进行比较,若为最大值则保留,若不是,则变为0。
2.4 多尺度多方向图像融合
对于不同尺度和不同方向下检测得到的图像包含不同的边缘信息,为的到完整的边缘信息需要对图像进行融合,融合的图像如图6所示。
2.5 边缘连接
在对图形进行融合后,需要将图像边缘连接成轮廓,对融合图像的8邻域位置寻找可以连接的点,若在上下阈值方为内则设置为边缘点,若不在阈值范围内,则为0。最终检测得到的边缘图像如图7所示。
3 总结
1) 同过实验可以发现Gabor虚部对于图像的边缘检测有效,而多尺度多方向的检测更能比较全面的检测出图像的边缘信息。
2) 实验结果中,出现非边缘信息表明,在极大值的抑制中,对非边缘点的抑制不够导致部分非边缘信息显现。因此,后面有待改进。
3) 对于边缘点的连接,只是对每个点的8邻域进行了分析,对于边缘缺失信息较大的区域无法起到很好的连接作用。该点也是需要改进的地方。
clear all;
close all;
I = imread('1.jpg');
h = 6;
w = 6;
u = 4;
v = 3;
%-----------------------------------------对图像进行多方向多尺度的边缘检测
for i=1:v
for j=0:(u-1)
theta = pi*j/4;%方向
f0 = 0.15*i; %尺度
filtered_cell{i,j+1} = filteredImage(I,h,w ,f0,theta);
figure(1);
subplot(3,4,(i-1)*4+(j+1))
imshow(filtered_cell{i,j+1});
titlename = strcat('f0:',num2str(f0),' theta:',num2str(theta*180/pi));
title(titlename);
end
end
%-----------------------------------------对每幅图像进行非极大值抑制
[m,n] = size(filtered_cell{1,1});
for i = 1:v
for j =1:u
img = filtered_cell{i,j};
for p = 3:m-2
for q = 3:n-2
if j==1
A = [img(p-1,q),img(p+1,q)];
if (img(p,q) < max(A))
img(p,q)=0;
end
elseif(j==2)
A = [img(p-1,q+1),img(p+1,q-1)];
if (img(p,q) < max(A))
img(p,q)=0;
end
elseif(j==3)
A = [img(p,q-1),img(p,q+1)];
if (img(p,q) < max(A))
img(p,q)=0;
end
elseif(j==4)
A = [img(p-1,q-1),img(p+1,q+1)];
if (img(p,q) < max(A))
img(p,q)=0;
end
end
end
end
filtered_cell{i,j} = img;
figure(2);
subplot(3,4,(i-1)*4+j)
imshow(filtered_cell{i,j});
titlename = strcat('f0:',num2str(f0),' theta:',num2str(theta*180/pi));
title(titlename);
end
end
%-----------------------------------------多尺度多方向的图像融合
%=======将同一尺度下各个方向的图像进行融合
for i = 1:v
for j = 1:u
img_cell = filtered_cell(i,:);
end
for r = 1:m
for s = 1:n
for k=1:u
B(k) = img_cell{1,k}(r,s);
end
img(r,s) = max(B);
end
end
img_mix{1,i} = img;
% figure;
% imshow(img_mix{1,i}/max(img_mix{1,i}));
end
%=======将多尺度图像进行融合
for r = 1:m
for s = 1:n
for k = 1:v
C(k) = img_mix{1,k}(r,s);
end
img_mixed(r,s) = mean(C);
end
end
figure
imshow(img_mixed);
%---------------------------------------对图像进行边缘连接
low = 0.1;
up = 0.2;
neighbour=[-1 -1;-1 0;-1 1;0 -1;0 1;1 -1;1 0;1 1];
for i = 1:m
for j =1:n
for k=1:8
yy=i+neighbour(k,1);
xx=j+neighbour(k,2);
if yy>=1 && yy<=m && xx>=1 && xx<=n
if img_mixed(yy,xx)>=low %判断下阈值
img_mixed(yy,xx)=255;
if img_mixed(yy,xx)<=up %判断上阈值
img_mixed(yy,xx)=0;
end
end
end
end
end
end
img_edge = img_mixed;
figure
imshow(img_edge);
title('边缘检测图像');