matlab canny算子边缘检测函数代码是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab canny算子边缘检测函数代码是啥?相关的知识,希望对你有一定的参考价值。

参考技术A

I = imread('lena.bmp');                 %%如果是其他类型图像,请先转换为灰度图 

%%没有噪声时的检测结果 

BW_sobel = edge(I,'sobel');

BW_prewitt = edge(I,'prewitt'); 

BW_roberts = edge(I,'roberts'); 

BW_laplace = edge(I,'log');

BW_canny = edge(I,'canny'); figure(1); 

subplot(2,3,1),imshow(I),xlabel('原始图像'); 

subplot(2,3,2),imshow(BW_sobel),xlabel('sobel检测');

subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt检测'); 

subplot(2,3,4),imshow(BW_roberts),xlabel('roberts检测'); 

subplot(2,3,5),imshow(BW_laplace),xlabel('laplace检测');

subplot(2,3,6),imshow(BW_canny),xlabel('canny检测'); 

%%加入高斯噪声(μ=0,σ^2=0.01)检测结果

I_g1 = imnoise(I,'gaussian',0,0.01);

BW_sobel = edge(I_g1,'sobel'); 

BW_prewitt = edge(I_g1,'prewitt'); 

BW_roberts = edge(I_g1,'roberts'); 

BW_laplace = edge(I_g1,'log'); 

BW_canny = edge(I_g1,'canny'); figure(2); 

subplot(2,3,1),imshow(I_g1),xlabel('加入高斯噪声(μ=0,σ^2=0.01)图像');

subplot(2,3,2),imshow(BW_sobel),xlabel('sobel检测'); 

subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt检测'); 

subplot(2,3,4),imshow(BW_roberts),xlabel('roberts检测'); 

subplot(2,3,5),imshow(BW_laplace),xlabel('laplace检测'); 

subplot(2,3,6),imshow(BW_canny),xlabel('canny检测');  

%%加入高斯噪声(μ=0,σ^2=0.02)检测结果

I_g2 = imnoise(I,'gaussian',0,0.02); 

BW_sobel = edge(I_g2,'sobel');

BW_prewitt = edge(I_g2,'prewitt'); 

BW_roberts = edge(I_g2,'roberts'); 

BW_laplace = edge(I_g2,'log');

BW_canny = edge(I_g2,'canny'); figure(3); 

subplot(2,3,1),imshow(I_g2),xlabel('加入高斯噪声(μ=0,σ^2=0.02)图像');

subplot(2,3,2),imshow(BW_sobel),xlabel('sobel检测');

subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt检测'); 

subplot(2,3,4),imshow(BW_roberts),xlabel('roberts检测'); 

subplot(2,3,5),imshow(BW_laplace),xlabel('laplace检测');

subplot(2,3,6),imshow(BW_canny),xlabel('c

一、没有噪声时的检测结果 1 原始图像 

2 Sobel算子边缘检测 3 Prewitt算子边缘检测 4 Roberts算子边缘检测 5 Laplace算子边缘检测 6 Canny算子边缘检测 

二、加入高斯噪声(μ=0,σ^2=0.01)检测结果 1 原始图像 

2 Sobel算子边缘检测 3 Prewitt算子边缘检测 4 Roberts算子边缘检测 5 Laplace算子边缘检测 6 Canny算子边缘检测  

三、加入高斯噪声(μ=0,σ^2=0.02)检测结果 1 原始图像 

2 Sobel算子边缘检测 3 Prewitt算子边缘检测 4 Roberts算子边缘检测 5 Laplace算子边缘检测 6 Canny算子边缘检测   

clear all; close all; 

warning off all;

参考技术B

clc
clear all
close all
I = imread('cameraman.tif');  % 读入图像
imshow(I);title('原图')
BW1 = edge(I,'canny');  % 调用canny函数
figure,imshow(BW1);  % 显示分割后的图像,即梯度图像
title('Canny')

Canny边缘检测算子是JohnF.Canny于1986年开发出来的一个多级边缘检测算法。更为重要的是Canny创立了边缘检测计算理论(Computationaltheoryofedgedetection)解释这项技术如何工作。

MATLAB中的Canny算子矩阵:如何实现/获取? (只是过滤器,没有边缘检测器)

【中文标题】MATLAB中的Canny算子矩阵:如何实现/获取? (只是过滤器,没有边缘检测器)【英文标题】:Canny operator matrix in MATLAB: how to implement/get? (just filter, no edge detector) 【发布时间】:2012-03-16 19:07:16 【问题描述】:

我正在使用MATLAB (2011) 制作一个项目,它使用户可以过滤灰度图像(使用卷积但不寻找边缘)。我知道对于边有 [edge] 函数,而且我知道对于某些运算符(如 sobel),您可以使用 [fspecial] 来获取矩阵。

我找到了一个矩阵(或多个)对应于我需要的每个运算符:sobel、roberts、robinson、Laplacian 等...

然后我以这种方式应用过滤器:

Result_image = conv2(Original_image, matrix_filter);

但我找不到 Canny 运算符的...

我读到 Canny 是在从应用拉普拉斯算子开始的不同步骤中实现的……但是呢?以下步骤是什么?以及如何让矩阵应用于图像?

我正在寻找矩阵,或获取它的方法或至少一个示例来理解“多步骤过程”。

我找到了一个页面,介绍了获取边缘运算符实现的步骤。过滤的步骤是什么? (导数 X,导数 Y,梯度,非极大值抑制,滞后)。该页面是 Canny Edge Detector(作者 Mikel Rodriguez)。

【问题讨论】:

您可以使用图像处理工具箱吗?那里有精明的检测器。 你指的是函数edge('canny')还是别的什么?关键是我不能应用边缘(因为它被要求只过滤灰度图像,而不是过滤它) 是的,如mathworks.fr/help/toolbox/images/ref/edge.html @JoelFalcou 我很欣赏你的回答,但不幸的是我必须在没有边缘的情况下应用过滤器(我知道这很奇怪......但这就是我的项目所要求的)。我找到了一个页面,介绍了获取边缘运算符实现的步骤。你能告诉我过滤的步骤是什么吗? (衍生 X,衍生 Y,梯度,非最大抑制,滞后)。页面为:cs.ucf.edu/~mikel/Research/Edge_Detection.htm 哦,好吧,确实很奇怪。不幸的是,与您可以询问子结果的其他方法相反,canny 不要:/ 【参考方案1】:

正如您所指出的,Canny Edge Detector 是一种算法而不是过滤器。这意味着您无法拥有“Canny”过滤器。

让我们看看算法中涉及的步骤(Wikipedia或OpenCV implementation):

    高斯滤波(使用高斯滤波器) 图像的梯度(使用其他一些边缘过滤器,例如 Sobel 过滤器) 非最大抑制(不涉及过滤器) 阈值处理(不涉及过滤器)

如你所见,Canny 过滤器无处不在,所以恐怕你无法获得这样的过滤器。

【讨论】:

以上是关于matlab canny算子边缘检测函数代码是啥?的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB中的Canny算子矩阵:如何实现/获取? (只是过滤器,没有边缘检测器)

sobel边缘检测优缺点与canny算子的优缺点?

sobel边缘检测优缺点与canny算子的优缺点?

Matlab边缘检测问题

我想知道opencv边缘检测中的sobel,canny算子的数学原理需要去理解吗,还是这直接记住它的功能就好!

图像边缘检测:Canny算子、Prewitt算子和sobel算子