学习之边缘检测sobel,log,canny

边缘检测是图像处理的关键技术,用于识别图像中亮度变化显著的区域。Sobel算子利用3x3模板检测边缘,而LoG算子通过先进行高斯滤波再计算拉普拉斯二阶导数来定位边缘。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     Edge detection is the name for aset of mathematical methods ,which aim atidentifyingpoints ina digital image at which the imagebrightness changessharplyor, more formally,has discontinuities.

    边缘检测是图像处理和计算机视觉中常用的一种算子,其目标是找到图像中亮度变化剧烈的像素点集。在现实世界中,对应于图像中亮度变化剧烈的情况主要有:

(1)深度的不连续(物体处在不同的物平面上)

(2)表面方向的不连续(如正方体的不同的两个面)

(3)物体材料的不同(这样会导致光的反射系数不同)

(4)场景中光照不同(如被树荫投射的地面)

Sobel算子:是一阶导数的边缘检测算子,在算法实现过程中,通过3×3模板,根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。

clear;
sourcePic=imread('5.bmp');%读取原图像
grayPic=mat2gray(sourcePic);%转换成灰度图像
[m,n]=size(grayPic);
newGrayPic=grayPic;%为保留图像的边缘一个像素
sobelNum=0;%经sobel算子计算得到的每个像素的值
sobelThreshold=0.8;%设定阈值

for j=2:m-1
    for k=2:n-1
        sobelNum=abs(grayPic(j-1,k+1)+2*grayPic(j,k+1)+grayPic(j+1,k+1)-grayPic(j-1,k-1)...
            -2*grayPic(j,k-1)-grayPic(j+1,k-1))+abs(grayPic(j-1,k-1)+2*grayPic(j-1,k)+...
            grayPic(j-1,k+1)-grayPic(j+1,k-1)-2*grayPic(j+1,k)-grayPic(j+1,k+1));
        if(sobelNum>sobelThreshold)
            newGrayPic(j,k)=255;
        else
            newGrayPic(j,k)=0;
        end
    end
end
figure,imshow(newGrayPic);
title('Sobel算子的处理结果')

LoG算子:是David Courtnay MarrEllen Hildreth共同提出的。因此,也称为边缘检测算法或Marr & Hildreth算子。该算法首先对图像做高斯滤波,然后再求其拉普拉斯(Laplacian)二阶导数。

 

%log算法
clear all;close all;clc;
img=imread('7.bmp');
imshow(img);

mask=[0,0,-1,0,0;
      0,-1,-2,-1,0;
      -1,-2,16,-2,-1;
      0,-1,-2,-1,0;
      0,0,-1,0,0];
  dx=imfilter(img,mask);
  grad=mat2gray(dx);
    figure,imshow(grad);
  BW=im2bw(grad,0.58);%用阈值(threshold)变换法把灰度图像(grayscale image)转换成二值图像
figure,imshow(BW),title('log');
Canny算法步骤
1 用高斯滤波器平滑图象;
2 用一阶偏导的有限差分来计算梯度的幅值和方向;
3 对梯度幅值进行非极大值抑制;
4 用双阈值算法检测和连接边缘。

%canny算法
clear all;
close all;
clc;

img=imread('6.jpg');
imshow(img);
[m n]=size(img);
img=double(img);

%% 高斯滤波
w=fspecial('gaussian',[5 5]);
img=imfilter(img,w,'replicate');
figure,imshow(uint8(img))

%% sobel边缘检测
w=fspecial('sobel');
img_w=imfilter(img,w,'replicate');  % 求横边缘
w=w';                               %矩阵转置
img_h=imfilter(img,w,'replicate');   %求竖边缘
img=sqrt(img_w.^2+img_h.^2);
figure,imshow(uint8(img));title('sobel');

%% 进行非极大抑制
new_edge=zeros(m,n);
for i=2:m-1
    for j=2:n-1
        Mx=img_w(i,j);  
        My=img_h(i,j);
        if My~=0      %不等于
            o=atan(Mx/My);%边缘的法线弧度
        elseif My==0 && Mx>0
            o=pi/2;
        else 
            o=-pi/2;
        end
        %Mx处用My和img进行插值
        adds=get_coords(o);
        M1=My*img(i+adds(2),j+adds(1))+(Mx-My)*img(i+adds(4),j+adds(3)); %插值后得到的像素,用此像素和当前像素比较 
        adds=get_coords(o+pi);    %边缘法线另一侧求得的两点坐标,插值需要
        M2=My*img(i+adds(2),j+adds(1))+(Mx-My)*img(i+adds(4),j+adds(3));%另一侧插值得到的像素,同样和当前像素比较
        isbigger=(Mx*img(i,j)>M1)*(Mx*img(i,j)>=M2)+(Mx*img(i,j)<M1)*(Mx*img(i,j)<=M2);%如果当前点比两边点都大
        if isbigger
            new_edge(i,j)=img(i,j);
        end
    end
end
figure,imshow(uint8(new_edge))

   %%下面是滞后阈值处理
up=120;     %上阈值
low=100;    %下阈值
set(0,'RecursionLimit',10000);  %设置最大递归深度
for i=1:m
    for j=1:n
      if new_edge(i,j)>up &&new_edge(i,j)~=255  %判断上阈值
            new_edge(i,j)=255;
            new_edge=connect(new_edge,i,j,low);
      end
    end
end
figure;
imshow(new_edge==255) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值