当前位置:首页 » 操作系统 » canny算法matlab

canny算法matlab

发布时间: 2023-03-24 04:24:16

Ⅰ matlab二值图像截取

可以使用bwperim()函数进行轮廓提取,具体代码如下:

%读取原图
im = imread( filepath );
imshow(im);
title('原图');

% 转二值图像
bw = im2bw( im );

%轮廓提取
contour = bwperim(bw);
figure
imshow(contour);
title('轮廓')

原图和所提取的模旁渣轮廓分别如图1和图2所示。

图6canny算子、Laplacian算子检测结果

3.边缘检测结果比较

Roberts算子检测方法对具有陡峭的低噪声的图像处理效果较好,但是利用roberts算子提取边缘的结果是边缘比较粗,因此边缘的定位不是很准确。

Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素。

Prewitt算子检测方法对灰度渐变和噪声较多的图像处理效果较好。但边缘较宽,而且间断点多。

Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。

Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。

参考文献

[1]赵春晖.现代图像处理技术及Matlab实现[M].北京:人民邮电出版社,2001.

[2]阮秋琦.数字图像处理学[M].北京:电子工业出版社,2001.

[3]何斌.数字图像处理[M].北京:人民邮电出版社,2001

I=imread('lena.bmp');%提取图像

BW1=edge(I,'sobel');%用SOBEL算子进行边缘检测

BW2=edge(I,'roberts');%用Roberts算子进行边缘检测

BW3=edge(I,'prewitt');%用prewitt算子进行边缘检测

BW4=edge(I,'log');%用log算子进行边缘检测

BW5=edge(I,'canny');%用canny算子进行边缘检测

