‘壹’ 数字图像处理的MATLAB边沿提取算法
J7为图像文件
J7=imread(‘舰.jpg’);
BW1=edge(J7,'sobel',0.1);
figure(4),imshow(BW1);title('用sobel算子进行边缘检测,判别值为0.1')
BW2=edge(J7,'roberts',0.25);
figure(5),imshow(BW2);title('用roberts算子进行边缘检测,判别值为0.25')
BW3=edge(J7,'prewitt',0.01);
figure(6),imshow(BW3);title('用prewitt算子进行边缘检测,判别值为0.01')
BW4=edge(J7,'log',0.02);
figure(7),imshow(BW4);title('用log算子进行边缘检测,判别值为0.03')
BW5=edge(J7,'canny',0.25);
figure(8),imshow(BW5);title('用canny算子进行边缘检测,判别值为0.5')
‘贰’ 求数字图像处理边缘检测几种算子的matlab程序
我写几个吧,你最好还是找书,书上边缘处理程序很多
边缘检测一般有几步:
1、滤波
2、增强
3、检测
Roberts算子,Sobel算子,Prewitt算子,Canny算子,Log算子
实例:
i=imread('tupian.jpg');
i1=rgb2gray(i);
bw1=edge(i1,'prewitt',0.04);%也可把prewitt换成canny,log,sobel等。阈值为0.04,可改
figure(1),imshow(i);%原图
figure(2),imshow(i1);%灰度图
figure(3),imshow(bw1);%prewitt边缘提取的图像
‘叁’ matlab不使用内置函数edge等等,如何根据原理直接实现LOG算子
edge不是matlab的内置函数,如何判断可以用
>>type edge 是否能显示其函数内容,如能显示就不是内置函数。
如不用edge函数,可以根据LOG算子(边缘检测算法)来实现edge函数的功能。
实现LOG算子的步骤:(1) 采用二维高斯滤波器平滑滤波; (2) 采用二维拉普算子进行图像增强; (3) 依据二阶导数零交叉进行边缘检测。
‘肆’ 边缘检测的边缘检测
所谓边缘是指其周围像素灰度急剧变化的那些象素的集合,它是图像最基本的特征。边缘存在于目标、背景和区域之间,所以,它是图像分割所依赖的最重要的依据。由于边缘是位置的标志,对灰度的变化不敏感,,因此,边缘也是图像匹配的重要的特征。边缘检测和区域划分是图像分割的两种不同的方法,二者具有相互补充的特点。在边缘检测中,是提取图像中不连续部分的特征,根据闭合的边缘确定区域。而在区域划分中,是把图像分割成特征相同的区域,区域之间的边界就是边缘。由于边缘检测方法不需要将图像逐个像素地分割,因此更适合大图像的分割。 边缘大致可以分为两种,一种是阶跃状边缘,边缘两边像素的灰度值明显不同;另一种为屋顶状边缘,边缘处于灰度值由小到大再到小的变化转折点处。 边缘检测的主要工具是边缘检测模板。我们以一个一维模板为例来考察边缘检测模板是如何作用的。模板的作用是将右邻点的灰度值减去左邻点的灰度值作为该点的灰度值。在灰度相近的区域内,这么做的结果使得该点的灰度值接近于0;而在边缘附近,灰度值有明显的跳变,这么做的结果使得该点的灰度值很大,这样就出现了上面的结果。这种模板就是一种边缘检测器,它在数学上的涵义是一种基于梯度的滤波器,习惯上又称边缘算子。我们知道,梯度是有方向的,和边缘的方向总是垂直的。模板 是水平方向的,而上面那幅图象的边缘恰好是垂直方向的,使用模板 就可以将它检测出来。如果图象的边缘是水平方向的,我们可以用梯度是垂直方向的模板 检测它的边缘。如果图象的边缘是45。方向的,我们可以用模板检测它的边缘。
常用的边缘检测模板有Laplacian算子、Roberts算子、Sobel算子、log(Laplacian-Gauss)算子、Kirsch算子和Prewitt算子等。
‘伍’ log的算法描述
LoG算子也就是 Laplace of Gaussian function(高斯拉普拉斯函数)。常用于数字图像的边缘提取和二值化。LoG 算子源于D.Marr计算视觉理论中提出的边缘提取思想, 即首先对原始图像进行最佳平滑处理, 最大程度地抑制噪声, 再对平滑后的图像求取边缘。
由于噪声点(灰度与周围点相差很大的像素点)对边缘检测有一定的影响,所以效果更好的边缘检测器是LoG算子,也就是Laplacian-Gauss算子。它把的Gauss平滑滤波器和Laplacian锐化滤波器结合了起来,先平滑掉噪声,再进行边缘检测,所以效果会更好。
常用的LoG算子是5×5的模板。
LoG算子 到中心的距离与位置加权系数的关系曲线象墨西哥草帽的剖面,所以LoG算子也叫墨西哥草帽滤波器。
‘陆’ 求用Matlab进行边缘检测
clear all;
close all;
warning off all;
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('canny检测');
‘柒’ 如何计算边缘检测算子的边缘像素、边缘段以及连续性指标如下图
close all
clear all
I=imread('tig.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.2,'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); %绘图
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算子');
在读图片的时候自己改下片名。
‘捌’ 分别利用 Roberts、Prewitt、Sobel 和 Log 边缘检测算子,对原图像进行边缘检测,显示处理前、后的图像。
clear;
fid=fopen('d:\image\Lena.img','r'); %打开无格式文件
data1=(fread(fid,[256,256],'uint8'))';
subplot(2,3,1),imagesc(data1);
colormap(gray);
title('LENA','Color','r');
subplot(2,3,2);
data2=uint8(data1);
R=edge(data2,'Roberts');
imagesc(R);
title('Roberts检测算子');
subplot(2,3,3);
data2=uint8(data1);
Q=edge(data2,'Prewitt');
imagesc(Q);
title('Prewitt检测算子');
subplot(2,3,4);
data2=uint8(data1);
S=edge(data2,'Sobel');
imagesc(S);
title('Sobel检测算子');
subplot(2,3,5);
data2=uint8(data1);
T=edge(data2,'Log');
imagesc(T);
title('Log检测算子');
Matlab中运行过的 正确的!
‘玖’ 什么是边缘检测
两个具有不同灰度值的相邻区域之间总存在边缘,边缘是灰度值不连续的表现。由于边缘是图像上灰度变化最剧烈的地方,传统的边缘检测就是利用了这个特点,对图像各个像素点进行微分或求二阶微分来确定边缘像素点。
以下是一段函数是关于边缘检测的一些算法,希望对你有帮助。。
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,[99]);%中值滤波
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');