MATLAB图像的边缘检测
一、目的
1、理解图像边缘提取的基本概念;
2、熟悉进行边缘提取的基本方法;
3、掌握用MATLAB语言进行图像边缘提取的方法。
二、原理
图像理解是图像处理的一个重要分支,他研究为完成某一任务需要从图像中提取哪些有用的信息,以及如何利用这些信息解释图像。边缘检测技术对于处理数字图像非常重要,因为边缘是所要提取目标和背景的分界线,提取出边缘才能将目标和背景区分开来。在图像中,边界表明一个特征区域的终结和另一个特征区域的开始,边界所分开区域的内部特征或属性是一致的,而不同的区域内部的特征或属性是不同的,边缘检测正是利用物体和背景在某种图像特性上的差异来实现的,这些差异包括灰度,颜色或者纹理特征。边缘检测实际上就是检测图像特征发生变化的位置。代码交流点击https://cjsq.scove.cn/cCLOlp
三、要求
-
读取MATLAB图像处理工具箱中提供的rice.tif这幅图像,并显示。
-
分别用Roberts、Sobel和拉普拉斯高斯算子对图像进行边缘检测。比较三种算子处理的结果。
A=imread('E:� ice.tif');
subplot(2,2,1);imshow(A);
BW1=edge(A,'sobel');
BW2=edge(A,'roberts');
BW3=edge(A,'log');
subplot(2,2,2);imshow(BW1),title('用Roberts算');
subplot(2,2,3);imshow(BW2),title('用Sobel算子');
subplot(2,2,4);imshow(BW3),title('用拉普拉斯高斯算子');
-
用不同方向(‘水平’、‘垂直’、‘水平和垂直’)的Sobel算子对图像进行边缘检测。比较三种情况的结果。
A=imread('E:� ice.tif');
subplot(2,2,1);imshow(A),title('原图像');
BW1=edge(A,'sobel','horizontal');
BW2=edge(A,'sobel','vertical');
BW3=edge(A,'sobel','both');
subplot(2,2,2);imshow(BW1),title('水平方向');
subplot(2,2,3);imshow(BW2),title('垂直方向');
subplot(2,2,4);imshow(BW3),title('水平和垂直两个方向');
-
读取其它图像,重复2,3要求。
A=imread('E:�girl.bmp');
figure(1),subplot(2,2,1);imshow(A),title('原图像');
BW1=edge(A,'sobel');
BW2=edge(A,'roberts');
BW3=edge(A,'log');
figure(1),subplot(2,2,2);imshow(BW1),title('用Roberts算');
figure(1),subplot(2,2,3);imshow(BW2),title('用Sobel算子');
figure(1),subplot(2,2,4);imshow(BW3),title('用拉普拉斯高斯算子');
B=edge(A,'sobel','horizontal');
C=edge(A,'sobel','vertical');
D=edge(A,'sobel','both');
figure(2),subplot(2,2,1);imshow(A),title('原图像');
figure(2),subplot(2,2,2);imshow(BW1),title('水平方向');
figure(2),subplot(2,2,3);imshow(BW2),title('垂直方向');
figure(2),subplot(2,2,4);imshow(BW3),title('水平和垂直两个方向');
5、自编程序,实现边缘检测处理。
[F,MAP]=imread('E:�girl.bmp');
f=double(F);
[m,n]=size(f);
g=zeros(m,n);
for i=2:m-1
for j=2:n-1
DX=(f(i+1,j-1)-f(i-1,j-1))+2*(f(i+1,j)-f(i-1,j))+(f(i+1,j+1)-f(i-1,j+1));
DY=(f(i-1,j+1)-f(i-1,j-1))+2*(f(i,j+1)-f(i,j-1))+(f(i+1,j+1)-f(i+1,j-1));
g(i,j)=round(sqrt(DX*DX+DY*DY));
end
end
G=uint8(g);
subplot(1,2,1), imshow(F,MAP), title('原图像');
subplot(1,2,2), imshow(G,MAP), title('取边缘');
-
图像分割
clear;
I=imread('E:�girl.bmp','bmp');
[x,map]=imread('E:�girl.bmp');
h0=imhist(I);
h=h0';
j=0;k=0;
q0=inf;
for th0=1:size(h,2)
for i=1:size(h,2)
if h(i)<th0
j=j+1;
c1(j)=h(i);
else
k=k+1;
c2(k)=h(i);
end
end
N1=j;
N2=k;
N=N1+N2;
a1=var(c1);
a2=var(c2);
p1=N1/N;
p2=N2/N;
q=p1*a1+p2*a2;
if q<q0
th=th0;
end
q0=q;
j=0;k=0;
end
x1=double(x);
g1=x1;
for i=1:size(x,1)
for j=1:size(x,2)
if x1(i,j)<th
g1(i,j)=0;
else
g1(i,j)=256;
end
end
end
g=uint8(g1);
subplot(1,2,2);imshow(g,map);
subplot(1,2,1);imshow(x,map);