数字图像的边缘检测(一)

人眼之所以能区分不同物体,是由于不同物体对光的反射强度不同,从而在物体之间形成亮度和色彩上的对比,这种对比最明显的地方就是物体的边缘。对于使用图像传感器形成的数字图像来说,颜色相近的像素在一起形成不同的区域,不同区域间的边缘同样表现为颜色亮度的跃变。

(1)基本原理

如果将灰度看作一个函数,那么描述灰度变化最直观的工具就是微分了。而图像的灰度是个二元函数,因此需要用到偏微分。与一元函数不同,二元函数在一点有多个方向,因此导数也不唯一。因此,要想找到灰度变化最大的方向,也就是方向导数最大的方向,就需要用到梯度,如下所示:
这里写图片描述
这里写图片描述
梯度是一个向量,函数沿着梯度方向的方向导数最大,且最大值为梯度的值M(x,y)。从式中可以看出,求梯度首先需要求出水平和垂直方向的偏导数。由于数字图像的灰度是离散值,无法直接使用微分运算,因此要使用到差分运算。所谓差分,又名差分函数或差分运算,差分的结果反映了离散量之间的一种变化,是研究离散数学的一种工具。它将原函数f(x)映射到f(x+a)-f(x+b)。差分运算,相应于微分运算,是微积分中重要的一个概念。差分对应离散,微分对应连续。差分又分为前向差分和逆向差分两种。前向差分为ΔF[X(k)]=F[X(k+1)]−F[X(k)],后向差分为ΔF[X(k)]=F[X(k)]−F[X(k-1)]。在这里我们使用前向差分,如下所示:
这里写图片描述
根据上式可以得出梯度的模。但是由于平方根和平方和需要消耗大量的计算开销,因此采用绝对值来近似梯度的幅值:
这里写图片描述
该式不仅在计算上更节省资源,提高运行效率,而且仍然保持着灰度级的相对变化(想想为什么)。由此可以得到计算梯度模的简化式:M(x,y)=|f(x+1,y)-f(x,y)|+|f(x,y+1)-f(x,y)| 。
以上的梯度法又称为水平垂直差分法。另一种梯度法叫做罗伯特梯度法(Robert Gradient),它是一种交叉差分计算法(其实就是微分的差分形式计算的方式不同)。其数学表达式也可近似为:M(x,y)=|f(x+1,y+1)-f(x,y)|+|f(x+1,y)-f(x,y+1)| 。需要注意的是,这两种梯度近似算法在图像的最后一行和最后一列的各像素的梯度无法求得。
计算完梯度的模(幅值)之后,可以根据需要生成不同的梯度增强图像。第一种是使各点的灰度等于该点的梯度幅值,即 g(x,y)=M(x,y) ;此方法的缺点是增强的图像仅显示灰度变化比较陡的边缘轮廓,而灰度变化平缓的区域则呈黑色。第二种是设置一个阈值T,当梯度幅度M(x,y)>T时,令 g(x,y)=M(x,y) ,否则就等于原像素值,即 g(x,y)=f(x,y) ,其实就是一个分段函数。此方法既可使明显的边缘轮廓得到突出,又不会破坏原灰度变化平缓的背景。还有第三种、第四种、第五种方法,这里就不做介绍了。下面的编码中我们采用第一种方法实现,即直接将梯度幅值赋给新像素。

(2)编码实现

以上计算梯度幅值的算式可以使用前面介绍过的模板操作来完成。即将不同的梯度法计算简化成模板的形式,在这里称为算子。比如上述的水平垂直差分法可简化成两个2x2模板:[1,-1;0,0]和[1,0;-1,0];罗伯特梯度法也可简化成两个2x2模板:[0,1;-1,0]和[1,0;0,-1];两个模板操作分别是计算出偏导数gx和gy 。
下面先实现水平垂直梯度法。

