数学形态学图像处理.docx
《数学形态学图像处理.docx》由会员分享,可在线阅读,更多相关《数学形态学图像处理.docx(41页珍藏版)》请在冰点文库上搜索。
数学形态学图像处理
*******本科学生毕业设计
—数学形态学图像处理
学生:
******
学号:
********
指导教师:
*******
专业:
*****
*****
二零一二年六月
中文摘要
数学形态学对图像的处理具有直观上的简明性和数学上的严谨性,在定量描述图像的形态特征上具有独特的优势,为基于形状细节进行图像处理提供了强有力的手段。
建立在集合理论基础上的数学形态学,主要通过选择相应的结构元素采用膨胀、腐蚀、开启、闭合4种基本运算的组合来处理图像。
数学形态学在图像处理中的应用广泛,有许多实用的算法,但在每种算法中结构元素的选取都是一个重要的问题。
本课题旨在以数学形态学为基础,根据其基本算法膨胀、腐蚀、开运算与闭运算,基于VC++软件设计一个程序,观察其效果,评价其能力,弥补其缺陷,为多媒体智能软件系统提供有效的工具。
本文介绍了数学形态学的基本运算在图像处理中的主要应用,用集合理论描述图像和图像变换,通过图像各部分之间的关系来说明目标的结构特点。
最后对数学形态学今后的研究、发展进行了展望。
关键词:
膨胀;腐蚀;数学形态学,图像处理
ABSTRACT
Mathematicalmorphologyimageprocessingwiththeintuitivesimplicityandmathematicalrigor,hasuniqueadvantagesinthequantitativedescriptionoftheimageonthemorphologicalcharacteristics,andprovidesapowerfulmeansforthedetailsoftheshape-basedimageprocessing.Insettheorybasedonmathematicalmorphology,mainlyusedbyselectingtheappropriatestructuralelementsofexpansion,corrosion,open,closedcombinationoffourkindsofbasicoperationstohandleimages.Thewideapplicationofmathematicalmorphologyinimageprocessing,therearemanypracticalalgorithm,buttheselectionofthestructuralelementsineachalgorithmisanimportantissue.
Thissubjectisdesignedbasedonmathematicalmorphology,accordingtothebasicalgorithmexpansion,corrosion,openingoperationandclosingoperation,basedonVC++softwaredesignaprogramtoobserveitseffects,toevaluatetheabilitytocompensateforitsshortcomings,multimediaintelligentsoftwaresystemeffectivetool.
Thisarticledescribesthemainapplicationsofthebasicoperationsofmathematicalmorphologyinimageprocessing,andsettheorytodescribetheimageandtheimagetransformation,therelationshipbetweenthevariouspartsoftheimagetoillustratethestructuralcharacteristicsofthetarget.Finally,mathematicalmorphologyfutureresearch,developmentprospect.
Keywords:
dilation,erosion,mathematicalmorphology,imageprocessing
目录
第1章绪论5
第2章形态学的理论6
2.1膨胀7
2.2腐蚀8
2.3开运算9
2.4闭运算9
第3章BMP图像格式9
第4章数学形态学用于图像处理13
4.1腐蚀14
4.1.1水平腐蚀14
4.1.2垂直腐蚀18
4.1.3全方位腐蚀21
4.2膨胀26
4.2.1水平膨胀26
4.2.2垂直膨胀30
4.2.3全方向膨胀34
4.3开运算与闭运算38
4.3.1开运算38
4.3.2闭运算39
第5章结论39
参考文献41
第1章绪论
数学形态学(MathematicalMorphology)诞生于1964年,是由法国巴黎矿业学院博士生赛拉(J.Serra)和导师马瑟荣,在从事铁矿核的定量岩石学分析及预测其开采价值的研究中提出“击中/击不中变换”,并在理论层面上第一次引入了形态学的表达式,建立了颗粒分析方法。
他们的工作奠定了这门学科的理论基础,如击中/击不中变换、开闭运算、布尔模型及纹理分析器的原型等。
数学形态学的基本思想是用具有一定形态的结构元素去量度和提取图像中的对应形状以达到对图像分析和识别的目的。
近几十年来,数学形态受到了国际学术界的广泛关注。
例如国际光学工程年会(SPIE)在近年的年会中举办了数学形态学的专题,并且每年出版一本《ImageAlgebraandMorphologicalImageProcessing》。
有关的国际际刊物和会议文集也刊登了大量的数学形态学的研究成果,如1986年《计算机视觉与图形图像处理杂志》(GVGIP)出版了数学形态学专刊。
数学形态学已经成为图像处理的一个主要研究方向,它的理论和方法是图像分析领域的一个强有力的工具,尤其是与形状相关的内容,例如:
计算机文字识别,医学图像处理,工业检测,地质学,冶金学,机器人视觉,视频压缩等等方面都获得了非常成功的应用。
最初,数学形态学处理的是二值图像,被称为“二值形态学”(BinaryMorphology)。
它将二值图像看成集合,运用最简单的集合和几何运算,如:
包含,交、并、补和平移等对原始图像进行探测。
因为它的各种运算是基于集合的运算,计算简单且适合于并行计算,因此在二值图像的去噪、边界检测、骨架化、区域分割等方面都有非常重要的应用。
为了使数学形态学能够处理灰度图像,人们提出了灰度数学形态学。
从二值形态学到灰度形态学的方法有很多,主要有:
阴影集方法(TheUmbraApproach)、阈值方法(TheThresholdSetApproach)、完备格方法(TheCompleteLatticesApproach)以及模糊逻辑方法(TheFuzzyLogicApproach),其中完备格方法当前被认为是最合适的形态学理论框架,由二值图像推广到灰度图像是自然的,只需要将二值形态学中的交和并换分别换成取下确界和取上确界即可。
第2章形态学的理论
数学形态学是由一组形态学的集合运算组成的,其基本运算有:
膨胀、腐蚀、开运算和闭运算、击中/击不中、细化和粗化。
这些基本运算在二值图像和灰度图像中各有特点。
基于这些基本运算还可推导和组合各种数学形态学实用算法。
其中膨胀和腐蚀是数学形态学方法中最基本的运算。
膨胀和腐蚀的原理是利用一个称作结构元素的“探针”收集图像的信息,当探针在图像中不断移动时,通过简单的逻辑运算便可考察图像各个部分之间的相互关系,从而了解图像的结构特征。
2.1膨胀
其定义是:
把结构元素B平移a后得到Ba,若Ba击中X,我们记下这个a点。
所有满足上述条件的a点组成的集合称做X被B膨胀的结果。
用公式表示为:
D(X)={a|Ba↑X}=X
B,如图2.1.1所示。
图2.1.1中X是被处理的对象,B是结构元素,不难知道,对于任意一个在阴影部分的点a,Ba击中X,所以X被B膨胀的结果就是那个阴影部分。
阴影部分包括X的所有范围,就象X膨胀了一圈似的,这就是为什么叫膨胀的原因。
在图2.1.2中,左边是被处理的图象X(二值图象,我们针对的是黑点),中间是结构元素B。
膨胀的方法是,拿B的中心点和X上的点及X周围的点一个一个地对,如果B上有一个点落在X的范围内,则该点就为黑;右边是膨胀后的结果。
可以看出,它包括X的所有范围,就象X膨胀了一圈似的。
图2.1.1膨胀的示意图
图2.1.2膨胀运算
2.2腐蚀
把结构元素B平移a后得到Ba,若Ba包含于X,我们记下这个a点,所有满足上述条件的a点组成的集合称做X被B腐蚀(Erosion)的结果。
用公式表示为:
E(X)={a|Ba
X}=X
B,如图2.2.1所示。
图2.2.1腐蚀的示意图
图2.2.1中X是被处理的对象,B是结构元素。
不难知道,对于任意一个在阴影部分的点a,Ba包含于X,所以X被B腐蚀的结果就是那个阴影部分。
阴影部分在X的范围之内,且比X小,就象X被剥掉了一层似的,这就是为什么叫腐蚀的原因。
2.3开运算
结构元素B对输入图像A的开运算记为A·B,定义为A·B=(AθB)
B=U{B+x:
B十x
A}。
从几何上看,开运算可以通过计算所有可以填入图像内部的结构元素平移的并求得。
这也正是对A先腐蚀后膨胀运算的结果。
开运算具有平滑功能,能清除图像的某些微小连接、边缘毛刺和孤立斑点。
2.4闭运算
结构元素B对输入图像A的闭运算记为A·B,定义为A·B=(A
B)θB。
从儿何上看,闭运算是开运算的对偶运算,即是对A先膨胀后腐蚀运算的结果。
闭运算具有过滤功能,可填平图像内部小沟、孔洞和裂缝,使断线相连。
第3章BMP图像格式
图像格式即图像文件存放在记忆卡上的格式,通常有JPEG、TIFF、RAW等。
由于数码相机拍下的图像文件很大,储存容量却有限,因此图像通常都会经过压缩再储存。
本课题主要用的是BMP格式的图像。
BMP是一种与硬件设备无关的图像文件格式,使用非常广。
它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。
BMP文件的图像深度可选lbit、4bit、8bit及24bit。
BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
典型的BMP图像文件由三部分组成:
位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。
BMP图像,即通常所说的位图(Bitmap),是Windows系统中最为常见的图像格式。
Windows3.0以前的版本只支持与设备相关位图DDB(DeviceDependentBitmap)。
DDB是一种内部位图格式,它显示的图像依计算机显示系统的设置不同而不同,因此一般不存储为文件,与通常所说的BMP图像不同。
在Windows.h中,结构体BITMAP定义了DDB位图的类型、宽度、高度、颜色格式和像素位值等,代码如下:
typedefstructtagBITMAP
{
intbmType;//位图类型,必须设为0
intbmWidth;//位图宽度
intbmHeight;//位图高度
intbmWidthBytes;//位图中每一扫描行中的字节数
BYTEbmPlanes;//颜色层数
BYTEbmBitsPixel;//每一像素所占的位数
voidFAR*bmBits;//存放像素值内存块的地址
}BITMAP;
DDB中不包括颜色信息,显示时是以系统的调色板为基础进行像素的颜色映射的。
Windows只能保证系统调色板的前20种颜色稳定不变,所以DDB只能保证正确显示少于20色的位图。
WindowsSDK提供标准的DDB位图操作函数;MFC中定义了CBitmap类来说明DDB位图,其中封装了与DDB位图操作相关的数据结构和函数。
Windows3.1以上版本提供了对设备无关位图DIB(DeviceIndependentBitmap)的支持。
DIB位图可以在不同的机器或系统中显示位图所固有的图像。
相对于DDB而言,DIB是一种外部位图格式,经常存储为常见的以BMP为后缀的位图文件(有时也以DIB为后缀)。
因此,通常所说的BMP图像,即是DIB位图。
BMP位图文件包括4部分,即位图文件头结构BITMAPFILEHEADER、位图信息头结构BITMAPINFOHEADER、位图颜色表RGBQUAD和位图像素数据,BMP位图文件的结构如图3.1所示。
位图文件头结构BITMAPFILEHEADER
位图信息头结构BITMAPINFOHEADER
位图颜色表RGBQUAD
位图像素数据
图3.1BMP位图文件的结构
下面介绍BMP文件头、BMP位图信息头、颜色表这3个结构体在Windows.h中的定义。
1.BMP文件头BMP文件头含有BMP文件的类型、文件的大小、位图文件的保留字、位图数据距文件头的偏移量等信息。
定义如下:
typedefstructtagBITMAPFILEHEADER
{
UINTbfType;//位图文件的类型,必须为BM
DWORDbfSize;//位图文件的大小,以字节为单位
UINTbfReserved1;//位图文件保留字,必须为0
UINTbfReserved2;//位图文件保留字,必须为0
DWORDbfOffBits;//位图数据距文件头的偏移量,以字节为单位
}BITMAPFILEHEADER;
2.BMP位图信息头BMP位图信息头用于说明位图的尺寸等信息,定义如下:
typedefstructtagBIMAPINFOHEADER
{
DWORDbiSize;//本结构所占用字节数
LONGbiWidth;//位图的宽度,以像素为单位
LONGbiHeight;//位图的高度,以像素为单位
WORDbiPlanes;//目标设备的级别,必须为1
WORDbiBitCount;//每个像素所需的位数,必须是1(双色)、
//4(16色)、8(256色)或24(真彩色)之一
DWORDbiCompression;//位图压缩类型,必须是0(不压缩)、
//1(BI_RLE8压缩类型)或2(BI_RLE压缩类型)之一
DWORDbiSizeImage;//位图的大小,以字节为单位
LONGbiXPelsPerMeter;//位图水平分辨率,每米像素数
LONGbiYPelsPerMeter;//位图垂直分辨率,每米像素数
DWORDbiClrUsed;//位图实际使用的颜色表中的颜色数
DWORDbiClrImportant;//位图显示过程中重要的颜色数
}BITMAPINFOHEADER;
3.颜色表颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,且定义一种颜色,定义如下:
typedefstructtagRGBQUAD
{
BYTErgbBlue;//蓝色的亮度(值范围为0~255)
BYTErgbGreen;//绿色的亮度(值范围为0~255)
BYTErgbRed;//红色的亮度(值范围为0~255)
BYTErgbReserved;//保留,必须为0
}RGBQUAD;
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
typedefstructtagBITMAPINFO
{
BITMAPINFOHEADERbmiHeader;
RGBQUADbmiColors[i];
}BITMAPINFO;
颜色表中RGBQUAD结构数据的个数由biBitCount来确定,当biBitCount=1、4、8时,分别有2、16、256个表项;当biBitCount=24时,没有颜色表项。
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内从左到右、扫描行之间从下到上。
位图的一个像素值所占的字节数如下:
l当biBitCount=1时,8个像素占1个字节。
l当biBitCount=4时,2个像素占1个字节。
l当biBitCount=8时,1个像素占1个字节。
l当biBitCount=24时,1个像素占3个字节。
Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充,一个扫描行所占的字节数计算方法如下:
DataSizePerLine=(biWidth×biBitCount+31)/8
这是本设计中的一个关键点,无论对图像进行何种变换,都要进行扫描行的4字节对齐。
除了上述的WindowsBMP以外,还有一种与其结构相似,但不完全相同的另一种BMP图像,即OS/2采用的BMP。
其与WindowsBMP的主要区别是位图信息结构(信息头结构和颜色表结构)不同。
而它们的图像位数据的存储方式是完全一样的。
本设计只讨论Windows系统下的BMP图像,故对OS/2使用的BMP不进行详细分析。
第4章数学形态学用于图像处理
程序运行结果:
4.1腐蚀
4.1.1水平腐蚀
代码:
voidFuShiYuPengZhangDib:
:
ChuiZhiFuShi()
{
LPBYTEp_data;//指向DIB象素指针
LPBYTElpSrc;//指向源图像的指针
LPBYTElpDst;//指向缓存图像的指针
LPBYTEtemp;//指向缓存DIB图像的指针
inti;
intj;
intn;//循环变量
p_data=GetData();//找到DIB图像象素起始位置
LONGwide=GetWidth();//DIB的宽度
LONGheight=GetHeight();//DIB的高度
if(m_pBitmapInfoHeader->biBitCount<9)//灰度图像
{
temp=newBYTE[wide*height];//暂时分配内存,以保存新图像
lpDst=(LPBYTE)temp;
memset(lpDst,(BYTE)255,wide*height);//初始化新分配的内存,设定初始值为255
//使用垂直方向的结构元素进行腐蚀
for(j=1;j{
for(i=0;i{
//由于使用3×1的结构元素,为防止越界,所以不处理最上边和最下边的两列像素
//指向源图像倒数第j行,第i个象素的指针
lpSrc=(unsignedchar*)(p_data+wide*j+i);
lpDst=(unsignedchar*)(temp+wide*j+i);//指向目标图像倒数第j行,第i个象素的指针
*lpDst=0;//目标图像中的当前点先赋成黑色
//如果源图像中(0,-1)、(0,0)、(0,1)三个点之一有白点,
//则将目标图像中的(0,0)点赋成白色
for(n=0;n<3;n++)
{
if(*(lpSrc+(n-1)*wide)>128)
{
*lpDst=255;
break;
}
}
}
}
//复制腐蚀后的图像
memcpy(p_data,temp,wide*height);
//释放内存
deletetemp;
}
else//24位真彩色
{
LONGDibWidth;//原图长、宽
DibWidth=this->GetDibWidthBytes();//取得原图的每行字节数
BYTE*p_temp=newBYTE[height*DibWidth];
//使用垂直方向的结构元素进行腐蚀
for(j=1;j{
for(i=0;i{
//由于使用3×1的结构元素,为防止越界,所以不处理最上边和最下边的两列像素
//指向源图像倒数第j行,第i个象素的指针
lpSrc=(unsignedchar*)(p_data+DibWidth*j+i);
lpDst=(unsignedchar*)(p_temp+DibWidth*j+i);//指向目标图像倒数第j行,第i个象素的指针
*lpDst=0;//目标图像中的当前点先赋成黑色
*(lpDst+1)=0;
*(lpDst+2)=0;
//如果源图像中(0,-1)、(0,0)、(0,1)三个点之一有白点,
//则将目标图像中的(0,0)点赋成白色
for(intm=0;m<3;m++)
{
for(n=0;n<3;n++)
{
if(*(lpSrc+(n-1)*DibWidth)>128)
{
*lpDst=255;
break;
}
else
*lpDst=*lpSrc;
}
lpSrc++;
lpDst++;
}
}
}
//复制腐蚀后的图像
memcpy(p_data,p_temp,DibWidth*height);
//释放内存
delete[]p_temp;
}
}
水平腐蚀后的图:
4.1.2垂直