图形图像报告二.docx
《图形图像报告二.docx》由会员分享,可在线阅读,更多相关《图形图像报告二.docx(15页珍藏版)》请在冰点文库上搜索。
图形图像报告二
昆明理工大学信息工程与自动化学院学生实验报告
(2011—2012学年第二学期)
课程名称:
图形图像基础开课实验室:
2012年5月22日
年级、专业、班
学号
姓名
成绩
实验项目名称
图像分割
指导教师
教师评语
教师签名:
年月日
一、实验目的及内容
目的:
掌握图像分割的基本原理及应用
内容:
1.通过全局阈值及局部阈值实现灰度图像二值化;
2.分别用Sobel算子和Canny算子对图像进行边缘检测;
3.通过Hough检测图像中的直线。
二、实验要求
1.描述图像分割的概念并解释各种方法的原理。
2.程序结构清晰,运行结果正确。
3.描述上述程序的设计、实现和结果,并对结果进行分析。
三、实验环境
Windows7、MATLAB7.10.0(R2010a)
四、实验原理及实现(包含过程及解析)
1、图像二值化
1.1图像二值化简要原理及意义:
图像的二值化处理就是将图像上的点的灰度置为0或255,也就是使整个图像呈现出明显的黑白效果。
即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。
图像二值化是指用灰度变换来研究灰度图像的一种常用方法,即设定某一阈值将灰度图像的像素分成大于阈值的像素群和小于阈值的像素群两部分。
例如输人灰度图像函数为f(x,y),输出二值图像函数为g(x,y),则有公式:
阈值(threshold)是把目标和背景区分开的标尺,选取适当的阈值就是既要尽可能保存图像信息,又要尽可能减少背景和噪声的干扰,这是选择阈值的原则。
在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素的值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。
二值图像在图像分析中应用非常广泛,二值图像就是指只有两个灰度级的图像,二值图像具有存储空间小,处理速度快,可以方便地对图像进行布尔逻辑运算等特点。
更重要的是,在二值图像的基础上,还可以进一步对图像处理,获得该图像的一些几何特征或者其他更多特征。
1.2全局阈值法实现二值化原理:
全局阈值法是指在二值化过程中只使用一个全局阈值T的方法。
它将图像的每个像素的灰度值与T进行比较,若大于T,则取为前景色(白色);否则,取为背景色。
根据文本图像的直方图或灰度空间分布确定一个阈值,以此实现灰度文本图像到二值图像的转化。
其中全局阈值法又可分为基于点的阈值法和基于区域的阈值法。
阈值分割法的结果很大程度上依赖于对阈值的选择,因此该方法的关键是如何选择合适的阈值。
典型的全局阈值方法包括Otsu方法、最大熵方法等。
全局阈值法算法简单,对于目标和背景明显分离、直方图分布呈双峰的图像效果良好,但对于由于光照不均匀、噪声干扰较大等原因使直方图分布不呈双峰的图像,二值化效果明显变差。
●Ostu算法源代码:
%Otsu算法代码:
I=imread('psb5.jpg');%读取图像
imshow(I);
[N,M]=size(I);%用N,M分别存储图像数组的行数和列数
length=N*M;%取得图像数组的像素点个数
L=256;%设定图像的灰度为256
count=0;%用来记录出现灰度值相同的个数
fork=0:
L-1%图像灰度之为0-255
fori=1:
N
forj=1:
M
ifI(i,j)==k
count=count+1;
end
end
end
P(k+1)=count/length;%用循环统计灰度值为k出现的次数
count=0;%再次赋予0进入下一个像素的个数记录
end
fori=1:
L
ifP(i)~=0
first=i;%找出第一个概率不连续为0的像素
break
end
end
fori=L:
-1:
1
ifP(i)~=0
last=i;%找出最后一个出现概率不连续为0的像素
break
end
end
entropy1=0;%记录灰度图像的熵值
fori=first:
last
if(P(i)~=0)
entropy1=entropy1+P(i)*log2(1/P(i));%求取熵值的公式
end
end
ep=0;%用来记录每个灰度级的概率
averF=0;%记录目标均值的叠加值
averB=0;%记录背景均值的叠加值
fort=0:
L
y=t+1;%好做标记
if(y>first)&&(yfork=1:
y
ep=ep+P(k);%存储选取阈值为t时目标点的概率
end
w0(y)=ep;
w1(y)=1-w0(y);%总概率为1
fori=1:
t
ep=averF+(i)*P(i)/w0(y);%求出目标均值
end
u0(y)=averF;%赋予目标均值
fori=t:
L
averB=averB+(i)*P(i)/w1(y);%求出背景均值
end
ep=0;
averF=0;
averB=0;%用完一次需赋0,以保证进入下一个t的计算的正确性
end
high=arg
(1);
fori=2:
last-first-3%因为firstifhighhigh=arg(i);%把大值赋予max(x)
x=i;%记录大值的下标
end
end
t=x-1;%记录t是从下标1开始的,此时的t就是我们所求的阈值
I0=0;
I1=0;
fori=1:
N
forj=1:
M
if(I(i,j)>=t)
y1(i,j)=255;
I1=I1+1;%统计目标像素点的个数
else
y1(i,j)=0;
I0=I0+1;%统计背景像素点的个数
end
end
end
figure,imshow(y1);%显示二值化图像
●实验结果截图:
Ostu方法实现灰度图像二值化
Psb5.jpg原图
1.3局部阈值法实现二值化原理:
由当前像素灰度值与该像素周围点局部灰度特征来确定像素的阈值。
例如可以将原图像划分为一些不相交的小块,将各块图像的灰度均值作为该部块图像的阈值,在局部上采用上面的整体阈值法。
局部阈值法一般用于识别干扰比较严重、品质较差的图像,相对整体阈值方法有更广泛的应用,但也存在缺点和问题,如实现速度慢、不能保证字符笔画连通性以及容易出现伪影现象(即在背景域受到噪音干扰得到笔画结果)等。
比较典型的局部二值化算法有Bernsen方法、多阈值的梯度强度法、基于纹理图像的方法、最大方差法等。
●Bernsen算法代码:
%Bernsen算法代码:
I=imread('lena256.bmp');%读取图像
imshow(I);%显示图像
[N,M]=size(I);%计算图像大小,matlab中图像以二维矩阵形式存储
fori=1:
N
forj=1:
M
extend(i+1,j+1)=I(i,j);%把I数组的灰度赋给extend数组
end
end
extend(N+2,M+2)=0;%扩展为N+2,M+2
fori=1:
N+1:
N+2%因只需填充第一行和最后一行,所以i的步长为N+1
forj=2:
M+1
ifi==1
extend(i,j)=extend(i+2,j);%以第二行做坐标轴,填充第一行
end
ifi==N+2%以倒数第二行做坐标轴,填充最后一行
extend(i,j)=extend(i-2,j);
end%先填充行
end
end
fori=1:
N+2
forj=1:
M+1:
M+2%因只需填充第一列和最后一列,所以j的步长为M+1
ifj==1
extend(i,j)=extend(i,j+2);%填充第一列
end
ifj==M+2
extend(i,j)=extend(i,j-2);%填充最后一列
end
end
end%再填充列,填充完毕
%extend=double(extend);%6.5中必须要强制转化
fori=2:
N+1
forj=2:
M+1
high=max(max(extend(i-1:
i+1,j-1:
j+1)));%求出3*3矩阵的最大值
low=min(min(extend(i-1:
i+1,j-1:
j+1)));%求出3*3矩阵的最小值
t=0.5*(high+low);%依据公式算出局部阈值
ifextend(i,j)b(i-1,j-1)=0;%i-1,j-1表示从第一个位置存储
else
b(i-1,j-1)=255;%大于阈值的为目标像素
end
end
end
figure,imshow(b);
I0=0;
I1=0;
fori=1:
N
forj=1:
M
ifb(i,j)==0
I0=I0+1;
else
I1=I1+1;
end
end
end
back=(I0/(N*M))*log2(N*M/I0);%求出背景像素的熵值
fore=(I1/(N*M))*log2(N*M/I1);%求出目标像素熵值
entropy=back+fore%求出二值化图像熵值
%extend=double(extend);%6.5中必须要强制转化
fori=2:
N+1
forj=2:
M+1
high=max(max(extend(i-1:
i+1,j-1:
j+1)));%求出3*3矩阵的最大值
low=min(min(extend(i-1:
i+1,j-1:
j+1)));%求出3*3矩阵的最小值
t=0.5*(high+low);%依据公式算出局部阈值
ifextend(i,j)b(i-1,j-1)=0;%i-1,j-1表示从第一个位置存储
else
b(i-1,j-1)=255;%大于阈值的为目标像素
end
end
end
figure,imshow(b);
I0=0;
I1=0;
fori=1:
N
forj=1:
M
ifb(i,j)==0
I0=I0+1;
else
I1=I1+1;
end
end
end
back=(I0/(N*M))*log2(N*M/I0);%求出背景像素的熵值
fore=(I1/(N*M))*log2(N*M/I1);%求出目标像素熵值
entropy=back+fore%求出二值化图像熵值
●实验结果截图:
Psb5.jpg原图显示
Bernsen算法实现灰度图像二值化
2、图像的边缘检测
2.1Sobel算子对图像进行边缘检测
Sobel算子的简要原理:
Sobel算子是一阶导数的边缘检测算子,在算法实现过程中,通过3×3模板作为核与图像中的每个像素点做卷积和运算,然后选取合适的阈值以提取边缘。
采用3×3邻域可以避免在像素之间内插点上计算梯度。
Sobel算子也是一种梯度幅值,即:
其中的偏导数Sx和Sy可用卷积模板来实现。
●实验源代码:
f=imread('peppers.png');
f=rgb2gray(f);
f=im2double(f);
figure,imshow(f),title('原始图像');
[SFSTThreshold]=edge(f,'sobel','horizontal');
figure,imshow(SFST),title('水平图像边缘检测');
[VSFATThreshold]=edge(f,'sobel','vertical');
figure,imshow(VSFAT),title('垂直图像边缘检测');
s45=[-2-10;-101;012];
SFST45=imfilter(f,s45,'replicate');
SFST45=SFST45>=Threshold;
figure,imshow(SFST45),title('45度交图像边缘检测');
●实验结果截图:
2.2Canny算子对图像进行边缘检测
●实验源代码:
%sobel算子和canny边缘检测
I=imread('tire.tif');
imshow(I)
title('原始图像');
BW=edge(I,'sobel');
figure,imshow(BW)
title('soble算子分割结果');
BW2=edge(I,'canny');
figure,imshow(BW2)
title('canny算子分割结果');
●实验结果截图:
3、Hough检测直线
Hought变换简要原理:
Hough变换是一种利用图像的全局特征将特定形状的边缘像素连接起来,形成连续平滑边缘的一种方法。
它通过将源图像上的点映射到用于累加的参数空间,实现对已知解析式曲线的识别。
Hough变换常用于对图像中的直线和圆进行识别。
●实验源代码:
●实验结果截图:
五、实验结果、分析和结论
实验通过二值化、边缘检测和直线检测的形式对图像实现了图像的分割,实验中运用的方法都是一些经典算法,在生活中都有广泛的运用,比如用canny算子来分割识别汽车车牌号。
通过实验,抽象的知识变得简单容易理解,也掌握了一些图像分割的基本技术。