h=fspecial('gaussian’,5);

BW6=edge(I,’canny’);

subplot(2,3,1),imshow(BW1);

title(‘sobeledgecheck’);

subplot(2,3,2),imshow(BW2);

title(‘sobeledgecheck’);

subplot(2,3,3),imshow(BW3);

title(‘prewittedgecheck’);

subplot(2,3,4),imshow(BW4);

title(‘logedgecheck’);

subplot(2,3,5),imshow(BW5);

title(‘cannyedgecheck’);

subplot(2,3,6),imshow(BW6);

title(‘gasussian&cannyedgecheck’);%此为用高斯滤波后Canny算子边缘检测结果

(注意:代码中有一些标点是中文模式,若输入代码后标点显示红色,则为中文标点,改回来就行了)

Ⅱ 为什么opencv的canny函数检测边缘的效果和matlab的不同

可以明显的看出matlab的边缘更为细腻。
首先回顾一下传统的canny算源含法的主要步骤:
1、使用sobel差分算子求出灰度图像的x和y方向导数;
2、求出图像各点梯度大小及其方向;
3、设置高低两个阈值,梯度大于高阈值为强边像素点,大于低阈值为潜在可能是较弱的边缘点;
4、在经过一次筛选剩下的强边缘点中沿着雹举笑梯度方向进行非极大值抑制;
5、顺着二次筛选后的强边点寻找邻近的弱答烂边点得到最终的边缘。
opencv和matlab都基本按照以上步骤得到各自的canny 函数,但一般来说处理之前都先对图像进行模糊平滑,这样得到的效果更好。opencv更注重实时性,所以连平滑都作为可选项放在函数外,而matlab则 更注重质量,除了加入平滑操作外,还有其他一系列的优化操作,以下逐项比较。
1、模糊平滑
这一项其实对生成的边缘效果影响十分大,平滑的越流畅则生成的边缘越圆滑,一 般使用高斯低通滤波;那么滤波器的大小以及高斯分布的方差是两个关键的参数,通过实验确定取什么值最优,但一般用5×5和方差为2的就可以 了,opencv的cvSmooth函数可以进行平滑,一般都是使用输入和输出都是8位深的图像,而matlab是把图像转换为浮点类型后进行平滑操作, 这样一来从精度上说matlab就已经更胜一筹了,因为这直接决定后面的求导运算得到的两个方向导数的精度。
2、梯度
在sobel的运用上两者是一致的,但是求梯度的方向的算法两者是截然不同 的,但本质一样,效果经过笔者测试基本相同。在梯度的大小方面,opencv提供了欧式距离和哈密顿距离两种度量方式,前者是平方和后开方,后者是直接绝 对值的加和,opencv默认使用后者,我们知道((x2+y2)/2)1/2>=(|x|+|y|)/2,以及|x|+|y|>=(x2+y2)1/2 所以理论上使用哈密顿距离也基本符合真实数值,但总归是有精度上的差别,这也是为什么有人说opencv的canny不如matlab好的第二个原因了,在cv.h里面可以通过修改CV_CANNY_L2_GRADIENT来进行切换。
3、阈值
这里的阈值是梯度大小是否能够通过的开关,opencv的阈值都采用手工设置的方式,而matlab是把所有点的强度作出直方图,保留一定百分比的强边缘,这个步骤的差别不会影响结果的质量,但是在速度上当然会有差别,这是速度和方便程度的矛盾。
4、薄边效果
经过非极大值抑制后的边缘基本上是一到两个像素点的宽度,最终希望得到一个线 宽的边缘,opencv只是通过简单的判断来防止并行或者并列出现两个强边像素,这种简单的薄边手法会导致边缘的断裂,而matlab采用了Louisa Lam, Seong-Whan Lee, and Ching Y. Wuen, "Thinning Methodologies-A Comprehensive Survey," IEEE TrPAMI, vol. 14, no. 9, pp. 869-885, 1992. 这边文章的方法进行两次薄边处理,效果相当好,所得的边缘十分圆滑。
综上所述,要想opencv的效果和matlab的差不多就必须在平 滑上下功夫,梯度的大小要用欧式距离度量,另外要加入matlab的薄边算法,这样一来处理时间大概会增加一倍,但也基本可以满足实时处理。另外在一般视 觉应用中可以把算法修改为一个阈值,去掉强弱边连接这一步骤以提高速度.

Ⅲ 在matlab软件中用拉普拉斯算子和canny算子进行边缘检测的程序

i=imread('1.jpg'); 读入弊含图像1
i1=rgb2gray(i); 把rgb图像转换成灰度图前尘像
bw1=edge(i1,'log',0.07); 做阈值为0.07的高斯—拉普拉斯(Log)算法
figure(3),imshow(i); 显示原图
figure(4),imshow(bw1); 显示高斯—拉普拉租悔笑斯(Log)边缘检测后的图

Ⅳ matlab canny算子边缘检测函数代码是什么

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

Ⅳ matlab 自带的canny函数

Canny Method

BW = edge(I,'canny') specifies the Canny method.

BW = edge(I,'canny',thresh) specifies sensitivity thresholds for the Canny method. thresh is a two-element vector in which the first element is the low threshold, and the second element is the high threshold. If you specify a scalar for thresh, this scalar value is used for the high threshold and 0.4*thresh is used for the low threshold. If you do not specify thresh, or if thresh is empty ([]), edge chooses low and high values automatically. The value for thresh is relative to the highest value of the gradient magnitude of the imag

Ⅵ 基于matlab边缘提取的几种方法的比较

I=imread('lena.bmp');% 提取图像
BW1=edge(I,'sobel'); %用SOBEL算子进行边缘检测
BW2=edge(I,'roberts');%用Roberts算子进行边缘检测
BW3=edge(I,'prewitt'); %用prewitt算子进行边缘脊袭唤检测
BW4=edge(I,'log'); %用log算子进行边缘检测
BW5=edge(I,'canny'); %用canny算子进行边缘检测
h=fspecial('gaussian’,5);
BW6=edge(I,’canny’);
subplot(2,3,1), imshow(BW1);
title(‘sobel edge check’);
subplot(2,3,2), imshow(BW2);
title(‘sobel edge check’);
subplot(2,3,3), imshow(BW3);
title(‘prewitt edge check’);
subplot(2,3,4), imshow(BW4);
title(‘log edge check’);
subplot(2,3,5), imshow(BW5);
title(‘canny edge check’);
subplot(2,3,6), imshow(BW6);
title(‘gasussian&canny edge check’);%此为用高斯滤波后Canny算子边缘检测结果
(注意:代码中禅梁有一些标点是中文模式,若输入代码后标点显示红色樱凯,则为中文标点,改回来就行了)

Ⅶ MATLAB 图像处理

下边的程序是我自己编的希望能给你参考。其中的imhist是显示直方图的,如果你不用可以直接删去。我已经将程序里的图片地址写成了d:\blood.jpg你将图片存在d盘,标明名字blood,注意类型为jpg即可。
1.1
显示更加清楚可以用直方图均衡化。
程序1:
%直方图均衡化,令对比度自适应直方图均衡化
I=imread('你的图片(注意要用英文的。比如'd:\blood.jpg')');
I=rgb2gray(I);
J=adapthisteq(I);
subplot(221),imshow(I)
title('原图');
subplot(222),imshow(J)
title('直方图均衡化后的结果')
subplot(223),imhist(I,64)
title('原春悔樱图的直方图');
subplot(224),imhist(J,64)
title('直方图均衡化后的结果的直方图');
1.2 让图片看前拆清楚还可以让图片变亮一些(因为你这图看起来很暗)。
程序2:
I=imread('d:\blood.jpg');
J=imadjust(I,[],[0.5 1]);
%通过修改highout值使图片变亮
K=imadjust(I,[],[],0.3);
%通过修改r(描述I,J关系曲线形状)
subplot(231),imshow(I);
title('原图');
subplot(232),imshow(J);
title('修改highout');
subplot(233),imshow(K);
title('修改r值')
subplot(234),imhist(I,64);
title('原图的直方图');
subplot(235),imhist(J,64);
title('修改highout直方图');
subplot(236),imhist(K,64);
title('修改r值直方图');
2.1 边缘检测的有很多算子,你自己试试看哪个算子比较好。
程序3:
I=imread('d:\blood.jpg');
figure,imshow(I);%显示原图
f= rgb2gray(I);%转化为灰度图
BW1=edge(f,'Roberts');%使用roberts算子进行边缘提取
figure;imshow(BW1); %显示边缘提取结果
BW2=edge(f,'sobel');%使用sobel算子进行边缘提取
figure;imshow(BW2);%显示边缘提取结果

BW3=edge(f,'prewitt');%使用prewitt算子进行边缘提取
figure;imshow(BW3);%显示边缘扒丛提取结果

BW4=edge(f,'log');%使用log算子进行边缘提取
figure;imshow(BW4);%显示边缘提取结果

BW5=edge(f,'canny');%使用canny算子进行边缘提取
figure;imshow(BW4);%显示边缘提取结果

Ⅷ 求助Matlab计算canny算子阈值的方法

解法1:solve('x^2-10') %用氏和于一般的方程,也包括指数、余弦等码核袜复杂方程
解法2:roots([1 0 -10]) %用于迟激多项式方程
解法3:fzero采用零点,是极限的求法
f=@(x) x^2-10;
y3_1=fzero(f,[0,5]),y3_2=fzero(f,[-5,0])

Ⅸ 基于matlab的边缘检测的robert算子的算法怎么写

matlab本身有库函数的。直接调用啊
VC代码:
void BianYuanJianCeDib::Robert()
{
LPBYTE p_data; //原图数据区指针
int wide,height; //原图长、宽
int i,j; //循环变量
int pixel[4]; //Robert算子
p_data=this->GetData ();
wide=this->GetWidth ();
height=this->GetHeight ();
LPBYTE temp=new BYTE[wide*height]; //新图像缓冲区
//设定新图像初值为255
memset(temp,255, wide*height);
//由于使用2*2的模板,为防止越界,所以不处理最下边和最右边的两列像素
for(j=0;j<height-1;j++)
for(i=0;i<wide-1;i++)
{
//生成Robert算子
pixel[0]=p_data[j*wide+i];
pixel[1]=p_data[j*wide+i+1];
pixel[2]=p_data[(j+1)*wide+i];
pixel[3]=p_data[(j+1)*wide+i+1];
//处理当前像素
temp[j*wide+i]=(int)sqrt((pixel[0]-pixel[3])*(pixel[0]-pixel[3])
+(pixel[1]-pixel[2])*(pixel[1]-pixel[2]));
}
//将缓冲区中的数据复制到原图数据区
memcpy(p_data, temp,wide*height);
//删除缓冲区
delete temp;
}

Ⅹ 需要一段用Canny算子实现图像边缘检测的MATLAB程序,拜托高手们帮帮忙,很急啊!

M=imread('');%读入你的图片
BW = edge(I,'canny');%边缘检测函数
imshow(BW) %显示检测后的图象

热点内容
如何配置vlan并添加端口 发布:2024-05-03 23:37:53 浏览:724
中国电信无线密码怎么修改 发布:2024-05-03 23:37:51 浏览:115
源脚本修改器 发布:2024-05-03 23:36:26 浏览:192
有哪些低配置游戏像王者荣耀 发布:2024-05-03 22:27:11 浏览:244
gp数据库库 发布:2024-05-03 22:12:43 浏览:874
压缩点点 发布:2024-05-03 22:12:33 浏览:381
有哪些编程比赛 发布:2024-05-03 22:03:45 浏览:264
怎么根据配置调整游戏分辨率 发布:2024-05-03 22:02:50 浏览:78
小鸟酱265g资源密码多少啊 发布:2024-05-03 21:32:08 浏览:653
三国战纪游戏华为帐号密码是多少 发布:2024-05-03 21:22:54 浏览:950