
用VC实现图像检索技术.doc
10页一. 理论和方法介绍 a) 采用颜色检索方法的目的: 对多媒体数据的检索,早期的方法是用文本将多媒体数据进行标识,这显然不是基于多媒体信息本身内容的检索,对多媒体数据中包含的信息是一中及大的浪费; 基于内容的检索是多媒体数据库的关键技术,如何实现这块技术,是值得商榷的,而最好的方法是使用无需领域知识的检索方法,因此,基于颜色的方法就是实现的关键; 本文介绍了颜色直方图和颜色对方法在基于内容检索时的实现思路和理论; 其实颜色直方图简单来说,就是统计图像中具有某一特定颜色的象素点数目而形成的各颜色的直方图表示,不同的直方图代表不同图片的特征 b) 利用颜色直方图进行检索: 该方法也可以应用于视频数据库的查询中,有以下三种方式: (1)指明颜色组成--该法需要用户对图像中的颜色非常敏感,而且使用起来也不方便,检索的查准率和查全率并不高,因此文章中并未介绍该法的实现思路 (2)指明一幅示例图像--通过与用户确定的图像的颜色直方图的相似性匹配得到查询结果,这是文章介绍的两种方法的根本 (3)指明图像中一个子图--分割图像为各个小块,然后利用选择小块来确定图像中感兴趣的对象的轮廓,通过建立更复杂的颜色关系(如颜色对方法)来查询图像,该方法是文章的重心所在 c) 颜色直方图实现思路的介绍: 两图片是否相似可以采用欧氏距离来描述: Ed=(G,S)= (Ed越小相似度就越大) 检索后,全图直方图的相似度的定量度量可以用如下公式表示: Sim(G,S)= (N为颜色级数,Sim越靠近1两幅图片越相似)可以对上面2中的公式加改进对某些相对重要的颜色乘上一个权重,就可以做寻找某一前景或组合的查询。
全图的颜色直方图算法过于简单,因此带来很多问题,如:可能会有两幅根本不同的图像具有完全一样的颜色直方图,不反映颜色位置信息,这样导致查准率和查全率都不高,因此问文章提出了一个改进,即将图像进行了分割,形成若干子块,这样就提供了一定程度的位置信息,而且可以对含用户感兴趣的子块加大权重,提高检索的查询智能性和查准查全率,相应的公式有,子块Gij与Sij的相似性度量为: (P为所选颜色空间的样点数) 再引入子块权重Wij,选取L个最大的Sim值作Simk(Gk,Sk),就有: (Wk 的选取应根据图像的特点决定,可以使图像中间或用户指定的区域权重大,以反映图像的位置信息) d) 颜色对实现思路介绍: 主要目的:借助图像中相邻子块之间的颜色直方图的配对建模,实现对图像中的具体对象的查询,支持对象的移位、旋转和部分变形; 颜色对方法特别适合于对边界明显的对象的查询;实现思路:计算用户输入图像的子块直方图片à用户选定包含查询对象的子块à计算这些子块与周围相邻的子块的颜色对表à将这些颜色对中差值小于某一域值的颜色对删除以消除颜色噪声à选取颜色对表中数值最大的几个颜色对做为图片的代表特征à搜索目标图像的每一子块的颜色对表寻找与这写代表颜色对的匹配à统计单一匹配次数à若有某一比例以上的颜色对匹配到,图像即被检索到。
相似性度量: (N为所用查询颜色对数目) qj、gj:颜色对j在查询图像Q和目标图像G中出现的次数 查询时颜色对的匹配应该是不精确的,应该允许的误差为2%以内 二. 具体程序实现 a) 基于子块颜色直方图方法的程序实现:将图片分成4×4格局,按从左到右、从上到下的顺序,分别计算各子块的颜色直方图,因此需要设定一个三维数组,前两维为子块的坐标,最后一维为颜色级,但现在采样得到的象素点的颜色值是RGB形式的,因此,需要将RGB形式转换为可以用比较合理的有限数表示的颜色级,而人眼对亮度是最为敏感的,因此可以将RGB转换为亮度值Y,公式为: Y=R×0.299+G×0.587+B×0.114 这样就确定的一个256级的颜色级别,而统计颜色直方图的三维数组就可以定义为:int Color[4][4][256],当采样到某一颜色级时候,将相应的位置加一即可 根据以上的子块间的相似公式:,知道某一颜色级对应的数有可能是分母,当两个颜色级的数都为0的时候,显然是不能统计的,因此需要一个数组记录实际统计过的颜色级数,也需要一个数组记录4×4子块的两幅图像的各子块的相似度。
对于用户选定的块其实是代表查询对象的,因此应该加大权重,相对来说就是减小其他块的权重,然后可以将乘过对应权重的块的相似度相加,得到最终的相似度,然后将所有目标图像与用户输入的图像的相似度从大到小排序,选出值最大的几张作为最后的查询结果显示出来返回 以上是具体实现设想,程序实现如下://基于颜色直方图的方法pDC->TextOut(10,168,"检索结果:");CBmpProc *pDestBmp;CString comp_pic_path;double fsim[15]; 张待比较的目标图片与用户输入图片的相似度存放的数组int psim[15]; 与fsim想对应的图片编号数组,以便显示for(int comp_pic=1;comp_pic<=15;comp_pic++){comp_pic_path.Format("image%d.bmp",comp_pic);bmp.LoadFrom); // 从库中读入位图pDestBmp = (CBmpProc*)new(CBmpProc); // 用new分配类目标pDestBmp->LoadFromObject(bmp, &CRect(0,0,128,128));// 从bmp中的指定区域读入图像,以便图片匹配的进行pDestBmp->CalculateColor(*pDC); 计算目标图片的颜色直方图int x1,x2,y1,y2,x3,x4,y3,y4;x1=obj_set.m_x1;x2=obj_set.m_x2;x3=obj_set.m_x3;x4=obj_set.m_x4;y1=obj_set.m_y1;y2=obj_set.m_y2;y3=obj_set.m_y3;y4=obj_set.m_y4;用户输入的对象所在子块(既用户选定的4个子块)的坐标double sim[4][4]; 子块之间的相似度数组int ccount[4][4]; 有过统计的颜色数目记录数组for(int i=0;i<4;i++)for(int j=0;j<4;j++){sim[i][j]=0;ccount[i][j]=0;}以下两个for按公式计算两幅图像的各对应子块之间的相似度for(i=0;i<4;i++)for(int j=0;j<4;j++)for(int k=0;k<256;k++){if((pDestBmp->Color[i][j][k]>=pBmp->Color[i][j][k])&&pDestBmp->Color[i][j][k]!=0){sim[i][j]+=(1-((fabs(pDestBmp->Color[i][j][k]-pBmp->Color[i][j][k]))/(pDestBmp->Color[i][j][k])));ccount[i][j]++;}if((pDestBmp->Color[i][j][k] Color[i][j][k])&&pBmp->Color[i][j][k]!=0){sim[i][j]+=(1-((fabs(pDestBmp->Colori][j][k]-pBmp->Color[i][j][k]))/(pBmp->Color[i][j][k]))); ccount[i][j]++; } }for(i=0;i<4;i++)for(int j=0;j<4;j++){sim[i][j]=sim[i][j]/ccount[i][j];} 计算两图像最终的相似度结果double final_sim=0;for(i=0;i<4;i++)for(int j=0;j<4;j++){对用户指定的块设置权重为1if((i==x1&&j==y1)||(i==x2&&j==y2)||(i==x3&&j==y3)||(i==x4&&j==y4))final_sim+=sim[i][j];else其他块降低权重为0.7,提高对对象匹配的精确度final_sim+=(sim[i][j]*0.7);}将15幅被比较图像与用户输入源图像的最后计算出来的相似度结果记录在数组中fsim[comp_pic-1]=final_sim; delete (CBmpProc*)pDestBmp;}int count=15;double tempf;int tempp;for(int l=0;l<15;l++){psim[l]=l+1; 设定编号数组}将15个相似度从大到小排列,并且改变次序的时候编号数组和跟着改变for(int i=count;i>0;i--){for(int j=0;jif(fsim[j]tempf=fsim[j];tempp=psim[j];fsim[j]=fsim[j+1];psim[j]=psim[j+1];fsim[j+1]=tempf;psim[j+1]=tempp;}}int disp=0;int space=-128;将相似度最大的的两张图片显示出来for(int disp_pic=1;disp_pic<=2;disp_pic++){comp_pic_path.Format("image%d.bmp",psim[disp_pic]);bmp.LoadFrom); // 从库中读入位图pDestBmp = (CBmpProc*)new(CBmpProc); // 用new分配类目标pDestBmp->LoadFromObject(bmp, &CRect(0,0,128,128)); // 从bmp中的指定区域读入图像disp++;space+=128;pDC->Rectangle(10+space-1,190-1,138+space+1,318+1);pDestBmp->Draw(*pDC, &CRect(10+space,190,138+space,318));// 将pBmp中的图像绘入DC的指定区域space+=6; }delete (CBmpProc*)pBmp; // 删除类目标,delete会自动调用类的析构函数。
AfxMessageBox("检索完成"); } b) 基于颜色对的方法的程序实现 该方法也需要分成4×4子块,计算颜色直方图,具体计算颜色直方图的方法上面已经有过详细的解释该方法主要在于对颜色对表示结构的实现,颜色对是某一图片的代表特征,因此在程序中必须有定量表示,现在采取用两个子块颜色直方图的欧氏距离表示,因此计算某一子块的颜色对表就是按八方向计算其与周围的子块之间的欧氏距离,将结果存放于一个double o_dis[8]的数组中,然后将这个数组从大到小排序,排序完成后再将数组中相互之间值的差小于某一域值(取8个颜色对的平均值的2%)的颜色对祛除(按序两两比较再移动数组里的变量实现),最后将结果先填入图像的特征颜色对表(有4×8=32个变量,是一个结构数组,结构记录用户选定子块的坐标和与其相对应的被选中的颜色对值) 最后,对4个用户选定的子块依次计算完毕,就可以调用SortColorPair()函数,对特征颜色对表做出处理(先从大到小排序,然后祛除差值。












