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 15:03:20 浏览: 90
这是一个 MATLAB 代码,实现了常见的图像处理中的边缘检测和滞后阈值处理。代码实现的具体步骤如下:
1. 读入图像,并将其转为灰度图像。
2. 对灰度图像进行高斯滤波,以消除图像噪声。
3. 使用 Sobel 算子求图像的横向和纵向边缘,并计算其平方和,再开方得到图像的梯度。
4. 对梯度图像进行非极大抑制处理,以保留图像中的边缘。
5. 对抑制后的边缘图像进行滞后阈值处理,将较弱的边缘像素点与强的边缘像素点连接起来,形成连续的边缘线。
其中,get_coords(o) 函数是用来获取边缘像素法线两侧的像素点坐标信息的。connect(new_edge,i,j,low) 函数是用来将弱边缘像素与强边缘像素连接起来的递归函数。
这段代码的具体实现细节和参数设置可以根据实际需求进行调整。
相关问题
clear all close all clc %addpath('./two') %addpath('./groundtruth') %rmpath('./two') %rmpath('./groundtruth') I_Out = imread('3.bmp'); I_Mask = imread('img3.jpg'); I_Mask = I_Mask(:,:,1) I_Mask = I_Mask>0; cross_region = I_Out & I_Mask; numerator = sum(sum(cross_region)); denominator = sum(sum(I_Out)) + sum(sum(I_Mask)); DC_rate = 2*numerator/denominator
这段代码是用来计算图像分割中的 Dice Coefficient (DC) 评价指标的。DC是用来衡量分割结果与真实标注之间重合度的指标,其取值范围在[0,1]之间,值越大代表分割结果与真实标注越相似。代码中,首先读取了原图和二值化标注图,然后将标注图的像素值二值化为0和1,接着利用位运算AND操作得到分割结果与标注图的交集区域,分别计算交集区域的像素数和原图与标注图像素数之和,最后通过计算公式得到DC指标的值。
解释代码clc;clear all;close all; img = imread('tire.tif'); figure,imshow(img); img3 = imrotate(img,90); figure,imshow(img3); imwrite(img3,'a3.jpg');
这段代码的作用是:
1. 清空 MATLAB 中所有变量
2. 关闭所有打开的图形窗口
3. 读取名为 'tire.tif' 的图像文件到变量 img 中
4. 显示 img 图像
5. 将 img 图像旋转 90 度,得到新的图像 img3
6. 显示 img3 图像
7. 将 img3 图像保存为名为 'a3.jpg' 的 JPEG 格式文件
其中,imread() 函数用于读取图像文件,imrotate() 函数用于旋转图像,imshow() 函数用于显示图像,imwrite() 函数用于保存图像。
阅读全文