边缘检测——利用edge函数

边缘检测——利用edge函数

在这里插入图片描述

  1. Canny边缘检测器
    【g,t】=edge(img,‘canny’,T,sigma)
    其中T为包含个阈值的向量,sigma为高斯平滑的标准差,g为处理后的逻辑图像,t为算法使用的两个阈值
Img=imread('F:\20191214162428.jpg');
I=rgb2gray(Img);
I=tofloat(I);
I2=edge(I,'canny',[0.04,0.1],3);
figure,imshow(I2);
%---------------------------------------------------------------------%
function [out,revertclass] = tofloat(inputimage)

% 类型转换
% 单纯的取 x 用的匿名函数句柄(玩的有点花)
identify = @(x) x;
% 将输入转换为单精度的函数句柄
tosingle = @im2single;

table = {'uint8',tosingle,@im2uint8 

         'uint16',tosingle,@im2uint16 

         'logical',tosingle,@logical

         'double',identify,identify

         'single',identify,identify};
% strcmp(s1,s2),输入字符串的数组可以说任意类型组合
% find 找出其中的真值
classIndex = find(strcmp(class(inputimage),table(:,1)));

if isempty(classIndex)

    error('不支持的图像类型');

end
% 找到对应的转换类型
out = table{classIndex,2}(inputimage);
% 记录对应逆转换类型
revertclass = table{classIndex,3};
end

在这里插入图片描述
2. Sobel边缘检测器
【g,t】=edge(img,‘sobel’,T,dir)
其中T为个阈值,与梯度比较,dir为想要检测的边缘方向,g为处理后的逻辑图像,t为算法使用的阈值

Img=imread('F:\20191214162428.jpg');
I=rgb2gray(Img);
I=tofloat(I);
[g,t]=edge(I,'sobel',0.1);
figure,imshow(g);
%---------------------------------------------------------------------%
function [out,revertclass] = tofloat(inputimage)

% 类型转换
% 单纯的取 x 用的匿名函数句柄(玩的有点花)
identify = @(x) x;
% 将输入转换为单精度的函数句柄
tosingle = @im2single;

table = {'uint8',tosingle,@im2uint8 

         'uint16',tosingle,@im2uint16 

         'logical',tosingle,@logical

         'double',identify,identify

         'single',identify,identify};
% strcmp(s1,s2),输入字符串的数组可以说任意类型组合
% find 找出其中的真值
classIndex = find(strcmp(class(inputimage),table(:,1)));

if isempty(classIndex)

    error('不支持的图像类型');

end
% 找到对应的转换类型
out = table{classIndex,2}(inputimage);
% 记录对应逆转换类型
revertclass = table{classIndex,3};
end

在这里插入图片描述

[g,t]=edge(I,'sobel',0.1,'vertical');

在这里插入图片描述

Img=imread('F:\20191214162428.jpg');
I=rgb2gray(Img);
I=tofloat(I);
w1=[-2 -1 0;-1 0 1;0 1 2];%最强边缘为-45度方向的边缘
w2=[0 1 2;-1 0 1;-2 -1 0];%最强边缘为+45度方向的边缘
I2=imfilter(I,w1,'replicate');
T=0.3*max(abs(I2(:)));
I3=I2>=T;
figure,imshow(I3);
I4=imfilter(I,w2,'replicate');
T2=0.3*max(abs(I4(:)));
I5=I4>=T2;
figure,imshow(I5);
%---------------------------------------------------------------------%
function [out,revertclass] = tofloat(inputimage)

% 类型转换
% 单纯的取 x 用的匿名函数句柄(玩的有点花)
identify = @(x) x;
% 将输入转换为单精度的函数句柄
tosingle = @im2single;

table = {'uint8',tosingle,@im2uint8 

         'uint16',tosingle,@im2uint16 

         'logical',tosingle,@logical

         'double',identify,identify

         'single',identify,identify};
% strcmp(s1,s2),输入字符串的数组可以说任意类型组合
% find 找出其中的真值
classIndex = find(strcmp(class(inputimage),table(:,1)));

if isempty(classIndex)

    error('不支持的图像类型');

end
% 找到对应的转换类型
out = table{classIndex,2}(inputimage);
% 记录对应逆转换类型
revertclass = table{classIndex,3};
end

在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用 MATLAB 手动实现 Canny 边缘检测的代码: % 读取图像 img = imread('lena.bmp'); % 将图像转化为灰度图像 grayImg = rgb2gray(img); % 对灰度图像进行高斯滤波 gaussImg = imgaussfilt(grayImg, 1.5); % 计算图像梯度 [Gx,Gy] = imgradientxy(gaussImg); % 计算梯度的幅值和方向 [Gmag,Gdir] = imgradient(Gx,Gy); % 非极大值抑制 nmsImg = nonmaxsup(Gmag,Gdir); % 双阈值检测 thHi = 0.1 * max(nmsImg(:)); thLo = 0.05 * max(nmsImg(:)); edgeMap = hysthresh(nmsImg, thHi, thLo); % 显示边缘图像 imshow(edgeMap); 以上代码的详细说明: 1. 读取图像:使用 imread 函数读取需要进行边缘检测的图像。 2. 转化为灰度图像:使用 rgb2gray 函数将彩色图像转化为灰度图像(前提是原图为彩色图像)。 3. 高斯滤波:使用 imgaussfilt 函数对灰度图像进行高斯滤波,以平滑图像并降噪。 4. 计算梯度:使用 imgradientxy 函数计算灰度图像的梯度,得到水平方向和垂直方向的梯度值。 5. 计算梯度的幅值和方向:使用 imgradient 函数计算梯度的幅值和方向。 6. 非极大值抑制:使用 nonmaxsup 函数对梯度幅值图像进行非极大值抑制,以保留局部最大值,得到较细的边缘。 7. 双阈值检测:使用 hysthresh 函数对抑制后的梯度幅值图像进行双阈值检测,以确定边缘的强度和弱度,得到二值化的边缘图像。 8. 显示边缘图像:使用 imshow 函数显示生成的边缘图像。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值