% ***************************Copyright 2016[c]**************************
% ************************Declaration************************************
% File name:        horizontal&vertical
% Author:           靖Harry                                        
% Date:             06-Aug-2016 21:28:50                                  
% Version Number:   1.0
% Abstract:  
%    使用水平垂直差分法计算图像每个像素的梯度幅值.  
% *********************************end*********************************
clear
clc
tic
I=rgb2gray(imread('6.jpg'));
%imread函数读取的图像像素默认为uint8型,范围为0~255,需要转换成double类
%型,因为后面需要乘以负数,会超出0~255的范围
I=im2double(I);
g=I;  %边缘被增强的图像
[m,n]=size(I);
%用于水平垂直差分计算法的两个模板
%   f(x,y)  ---  f(x,y+1)    
%    |  
%  f(x+1,y)      f(x+1,y+1)
%简化为M(x,y)=|f(x+1,y)-f(x,y)|+|f(x,y+1)-f(x,y)|
horiz=[1,-1;0,0]; %水平方向求偏导的模板
verti=[1,0;-1,0]; %垂直方向求偏导的模板
for a=1:m-1
   for b=1:n-1
      sh=0;sv=0; %水平和垂直方向的偏导
      %为减少运算量,提高效率,不采用多层for循环对模板进行卷积操作
      sh=I(a,b)*horiz(1,1)+I(a,b+1)*horiz(1,2);
      sv=I(a,b)*verti(1,1)+I(a,b)*verti(2,1);
      g(a,b)=abs(sh)+abs(sv); %近似求和
   end
end
h1=subplot(1,2,1),set(h1,'position',[0,0,0.5,1]),imshow(I),title('原图像');
h2=subplot(1,2,2),set(h2,'position',[0.5,0,0.5,1]),imshow(g),title('边缘图像');
toc

这里写图片描述
再来一张
这里写图片描述
对比上面的结果,确实起到了边缘增强的作用,但效果感觉不是很好。不过这也正常,毕竟这是最简单的算法,真正NB的算法还没登场。

下面来试试Roberts算子:

% ***************************Copyright 2016[c]**************************
% ************************Declaration************************************
% File name:        edge_roberts
% Author:           靖Harry                                        
% Date:             06-Aug-2016 21:47:43                                 
% Version Number:   1.0
% Abstract:  
%    使用Robert梯度法,即交叉差分计算法计算图像每个像素的梯度幅值.  
% *********************************end*********************************
clear
clc
tic
I=rgb2gray(imread('6.jpg'));
%imread函数读取的图像像素默认为uint8型,范围为0~255,需要
%转换成double类型,因为后面需要乘以负数,会超出0~255的范围。
I=im2double(I);
g=I; %边缘被增强的图像
[m,n]=size(I);
%用于交叉差分计算法的两个模板
%    f(x,y)  f(x,y+1)
%        \ /       
%        / \
%   f(x+1,y) f(x+1,y+1)
%简化为M(x,y)=|f(x+1,y+1)-f(x,y)|+|f(x+1,y)-f(x,y+1)|
hx=[0,1;-1,0]; 
hy=[1,0;0,-1];
for a=1:m-1
   for b=1:n-1
      sx=0;sy=0;  %两个交叉方向的偏导
      sx=I(a,b+1)*hx(1,2)+I(a+1,b)*hx(2,1);
      sy=I(a,b)*hy(1,1)+I(a+1,b+1)*hy(2,2);
      g(a,b)=abs(sx)+abs(sy); %近似求和
   end
end
h1=subplot(1,2,1),set(h1,'position',[0,0,0.5,1]),imshow(I),title('原图像');
h2=subplot(1,2,2),set(h2,'position',[0.5,0,0.5,1]),imshow(g),title('roberts边缘');
toc

这里写图片描述
再来一张
这里写图片描述
快瞅瞅,是不是比水平垂直差分法的边缘效果好了些。当然,这些都只是冰山一角,还有Sobel算子、Prewitt算子、Robinson算子、DoG算子、Canny算子等等什么鬼算子。当然,这些算子有3x3,4x4等等,具体根据需要来,这里就不一一分析,为了方便,同一用3x3模板。好了,今天就到这里了,下回再介绍一些其他算子的用法。

猜你喜欢

转载自blog.csdn.net/u013608424/article/details/73017467
今日推荐