clear all; close all; clc; Ia=imread('/Users/aa/Desktop/截屏2023-05-31 16.55.11.png'); I=rgb2gray(Ia); [m n]=size(I); I=double(I); w=fspecial('gaussian',[5 5]);%%高斯滤波 I=imfilter(I,w,'replicate'); imshow(uint8(I))%%sobel边缘检测 w=fspecial('sobel'); Iw=imfilter(I,w,'replicate');%求横边缘 w=w'; Ih=imfilter(I,w,'replicate');%求竖边缘 I=sqrt(Iw.^2+Ih.^2);%平方和在开方。 imshow(uint8(I))%%下面是非极大抑制 new_edge=zeros(m,n); for i=2:m-1%避开边缘像素值检测 for j=2:n-1 Mx=Iw(i,j); My=Ih(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*I(i+adds(2),j+adds(1))+(Mx-My)*I(i+adds(4),j+adds(3)); %插值后得到的像素,用此像素和当前像素比较 adds=get_coords(o+pi); %边缘法线另一侧求得的两点坐标,插值需要 M2=My*I(i+adds(2),j+adds(1))+(Mx-My)*I(i+adds(4),j+adds(3)); %另一侧插值得到的像素,同样和当前像素比较 isbigger=(Mx*I(i,j)>M1)*(Mx*I(i,j)>=M2)+(Mx*I(i,j)<M1)*(Mx*I(i,j)<=M2); %如果当前点比两边点都大置1 if isbigger new_edge(i,j)=I(i,j); end end end 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 imshow(new_edge==255)
时间: 2024-01-28 21:03:20 浏览: 87
LDPC-PEG算法构造H矩阵.rar_All Clear_Density Evolution_LDPC_PEG法构造H矩阵_密
5星 · 资源好评率100%
这是一个 MATLAB 代码,实现了常见的图像处理中的边缘检测和滞后阈值处理。代码实现的具体步骤如下:
1. 读入图像,并将其转为灰度图像。
2. 对灰度图像进行高斯滤波,以消除图像噪声。
3. 使用 Sobel 算子求图像的横向和纵向边缘,并计算其平方和,再开方得到图像的梯度。
4. 对梯度图像进行非极大抑制处理,以保留图像中的边缘。
5. 对抑制后的边缘图像进行滞后阈值处理,将较弱的边缘像素点与强的边缘像素点连接起来,形成连续的边缘线。
其中,get_coords(o) 函数是用来获取边缘像素法线两侧的像素点坐标信息的。connect(new_edge,i,j,low) 函数是用来将弱边缘像素与强边缘像素连接起来的递归函数。
这段代码的具体实现细节和参数设置可以根据实际需求进行调整。
阅读全文