matlab canny算子边缘检测函数代码是啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab canny算子边缘检测函数代码是啥?相关的知识,希望对你有一定的参考价值。
参考技术AI = 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;
参考技术Bclc
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算子矩阵:如何实现/获取? (只是过滤器,没有边缘检测器)