09信计数学实验.docx
《09信计数学实验.docx》由会员分享,可在线阅读,更多相关《09信计数学实验.docx(12页珍藏版)》请在冰点文库上搜索。
09信计数学实验
课程名称:
数学软件与实验成绩:
彩色图像分割
课程号:
090032
课序号:
02
*******
班级:
2009信计
学号:
**********
填写日期:
2012.05.12
彩色图像分割
2009信息与计算科学2009431046
一、实验问题:
任给一张彩色图片,自动完成图像分割。
二、符号说明:
Roberts、Sobel、Prewitt、LOG、Canny:
均为图像边缘检测算法
三、问题分析与建模:
<1>问题分析:
图像分割是一个将一幅数字图像划分成不交叠的、连通的像素集的过程,其中一个对应于背景,其他的则对应于图像中的各个物体。
图像分割的目标是重点根据图像中的物体将图像的像素分类,并提取感兴趣目标图像。
<2>数学建模:
由于彩色图像分割的方法有很多种,难以逐一进行举例,在此我仅就两种方法进行分割,一种是图像的边缘检测方法,另一种是聚类分割算法。
而边缘检测方法又有五种不同的算子,Roberts、Sobel、Prewitt、LOG、Canny,因此我将先对五种算子进行比较,选出最好的一个再借此进行分割。
第二步再详细介绍聚类分析算法。
四、Matlab求解:
<1>边缘检测方法
1、下面我们先将图像边缘检测不同方法比较。
将Roberts、Sobel、Prewitt、LOG、Canny算子等经典图像分割算法对灰度图像分割的结果进行比较。
(1)Matlab代码如下:
clc;
clearall;
closeall;
f=imread('g:
hello.jpg');
figure
(1);
imshow(f);title('原彩色图');
H=rgb2gray(f);
figure
(2);
imshow(H);title('灰度图');
figure(3)
subplot(2,3,1);
imshow(H);title('灰度图');
e=edge(H,'roberts');
subplot(2,3,2);
imshow(e);title('Roberts算子');
a=edge(H,'sobel');
subplot(2,3,3);
imshow(a);title('Sobel算子');
b=edge(H,'prewitt');
subplot(2,3,4);
imshow(b);title('Prewitt算子');
c=edge(H,'log');
subplot(2,3,5);
imshow(c);title('LOG算子');
d=edge(H,'canny');
subplot(2,3,6);
imshow(d);title('Canny算子');
(2)运行结果:
2、比较'roberts','sobel','prewitt','log','canny'算子的检测效果:
Robert算子:
根据任一相互垂直方向上的差分都用来估计梯度,Robert算子采用对角方向相邻像素只差
Sobel算子:
其主要用于边缘检测,在技术上它是以离散型的差分算子,用来运算图像亮度函数的梯度的近似值,缺点是Sobel算子并没有将图像的主题与背景严格地区分开来,即Sobel算子并没有基于图像灰度进行处理,由于Sobel算子并没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。
Prewitt算子:
该算子与Sobel算子类似,只是权值有所变化,但两者实现起来功能还是有差距的,据经验得知Sobel要比Prewitt更能准确检测图像边缘。
log算子:
log算法是一种基于灰度值的二阶导数来进行边缘检测的,通过检测零点来进行边缘检测。
Canny算子:
优点:
使用两种不同的阈值分别检测强、弱边缘,并且仅当弱边缘与强边缘相连时,才将弱边缘包含在输出图像中。
该方法不易受噪声干扰,能够在噪声和边缘间取得较好的平衡,检测到真正的弱边缘。
3、因此我得到edge函数提供的最有效的边缘检测方法是canny方法。
接下来我用此算法来实例分割一个彩图。
1、代码:
Clc;
Clearall;
Closeall;
I=imread('e:
1.jpg');
figure
(1);
imshow(I);title('彩色图');
H=rgb2gray(I);
figure
(2);
imshow(H),title('灰度图');
bw=edge(H,'sobel');
figure(3);
imshow(bw),title('边缘图');
2.运行结果:
<2>聚类分割方法:
1、实验代码:
clc,clear;
I=imread('g:
12074.jpg');
I1=I(:
:
1);
I2=I(:
:
2);
I3=I(:
:
3);
[y,x,z]=size(I);
d1=zeros(y,x);
d2=d1;
myI=double(I);
I0=zeros(y,x);
fori=1:
x
forj=1:
y
d1(j,i)=sqrt((myI(j,i,1)-10)^2+(myI(j,i,2)-10)^2+(myI(j,i,3)-10)^2);
d2(j,i)=sqrt((myI(j,i,1)-180)^2+(myI(j,i,2)-180)^2+(myI(j,i,3)-180)^2);
ifd1(j,i)>=d2(j,i)
I0(j,i)=1;
end
end
end
figure
(1);
subplot(221);imshow(I);title('a原始图像');
subplot(222);imshow(I1);title('bR分量');
subplot(223);imshow(I2);title('cG分量');
subplot(224);imshow(I3);title('dB分量');
figure
(2);
subplot(131);imhist(I1);title('R分量直方图');
subplot(132);imhist(I2);title('G分量直方图');
subplot(133);imhist(I3);title('B分量直方图');
figure(3);
subplot(221);imshow(I0);title('聚类分割后的图像');
RGB2=imadjust(I,[0.60.8],[01],0.8);
figure
(1);
subplot(221);imshow(I);
subplot(222);imshow(RGB2);
I=rgb2gray(RGB2);
figure
(2);
subplot(221);imshow(I);title('a灰度图像');
subplot(222);imhist(I);title('b直方图');
[mn]=size(I);
fori=1:
m%进行灰度变化
forj=1:
n
ifI(i,j)<=10
I(i,j)=0;
elseifI(i,j)<=80
I(i,j)=(255-0)/(80-10)*(I(i,j)-10)+10;
else
I(i,j)=255;
end
end
end
%ÏÔʾ±ä»»ºóµÄ½á¹û
subplot(223);imshow(I);title('c灰度变化');
I=im2double(I);
subplot(224);imhist(I);title('d变换后直方图');
J=imadjust(I,[0.20.8],[01],0.8);
figure(3);
subplot(221);imshow(J);title('a对比度调整');
I2=medfilt2(J,[55]);
subplot(222);imshow(I2);title('b中值滤波');
I3=decorrstretch(I2);
subplot(223);imshow(I3);title('c去相关拉伸');
[mn]=size(I2);
fori=1:
m
forj=1:
n
ifI2(i,j)>0.001&I2(i,j)<0.95I2(i,j)=1;
elseI2(i,j)=0;
end
end
end
subplot(224);imshow(I2);title('d图像二值化');
2、运行结果:
五、总结体会:
通过本次实验,我学会了边缘检测的Matlab实现方法,掌握了Matlab区域操作函数的使用和图像分析和理解的基本方法,并对用'roberts','sobel','prewitt','canny','log'算子对图像进行边缘检测的不同效果有了更直观的认识,而且我还加深了对图像聚类分割的理解。