900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 图像边缘检测——一阶微分算子 Roberts Sobel Prewitt Kirsch Robinson(Matlab实现)

图像边缘检测——一阶微分算子 Roberts Sobel Prewitt Kirsch Robinson(Matlab实现)

时间:2021-06-03 14:06:21

相关推荐

图像边缘检测——一阶微分算子 Roberts Sobel Prewitt Kirsch Robinson(Matlab实现)

图像边缘一般指图像的灰度变化率最大的位置。成因主要如下:

1.图像灰度在表面法向变化不连续;

2.图像中物体在空间上的深度不一致;

3.在光滑的表面上颜色不一致;

4.图像中物体的光影

边缘检测指的是从图像中检测边缘点和边缘段,并且描述边缘方向的过程。图像可以看成二元函数f(x,y),(x,y)是pixel的位置,f(x,y)是该处的灰度值,这样图像就可以想象成是一个曲面。看作曲面以后,就可以用数学的方法来处理了。边缘即曲面上变化最剧烈的位置,这个位置也是曲面的局部极值点的位置,求极值大家都知道,可以用导数来求。

我们要做的一是找到边缘的位置,二是要确定边缘的方向,因为在描绘边缘的时候,要将相关的边缘连接成边缘线。

这里介绍的是用一阶微分算子来检测边缘。

求得图像的梯度场:

梯度的模值为:

梯度方向为:

方向导数与梯度具有如下关系:

由内积的计算方法可以得出:

由此我们得到,图像某一点(x,y)变化最快的方向是梯度的方向,变化最慢的方向是与梯度垂直的方向。

两个关键点:

1. 图像是离散的,微分算子也要离散化,我们用差分的方式去逼近微分,并将微分算子简化为模板;

2. 到底要不要把一个点看作边缘点,我们是通过设定一个阈值来判断的,微分后大于这个阈值,就判作边缘。

一个注意点:

导数是检测突变的地方,如果某处有噪声干扰,很容易误检,即一阶微分不能抵抗噪声。所以在使用一阶微分检测边缘之前,通常进行预处理抵抗噪声。

Roberts算子:

在(i+1/2,j+1/2)处差分

转化为模板即为

对于所有的微分算子而言,若只对|Rxf|进行阈值判决,则选择的是与x方向垂直的边缘;若只对|Ryf|进行阈值判决,则选择的是与y方向垂直的边缘;若选择的是对|Rxf|+|Ryf| 进行判决,则获得一般方向的边缘。

Sobel算子

中心差分,对于水平线和垂直线的四个点权重高

模板为

在实际运用中较多

Prewitt算子

模板为

Kirsch算子

8个模板,对应8个方向,最大值被选出

Robinson算子

规则同上,也是8个模板

lenn原图:

把lenna的图像看成二元函数对应的曲面:

下面是在matlab上的检测效果:(图片如果太小,可以放大浏览器的页面)

1.Robets算子

2.Sobel算子

3.Prewitt算子

4.Kirsch算子

Sobel的代码:

lenna = imread('E:\ImageTest\512\g512_006\lena.pgm');subplot(241)imshow(lenna,[]);title('原图')%画三维曲面图% x = 1:512;% y = 1:512;% [X,Y] = meshgrid(x,y);% Z=double(lenna);% mesh(X,Y,Z);lenna_1 = edge(lenna,'sobel',0.06); subplot(242)imshow(lenna_1,[]);title('Sobel 0.06')lenna_2 = edge(lenna,'sobel',0.09); subplot(243)imshow(lenna_2,[]);title('Sobel 0.09')lenna_3 = edge(lenna,'sobel',0.12); subplot(244)imshow(lenna_3,[]);title('Sobel 0.12')sigma = 0.6;N = 5; %滤波模板大小是(2N+1)×(2N+1) N_row = 2*N+1; gausFilter = fspecial('gaussian',[N_row N_row],sigma); %高斯滤波模板lenna_0=imfilter(lenna,gausFilter,'conv');subplot(245)imshow(lenna_0,[]);title('滤波后')lenna_4 = edge(lenna_0,'sobel',0.06); subplot(246)imshow(lenna_4,[]);title('Sobel 0.06')lenna_5 = edge(lenna_0,'sobel',0.09); subplot(247)imshow(lenna_5,[]);title('Sobel 0.09')lenna_6 = edge(lenna_0,'sobel',0.12); subplot(248)imshow(lenna_6,[]);title('Sobel 0.12')

