边缘检测(Sobel与Prewitt)Matlab实现

Prewitt算子

 为了提高精度,对于每个像素考虑它与周围8个邻域中像素值的加权差,卷积核Gx=[1,0,-1;1,0,-1;1,0,-1];Gy=[-1,-1,-1;0,0,0;1,1,1]

Sobel算子

Sobel算子与Prewitt算子相同,考虑周围8个像素的加权差,但是该算子认为靠近中心像素的点应该给予更高的权重。卷积核Gx=[1,0,-1;2,0,-2;1,0,-1];Gy=[-1,-2,-1;0,0,0;1,2,1]

注:需要注意的就是卷积核与对应窗口中的元素对应相乘然后求新矩阵的所有元素和就行了。

还有阈值需要自己选,根据运行结果找一个最合适的阈值。

Prewitt代码:

​
F=imread('Lena.jpg');
f=double(rgb2gray(F));
[row,col]=size(f);
f2=rgb2gray(F);
imshow(f2);
f1=zeros(row,col);
gx=[1,0,-1;1,0,-1;1,0,-1];
gy=[-1,-1,-1;0,0,0;1,1,1];
for i=2:row-1
    for j=2:col-1
        fx=[f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j-1),f(i+1,j),f(i+1,j+1)];
        fy=[f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j-1),f(i+1,j),f(i+1,j+1)];
        Gx=gx.*fx;
        Gy=gy.*fy;
        A=abs(abs(sum(Gx,'all'))+abs(sum(Gy,'all')));
        if A>=100
            f1(i,j)=255;
        end
    end
end
figure(2);
imshow(f1);

​

运行结果:

 

Sobel:

%Sobel算子
F=imread('Lena.jpg');
f=double(rgb2gray(F));
[row,col]=size(f);
f2=rgb2gray(F);
imshow(f2);
f1=zeros(row,col);
gx=[1,0,-1;2,0,-2;1,0,-1];
gy=[-1,-2,-1;0,0,0;1,2,1];
for i=2:row-1
    for j=2:col-1
        fx=[f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j-1),f(i+1,j),f(i+1,j+1)];
        fy=[f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j-1),f(i+1,j),f(i+1,j+1)];
        Gx=gx.*fx;
        Gy=gy.*fy;
        A=abs(abs(sum(Gx,'all'))+abs(sum(Gy,'all')));
        if A>=100
            f1(i,j)=255;
        end
    end
end
figure(2);
imshow(f1);

运行结果:

 

代码不难,应该都能看懂。

总结:Sobel算子与Prewitt算子检测的结果基本差不多,这两者对灰度渐变低噪声的图像有较好的检测效果。但对复杂噪声图像,Prewitt算子的检测结果更好些。

  • 8
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值