两个具有不同灰度值的相邻区域之间总存在边缘,边缘是灰度值不连续的表现。由于边缘是图像上灰度变化最剧烈的地方,传统的边缘检测就是利用了这个特点,对图像各个像素点进行微分或求二阶微分来确定边缘像素点。
以下是一段函数是关于边缘检测的一些算法,希望对你有帮助。。
I=imread('D:\10.jpg'); %读取图像
I1=im2double(I); %将彩图序列变成双精度
I2=rgb2gray(I1); %将彩色图变成灰色图
[thr, sorh, keepapp]=ddencmp('den','wv',I2);
I3=wdencmp('gbl',I2,'sym4',2,thr,sorh,keepapp); %小波除噪
I4=medfilt2(I3,[9 9]); %中值滤波
I5=imresize(I4,0.8,'bicubic'); %图像大小
BW1=edge(I5,'sobel'); %sobel 图像边缘提取
BW2=edge(I5,'roberts'); %roberts 图像边缘提取
BW3=edge(I5,'prewitt'); %prewitt 图像边缘提取
BW4=edge(I5,'log'); %log 图像边缘提取
BW5=edge(I5,'canny'); %canny 图像边缘提取
h=fspecial('gaussian',5); %高斯滤波
BW6=edge(I5,'zerocross',[ ],h); %zerocross 图像边缘提取
figure;
subplot(1,3,1); %图划分为一行三幅图,第一幅图
imshow(I2); %绘图
title(' 原始图像'); %标注
subplot(1,3,2); %第二幅图
imshow(I3);
title(' 消噪后图像');
subplot(1,3,3); %第三幅图
imshow(I4);
title(' 中值滤波图像');
figure;
subplot(1,3,1);
imshow(BW1);
title('Sobel 算子');
subplot(1,3,2);
imshow(BW2);
title('Roberts 算子');
subplot(1,3,3);
imshow(BW3);
title('Prewitt 算子');
figure;
subplot(1,3,1);
imshow(BW4);
title('log 算子');
subplot(1,3,2);
imshow(BW5);
title('Canny 算子');
subplot(1,3,3);
imshow(BW6);
title('Zerocross');