Kirsch的代码:

clearclcclose allbw1=imread('E:\ImageTest\512\g512_006\lena.pgm');%---------------------------------------------------------------%对图象进行预处理figure(1)imshow(bw1,[])title('原始图象')%对图象进行均值滤波bw2=filter2(fspecial('average',3),bw1);%对图象进行高斯滤波bw3=filter2(fspecial('gaussian'),bw2);%利用小波变换对图象进行降噪处理[thr,sorh,keepapp]=ddencmp('den','wv',bw3);%获得除噪的缺省参数bw4=wdencmp('gbl',bw3,'sym4',2,thr,sorh,keepapp);%图象进行降噪处理%---------------------------------------------------------------------%提取图象边缘t=[0.8 1.0 1.5 2.0 2.5].*10^5 ;%设定阈值bw5=double(bw4); [m,n]=size(bw5); g=zeros(m,n); d=zeros(1,8);%利用Kirsch算子进行边缘提取for i=2:m-1for j=2:n-1d(1) =(5*bw5(i-1,j-1)+5*bw5(i-1,j)+5*bw5(i-1,j+1)-3*bw5(i,j-1)-3*bw5(i,j+1)-3*bw5(i+1,j-1)-3*bw5(i+1,j)-3*bw5(i+1,j+1))^2; d(2) =((-3)*bw5(i-1,j-1)+5*bw5(i-1,j)+5*bw5(i-1,j+1)-3*bw5(i,j-1)+5*bw5(i,j+1)-3*bw5(i+1,j-1)-3*bw5(i+1,j)-3*bw5(i+1,j+1))^2; d(3) =((-3)*bw5(i-1,j-1)-3*bw5(i-1,j)+5*bw5(i-1,j+1)-3*bw5(i,j-1)+5*bw5(i,j+1)-3*bw5(i+1,j-1)-3*bw5(i+1,j)+5*bw5(i+1,j+1))^2; d(4) =((-3)*bw5(i-1,j-1)-3*bw5(i-1,j)-3*bw5(i-1,j+1)-3*bw5(i,j-1)+5*bw5(i,j+1)-3*bw5(i+1,j-1)+5*bw5(i+1,j)+5*bw5(i+1,j+1))^2; d(5) =((-3)*bw5(i-1,j-1)-3*bw5(i-1,j)-3*bw5(i-1,j+1)-3*bw5(i,j-1)-3*bw5(i,j+1)+5*bw5(i+1,j-1)+5*bw5(i+1,j)+5*bw5(i+1,j+1))^2; d(6) =((-3)*bw5(i-1,j-1)-3*bw5(i-1,j)-3*bw5(i-1,j+1)+5*bw5(i,j-1)-3*bw5(i,j+1)+5*bw5(i+1,j-1)+5*bw5(i+1,j)-3*bw5(i+1,j+1))^2; d(7) =(5*bw5(i-1,j-1)-3*bw5(i-1,j)-3*bw5(i-1,j+1)+5*bw5(i,j-1)-3*bw5(i,j+1)+5*bw5(i+1,j-1)-3*bw5(i+1,j)-3*bw5(i+1,j+1))^2; d(8) =(5*bw5(i-1,j-1)+5*bw5(i-1,j)-3*bw5(i-1,j+1)+5*bw5(i,j-1)-3*bw5(i,j+1)-3*bw5(i+1,j-1)-3*bw5(i+1,j)-3*bw5(i+1,j+1))^2;g(i,j) = max(d);endend %显示边缘提取后的图象figure(5)for k=1:5for i=1:mfor j=1:nif g(i,j)>t(k)bw5(i,j)=255; elsebw5(i,j)=0;endendendsubplot(1,5,k)imshow(bw5,[])title(['Kirsch' ' ' num2str(t(k))])end

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。