图像检索程序设计.docx
《图像检索程序设计.docx》由会员分享,可在线阅读,更多相关《图像检索程序设计.docx(27页珍藏版)》请在冰豆网上搜索。
图像检索程序设计
XXXXXXXXXXX
毕业论文
题目
图像检索程序设计
学生姓名
XX
学号
XXXXX
专业
XXXXXXXXXXX
班级
XXXXXXXX
指导教师
XXXXXXX
2012年4月
摘要
基于一系列的问题20世纪90年代初期,基于内容的图象检索技术开始兴起。
这种图象检索系统是将自动提取得到的每幅图象视觉特征作为索引,然后根据用户提交的一幅或多幅例子图象来查找在视觉特征上相似的图象。
利用对图片的检索便能加以避免。
敏感图像属于图像数据是一段二进制的数据流。
利用不良图片的相似特征便可以使它们无处藏身。
大大的增加了搜索的范围。
减小了通过人为因素而隐藏的敏感图片。
对净化网络空间有着积极的意义。
在本论文中,将多媒体图像处理的方法和原理应用到图像检索的过程中,构建了图像检索的基本平台。
在具体制作中,使用了C++语言并且结合灰度直方图等一系列的特征算法,初步实现了基于图像内容的检索。
关键字:
图像检索直方图均方差
ABSTRACT
Basedontheearly1990s,aseriesofquestions,content-basedimageretrievaltechnologybegantorise.Thisimageretrievalsystemistheautomaticextractioneachpieceofimagevisualfeaturesastheindex,thentheusersubmitsoneormultipleexamplesofimagestofindsimilarimagesinthevisualfeatures.Useoftheimageretrievalwillbeabletobeavoided.Sensitiveimagesbelongtotheimagedataforsomebinarydatastream.Theuseofindecentimagesofsimilarcharacteristicscanbesothattheycannothide.Greatlyincreasethescopeofthesearch.Reducethehumanfactorsandhidesensitivepictures.Hasapositivemeaningtopurifycyberspace.Inthisdissertation,theimageprocessingprinciplesandmethodsareappliedtotheretrievalprocess,andabasicplatformforimageretrievalhasbeenbuilt.TheprogramwaswritteninC++languageandusinghistogramalgorithm,preliminarilyachievedthecontent-basedimageretrieval.
Keywords:
ImageRetrievalHistogramMeanSquareError
第一章绪论
1.1图像检索的研究背景及意义
1.1.1研究背景和意义
图像检索就是对图像的搜索,有关图像检索的研究是从20世纪70年代就开始了,当时主要是基于文本的图像检索技术(Text-basedImageRetrieval,简称TBIR),利用文本描述的方法来描述图像的特征,如绘画作品中的作者、流派、年代、尺寸等以及其他一些方面。
到了90年代以后,出现了对图像的内容语义进行分析和检索的图像检索技术,如图像的颜色、纹理、布局等,即基于图像内容的图像检索(Content-basedImageRetrieval,简称CBIR)技术。
CBIR属于基于内容检索(Content-basedRetrieval,简称CBR)中的一种,CBIR中还包括对动态视频、音频等其它多种形式的多媒体信息的检索技术。
基于内容的图像检索根据图像、图像的内容语义以及上下文联系进行查找,以图像语义特征为线索从图像数据库中检出具有相似特性的其它图像。
因为图像的规模一般要大于纯粹的文本信息,因此,基于内容的图像检索在检索的速度和效率上要求更高。
目前已有不少应用于实践环境的基于内容图像检索系统,如由IBM公司开发的最早商业化QBIC系统,以及由哥伦比亚大学研发的WebSeek系统、麻省理工学院研发的Photobook系统等。
通过基于内容的技术检索Web图像,首先需要从Web中剥离图像,组成图像集,对图像集中的各个对象进行基于内容的特征分析、相似度匹配。
基于内容的图像检索系统一般包括图像处理模块、查询模块、对象库和特征库和知识库。
基于文本的图像检索沿用了传统文本检索技术,回避对图像可视化元素的分析,而是从图像名称、图像尺寸、压缩类型、作者、年代等方面标引图像,一般以关键词形式的提问查询图像,或者是根据等级目录的形式浏览查找特定类目下的图像,如GettyAAT使用近133,000个术语来描述艺术、艺术史、建筑以及其它文化方面的对象,并推出30多个等级目录,从7方面描述图像的概念、物理属性、类型和刊号等。
又如Gograph将图像分为动态图像、照片、图标、背景、艺术剪辑图、插图、壁纸、界面、成套图像8个一级类,下设数量不等的子类。
在图像数字化之前,档案管理者、图书管理员都是采用这种方式组织和管理图像。
图像所在页面的主题、图像的文件名称、与图像密切环绕的文字内容、图像的链接地址等都被用作图像分析的依据,根据这些文本分析结果推断其中图像的特征。
1.1.2图像检索的研究现状
图像检索近年来被大量应用于搜索引擎等产品,为人们的工作和日常生活提供了便利。
在检索原理上,无论是基于文本的图像检索还是基于内容的图像检索,主要包括三方面:
一方面对用户需求的分析和转化,形成可以检索索引数据库的提问;另一方面,收集和加工图像资源,提取特征,分析并进行标引,建立图像的索引数据库;最后一方面是根据相似度算法,计算用户提问与索引数据库中记录的相似度大小,提取出满足阈值的记录作为结果,按照相似度降序的方式输出。
1.2本文主要的研究内容及各章安排
1.2.1本文主要研究内容
本文主要研究图像检索的实现过程,详细介绍了其基本原理,如何提取图像特征并量化,再进行特征匹配,并结合程序,完成图像检索的整个过程。
1.2.2本文各章安排
第一章:
绪论。
介绍课题的背景及意义。
第二章:
原理。
第三章:
程序实现。
第二章原理
图像检索基本原理为提取图像特征并量化,而后对量化的图像特征进行匹配,匹配度可以通过定义一个距离或者相似性的测量度来计算。
常用图像特征如下:
2.1灰度直方图
2.1.1灰度直方图的处理
灰度直方图概括了一幅图像的灰度级内容,描述了图像中各个灰度级出现的频率,计算简单,可用于数字化过程中参数的检查,轮廓的选取,计算图像中物体面积等。
灰度直方图(histogram)是灰度级的函数的显示,描述的是图像中具有该灰度级的像素的个数,横坐标为灰度级,纵坐标为该灰度级出现的频率(像素个数)
图2-1图(b)为图(a)的灰度直方图
它是多种空间域处理技术的基础。
直方图操作能够有效用于图像增强;提供有用的图像统计资料,其在软件中易于计算,适用于商用硬件设备。
我们可以通过直方图的状态来评断图像的一些性质:
明亮图像的直方图倾向于灰度级高的一侧;低对比度图像的直方图窄而集中于灰度级的中部,高对比度图像的直方图成分覆盖的灰度级很宽而且像素的分布没有不太均匀,只有少量的垂线比其他高许多。
直观上来说:
若一幅图像其像素占有全部可能的灰度级并且分布均匀,则这样的图像有高对比度和多变的灰度色调。
从概率的观点来理解,灰度出现的频率可看作其出现的概率,这样直方图就对应于概率密度函数pdf(probabilitydensityfunction),而概率分布函数就是直方图的累积和,即概率密度函数的积分。
灰度直方图的计算是很简单的,依据定义,若图象具有L(通常L=256,即8位灰度级)级灰度,则大小为MxN的灰度图象f(x,y)的灰度直方图hist[0…L-1]可用如下计算获得:
1.初始化hist[k]=0;k=0,…,L-1
2.统计hist[f(x,y)]++;x,y=0,…,M-1,0,…,N-1
3.标准化hist[f(x,y)]/=M*N
2.1.2灰度直方图的均衡化
直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数的过程。
图像对比度增强的方法可以分成两类:
一类是直接对比度增强方法;另一类是间接对比度增强方法。
直方图拉伸和直方图均衡化是两种最常见的间接接对比度增强方法。
直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。
直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。
通过这种方法,亮度可以更好地在直方图上分布。
这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。
这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。
缺点:
1)变换后图像的灰度级减少,某些细节消失;
2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。
2.2均方差
2.2.1均方差的定义
设X是一个随机变量,若E{[X-E(X)]^2}存在,则称E{[X-E(X)]^2}为X的方差,记为D(X)或DX。
即D(X)=E{[X-E(X)]^2},而σ(X)=D(X)^0.5(与X有相同的量纲)称为标准差或均方差。
均方差也被称为实验标准差,公式如图。
简单来说,均方差是一组数据平均值分散程度的一种度量。
一个较大的均方差,代表大部分数值和其平均值之间差异较大;一个较小的均方差,代表这些数值较接近平均值。
均方差可以当作不确定性的一种测量。
例如在物理科学中,做重复性测量时,测量数值集合的标准差代表这些测量的精确度。
当要决定测量值是否符合预测值,测量值的标准差占有决定性重要角色:
如果测量平均值与预测值相差太远(同时与均方差数值做比较),则认为测量值与预测值互相矛盾。
这很容易理解,因为如果测量值都落在一定数值范围之外,可以合理推论预测值是否正确。
2.2.2灰度均方差
灰度均方差反映了在一幅灰度图像中色彩的分散程度,反映了图像的对比度特征,同时也从一定程度上反映了图像的纹理特征。
2.3欧氏距离
欧氏距离定义:
欧氏距离(Euclideandistance)是一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离。
在二维和三维空间中的欧式距离的就是两点之间的距离,二维的公式是
d= sprt [(x1-x2)2 + (y1-y2)2 ]
三维的公式是
d= sprt[(x1-x2)2+ (y1-y2)2+ (z1-z2)2]
第三章程序实现
3.1流程图
图3-1程序工作流程
本次设计中,为了提高程序速度,采用的是将图像转换为256*256像素灰度图的方式进行处理。
3.2界面设计
图3-2本程序界面
左侧图框为IDC_STATIC_KEYIMAGE,用于显示关键图
右侧图框为IDC_STATIC_FOUNDIMAGE,用于显示检索到的图像
中央ListBox为IDC_LIST_FOUNDED,用于显示检索结果(相关度和路径及文件名),对应响应函数为CXbwDlg:
:
OnSelchangeListFounded()。
选择关键图按钮对应响应函数为CXbwDlg:
:
OnButtonLoad()。
开始搜索按钮对应响应函数为CXbwDlg:
:
OnOK()。
当搜索线程开始时,开始搜索和退出按钮将被禁用。
3.3具体过程
3.3.1类型库
在本程序的设计中,使用了两个第三方类库,分别为CTokenEx类库和CxImage类库。
3.3.2CTokenEx类
由DanMadden(
1.SplitPath函数用于将路径分离(盘符,目录,文件名,扩展名)。
2.Join函数用于从CStringArray中根据选择生成CString。
3.Split函数用于将CString分解成CStringArray。
4.GetString函数用于从CString中取得第一个子串。
要使用CTokenEx类,只需将TokenEx.cpp和TokenEx.h加入工程,并添加相应include关系即可。
3.3.3CxImage类
CxImage类库是由DavidePizzolato(http:
//www.xdp.it/index.shtml)编写的一个可以读取,保存,显示,转换图像的简单而高效的C++类库。
它是免费的并且是开源的。
CxImage包含了近200多种功能,它提供了建立简单图像处理程序所需的功能并且易于掌握。
支持格式有:
BMP,GIF,ICO,CUR,JBG,JPG,JPC,JP2,PCX,PGX,PNG,PNM,RAS,SKA,TGA,TIF,WBMP,WMF,RAW,CRW,NEF,CR2,DNG,ORF,ARW,ERF,3FR,DCR,X3F,MEF,RAF,MRW,PEF,SR2。
CxImage是高度可移植的,已经在Windows平台下的VC++6/2008、C++Builder3/6、MinGW和Linux平台下的GCC3.3.2通过测试,本类库可以既可以静态链接,也可以通过DLL方式动态加载,或通过ActiveX控件方式使用。
鉴于CxImage类库功能强大,而本程序中只涉及到BMP处理,所以选择了老版本(5.99a)。
要使用CxImage库,首先要对下载得到的源码进行编译以获得cximage.lib,作者已经提供了整个类库配置的工程文件CxImgLib.dsw(VC++6.0),只要打开它进行编译即可。
需要注意的是:
整个CxImage类库非常大。
如果你只需要能处理其中的几种格式,编译该类库时,你可以在配置的头文件ximcfg.h中找到一些编译开关选项来关闭一些图像库。
JPG、PNG、TIFF中的每一个库,都会向最终程序增加约100KB的内容。
所以,你需要谨慎挑选一些你真正需要的类库。
本程序设计中,为了防止过度精简,我使用了默认配置进行编译。
在VC中使用时,需将cximage.lib、xfile.h、ximacfg.h、ximadef.h、ximage.cpp、ximage.h、xiofile.h、xmemfile.cpp、xmemfile.h复制到工程文件夹中并将CxImage.h文件加入工程中即可使用CxImage类进行定义。
3.3.4选择关键图
选择关键图按钮对应OnButtonLoad()响应函数。
按下按钮后将开启文件选择框,仅可选择bmp文件,使用CxImage类的Load函数读入内存并显示于左侧,然后调用RefreshDisplay函数刷新显示。
选择完成后即对目标图进行处理,使用CxImage类的Resample函数重采样到256*256大小,FFT2函数处理成灰度图,分块计算直方图并存储于全局变量m_KeySignature中备用,均方差计算值存在m_aTemp中备用。
具体程序参见附录1
3.3.5开始搜索
开始搜索按钮对应OnOK()响应函数,按下按钮后启动目录选择框,选定目录后建立搜索线程其函数为SiapCariRecursive。
具体程序参见附录2
3.3.6启动搜索后界面设置
启动搜索线程后要对程序界面上的开始搜索和退出按钮锁定,防止误按。
并使用冒泡法扫描ListBox中的字符串,找出最长的字符串,当它超过阈值时,显示水平滚动条。
具体程序参见附录3
3.3.7递归目录扫描
该函数使用MFC本地搜索类CFileFind扫描目录及其子目录,每扫到一个目录就调用一次ScanFiles函数扫描文件。
具体程序参见附录4
3.3.8文件扫描
每扫到一个非空目录时就便调用此函数扫描文件,具体过程为,建立MFC本地搜索类CFileFind,扫描到.和..即本目录和上级目录时跳过,取得具体文件名时调用Madhosi函数处理。
具体程序参见附录5
3.3.9计算图像特征
从ScanFiles函数中调用,类似于OnButtonLoad函数中的计算方式,得到的扫描图像的直方图存储于lSignature,均方差存储于aTemp,最后计算lSignature和m_keySignature的欧氏距离和aTemp与m_aTemp的距离后以1:
1权重计算相关度并使用dTemp返回。
(数值越小越接近,图像越相似)。
具体程序参见附录6
3.3.10ListBox点击显示函数
搜索出结果之后在ListBox中显示相关度和路径/文件名,此函数用于响应在ListBox中的点击,在右侧显示对应图像的原图。
本函数中使用了CTokenEx类来分离CString中的相关度和路径,取得路径后用CxImage类中的Load函数加载在右侧窗,再刷新显示。
具体程序参见附录7
3.3.11刷新显示
通用刷新显示函数,根据m_imgLoaded和m_imgFound的存在情况刷新。
对应位置图像在内存中时,使用GDI拉伸显示。
具体程序参见附录8
3.3.12运行结果
第四章总结
4.1全文工作总结及未来工作展望
本文,以VC++6为平台,使用CxImage类进行基础图像处理,采用了直方图算法,均方差算法进行图像特征提取,使用欧氏距离计算相关度,搭建了一个易于添加算法的图像检索平台。
参考文献
[1]何斌VisualC++图像设计人民邮电出版社2001
[2]郎悦数字图像处理学VisualC++实现北京希望电子出版社2002
[3]周长发精通VisualC++图像处理编程电子工业出版社2004
[4]向友君,谢胜利图像检索技术综述重庆邮电学院报2006.6
[5]朱赟,韩炜,吴炜易于扩充的图像检索平台实现上海师范大学学报2002.12
[6]田云,马燕,李泳基于分块合并直方图改进的图像检索方法福建电脑2008.5
[7]DavidePizzolatoCxImageDocumentation2011.1
[8]DanMaddenCTokenExDocumentation2000.1
致谢
在这篇论文完成之际,在此我衷心的感谢我的指导老师黄金凤老师。
老师在百忙之抽出时间来为我指导讲解,并提出了许多宝贵的意见和建议,我的论文才得以顺利完成。
在即将离开学校之际,再次衷心感谢我系所有老师对我的帮助,谢谢你们为我的大学生活划上一个完满的句号!
附录1
voidCXbwDlg:
:
OnButtonLoad()
{
charszFilter[]="BmpFile(*.bmp)\0*.bmp\0AllFiles(*.*)\0*.*\0\0";//文件类型过滤
CFileDialogdlg(TRUE);//建立文件选择框
CStringstrTemp;
CStringstrTemp1;
CStringstrNamaFile;
ULONGulJumlahRecords;
intiLoopRecNo=0;
CxImageimgTemp;
CxImagerfft1;//CxImage类变量
CxImageifft1;
intiWidth=256;//目标宽度
intiHeight=256;//目标高度
intiPixelSize=1;//1=灰度图,3=24位色图,4=32位色图
intiBlockSize=16;//设置分块大小16*16
inti=iWidth/iBlockSize;
intj=iHeight/iBlockSize;
intix;
intiy;
intiRow;
intiCol;
intiLoopRow;
intiLoopCol;
doubledTemp;
doubleaTemp;
intiBlockNum=0;
longlVal1;
BYTE*pImage;
ulJumlahRecords=0L;
dlg.m_ofn.lpstrFilter=szFilter;//设置文件选择框属性
if(dlg.DoModal()==IDOK)//打开文件选择框
{
strNamaFile=dlg.GetPathName();//获取文件名
m_imgLoaded.Load(strNamaFile,CXIMAGE_FORMAT_BMP);
//全局变量m_imgLoaded,属CxImage类,使用Load函数读取。
RefreshDisplay();
if(!
m_imgLoaded.IsValid())return;//失败返回
imgTemp.Copy(m_imgLoaded);
imgTemp.Resample(iWidth,iHeight);//目标图重采样为256*256
imgTemp.FFT2(&imgTemp,&imgTemp,&rfft1,&ifft1);
//将图像转换为灰度图
pImage=rfft1.GetBits();//获得图像数据
for(iRow=0;iRow{
for(iCol=0;iCol{
m_KeySignature[iBlockNum]=0.0;
//m_KeySignature为double型256项数组,用于存储目标图直方图
dTemp=0.0;
for(iLoopRow=0;iLoopRow{
for