图形图像报告二Word文档下载推荐.docx
《图形图像报告二Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《图形图像报告二Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
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
P(k+1)=count/length;
%用循环统计灰度值为k出现的次数
%再次赋予0进入下一个像素的个数记录
L
ifP(i)~=0
first=i;
%找出第一个概率不连续为0的像素
break
fori=L:
-1:
1
last=i;
%找出最后一个出现概率不连续为0的像素
entropy1=0;
%记录灰度图像的熵值
fori=first:
last
if(P(i)~=0)
entropy1=entropy1+P(i)*log2(1/P(i));
%求取熵值的公式
ep=0;
%用来记录每个灰度级的概率
averF=0;
%记录目标均值的叠加值
averB=0;
%记录背景均值的叠加值
fort=0:
y=t+1;
%好做标记
if(y>
first)&
&
(y<
last)%防止w0(y)和w1(y)取0的情况出现
fork=1:
y
ep=ep+P(k);
%存储选取阈值为t时目标点的概率
w0(y)=ep;
w1(y)=1-w0(y);
%总概率为1
t
ep=averF+(i)*P(i)/w0(y);
%求出目标均值
u0(y)=averF;
%赋予目标均值
fori=t:
averB=averB+(i)*P(i)/w1(y);
%求出背景均值
%用完一次需赋0,以保证进入下一个t的计算的正确性
high=arg
(1);
fori=2:
last-first-3%因为first<
t<
last,所以t可取值的个数为last-first-2
ifhigh<
arg(i)
high=arg(i);
%把大值赋予max(x)
x=i;
%记录大值的下标
t=x-1;
%记录t是从下标1开始的,此时的t就是我们所求的阈值
I0=0;
I1=0;
if(I(i,j)>
=t)
y1(i,j)=255;
I1=I1+1;
%统计目标像素点的个数
else
y1(i,j)=0;
I0=I0+1;
%统计背景像素点的个数
figure,imshow(y1);
%显示二值化图像
●实验结果截图:
Ostu方法实现灰度图像二值化
Psb5.jpg原图
1.3局部阈值法实现二值化原理:
由当前像素灰度值与该像素周围点局部灰度特征来确定像素的阈值。
例如可以将原图像划分为一些不相交的小块,将各块图像的灰度均值作为该部块图像的阈值,在局部上采用上面的整体阈值法。
局部阈值法一般用于识别干扰比较严重、品质较差的图像,相对整体阈值方法有更广泛的应用,但也存在缺点和问题,如实现速度慢、不能保证字符笔画连通性以及容易出现伪影现象(即在背景域受到噪音干扰得到笔画结果)等。
比较典型的局部二值化算法有Bernsen方法、多阈值的梯度强度法、基于纹理图像的方法、最大方差法等。
●Bernsen算法代码:
%Bernsen算法代码:
lena256.bmp'
%读取图像
%显示图像
%计算图像大小,matlab中图像以二维矩阵形式存储
extend(i+1,j+1)=I(i,j);
%把I数组的灰度赋给extend数组
extend(N+2,M+2)=0;
%扩展为N+2,M+2
N+1:
N+2%因只需填充第一行和最后一行,所以i的步长为N+1
forj=2:
M+1
ifi==1
extend(i,j)=extend(i+2,j);
%以第二行做坐标轴,填充第一行
ifi==N+2%以倒数第二行做坐标轴,填充最后一行
extend(i,j)=extend(i-2,j);
end%先填充行
N+2
M+1:
M+2%因只需填充第一列和最后一列,所以j的步长为M+1
ifj==1
extend(i,j)=extend(i,j+2);
%填充第一列
ifj==M+2
extend(i,j)=extend(i,j-2);
%填充最后一列
end%再填充列,填充完毕
%extend=double(extend);
%6.5中必须要强制转化
N+1
high=max(max(extend(i-1:
i+1,j-1:
j+1)));
%求出3*3矩阵的最大值
low=min(min(extend(i-1:
%求出3*3矩阵的最小值
t=0.5*(high+low);
%依据公式算出局部阈值
ifextend(i,j)<
b(i-1,j-1)=0;
%i-1,j-1表示从第一个位置存储
b(i-1,j-1)=255;
%大于阈值的为目标像素
figure,imshow(b);
ifb(i,j)==0
back=(I0/(N*M))*log2(N*M/I0);
%求出背景像素的熵值
fore=(I1/(N*M))*log2(N*M/I1);
%求出目标像素熵值
entropy=back+fore%求出二值化图像熵值
Bernsen算法实现灰度图像二值化
Psb5.jpg原图显示
2、图像的边缘检测
2.1Sobel算子对图像进行边缘检测
Sobel算子的简要原理:
Sobel算子是一阶导数的边缘检测算子,在算法实现过程中,通过3×
3模板作为核与图像中的每个像素点做卷积和运算,然后选取合适的阈值以提取边缘。
采用3×
3邻域可以避免在像素之间内插点上计算梯度。
Sobel算子也是一种梯度幅值,即:
其中的偏导数Sx和Sy可用卷积模板来实现。
●实验源代码:
f=imread('
peppers.png'
f=rgb2gray(f);
f=