1、将这些颜色对中差值小于某一域值的颜色对删除以消除颜色噪声选取颜色对表中数值最大的几个颜色对做为图片的代表特征搜索目标图像的每一子块的颜色对表寻找与这写代表颜色对的匹配统计单一匹配次数若有某一比例以上的颜色对匹配到,图像即被检索到。相似性度量:(N为所用查询颜色对数目)qj、gj:颜色对j在查询图像Q和目标图像G中出现的次数查询时颜色对的匹配应该是不精确的,应该允许的误差为2%以内 二. 具体程序实现a) 基于子块颜色直方图方法的程序实现:将图片分成44格局,按从左到右、从上到下的顺序,分别计算各子块的颜色直方图,因此需要设定一个三维数组,前两维为子块的坐标,最后一维为颜色级,但现在采样得到的象
2、素点的颜色值是RGB形式的,因此,需要将RGB形式转换为可以用比较合理的有限数表示的颜色级,而人眼对亮度是最为敏感的,因此可以将RGB转换为亮度值Y,公式为:Y=R0.299+G0.587+B0.114这样就确定的一个256级的颜色级别,而统计颜色直方图的三维数组就可以定义为:int Color44256,当采样到某一颜色级时候,将相应的位置加一即可。根据以上的子块间的相似公式:,知道某一颜色级对应的数有可能是分母,当两个颜色级的数都为0的时候,显然是不能统计的,因此需要一个数组记录实际统计过的颜色级数,也需要一个数组记录44子块的两幅图像的各子块的相似度。对于用户选定的块其实是代表查询对象的
3、,因此应该加大权重,相对来说就是减小其他块的权重,然后可以将乘过对应权重的块的相似度相加,得到最终的相似度,然后将所有目标图像与用户输入的图像的相似度从大到小排序,选出值最大的几张作为最后的查询结果显示出来返回。以上是具体实现设想,程序实现如下:/基于颜色直方图的方法pDC-TextOut(10,168,检索结果:);CBmpProc *pDestBmp;CString comp_pic_path;double fsim15; file:/15张待比较的目标图片与用户输入图片的相似度存放的数组int psim15;/与fsim想对应的图片编号数组,以便显示for(int comp_pic=1;
4、comp_picLoadFromObject(bmp, &CRect(0,0,128,128);/ 从bmp中的指定区域读入图像,以便图片匹配的进行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;file:/用户输入的对象所在子块(既用户选定的4个子块)的坐标doub
5、le sim44;/子块之间的相似度数组int ccount44;/有过统计的颜色数目记录数组for(int i=0;i4;i+)for(int j=0;jj+)simij=0;ccountij=0;/以下两个for按公式计算两幅图像的各对应子块之间的相似度for(i=0;j+)for(int k=0;kColorijk=pBmp-Colorijk)&Colorijk!=0)simij+=(1-(fabs(pDestBmp-Colorijk-pBmp-Colorijk)/(pDestBmp-Colorijk);ccountij+;Colorijk Colorijk)&pBmp-Colorijk
6、-pBmp-Colorijk)/(pBmp-ccountij+;simij=simij/ccountij; /计算两图像最终的相似度结果double final_sim=0;/对用户指定的块设置权重为1if(i=x1&j=y1)|(i=x2&j=y2)|(i=x3&j=y3)|(i=x4&j=y4)final_sim+=simij;else/其他块降低权重为0.7,提高对对象匹配的精确度final_sim+=(simij*0.7);/将15幅被比较图像与用户输入源图像的最后计算出来的相似度结果记录在数组中fsimcomp_pic-1=final_sim;delete (CBmpProc*)pD
7、estBmp;int count=15;double tempf;int tempp;for(int l=0;l0;i-)jif(fsimjtempf=fsimj;tempp=psimj;fsimj=fsimj+1;psimj=psimj+1;fsimj+1=tempf;psimj+1=tempp;int disp=0;int space=-128;/将相似度最大的的两张图片显示出来for(int disp_pic=1;disp_pic=0&(y-1)=0)o_dis0=o_dis0+(Colorx-1y-1i-Colorxyi)*(Colorx-1y-1i-Colorxyi);o_dis0=
8、-1;if(y-1)o_dis1=o_dis1+(Colorxy-1i-Colorxyi)*(Colorxy-1i-Colorxyi);o_dis1=-1;if(x+1)=3&o_dis2=o_dis2+(Colorx+1y-1i-Colorxyi)*(Colorx+1y-1i-Colorxyi);o_dis2=-1;o_dis3=o_dis3+(Colorx-1yi-Colorxyi)*(Colorx-1yi-Colorxyi);o_dis3=-1;=3)o_dis4=o_dis4+(Colorx+1yi-Colorxyi)*(Colorx+1yi-Colorxyi);o_dis4=-1;(
9、y+1)o_dis5=o_dis5+(Colorx-1y+1i-Colorxyi)*(Colorx-1y+1i-Colorxyi);o_dis5=-1;if(y+1)o_disj=sqrt(o_disj);/-/欧氏距离计算结束int flag=0;int num=0;for(int pairnum=0;pairnum32;pairnum+)if(pairpairnum.x!=-1)num+;/因为在计算子块的颜色对表的时候已经写了特征颜色对数组,因此要先统计一下特征颜色对数组里已经/有多少有数值了,以便下次的写入可以接在后面,而不至于覆盖了前面的数值/计算颜色对差值小于某个域值的这个域值do
10、uble ave=0;for(int e=0;ee+)ave+=o_dise;ave=ave/8;ave=ave*0.02;/采取与子块周围颜色对的平均值的2%计为域值/对该子块的颜色对表进行从大到小的排序,采取冒泡排序int count=8; double temp;for(i=count;if(o_disjtemp=o_disj;o_disj=o_disj+1;o_disj+1=temp;/消除那些颜色对差值小于某个的颜色对,以消除那些没有意义的小对象for(k=0;kif(fabs(o_disk-o_disk+1)for(int l=k+1;lo_disl=o_disl+1;count-
11、;k-;o_discount=-1;/将该字块计算得到的颜色对表填入该图像的特征颜色对表for(int scan=0;scan0)pairnum.x=x;pairnum.y=y;pairnum.o_dis=o_disscan;return 1;/计算该图像的最终确定的特征颜色对表BOOL CBmpProc:SortColorPair()/32个数据项中有count个有实际数值for(int count=0;countbmiHeader.biSize = sizeof(BITMAPINFOHEADER);/ 复制源图CDC compDC;/ 创建与当前显示设备兼容的内存设备描述表compDC.C
12、reateCompatibleDC(&dc);compDC.SelectObject(this);COLORREF clr;/定义一个COLORREF结构,因为提取的象素点的颜色是以RGB形式表示的int pix_color;int red,green,blue;int x,y;for(int fd=0;fdfd+)for(int sd=0;sdsd+)for(int td=0;tdtd+)Colorfdsdtd=0;/计算颜色直方图k+)x=j*32+l;y=i*32+k;clr=compDC.GetPixel(x,y);red=GetRValue(clr);green=GetGValue(
13、clr);blue=GetBValue(clr);/因为RGB颜色共2563种,不可能都保存到数组中,因此要先进行一定的提取工作,因为人对亮度的感/觉是最明显的,所以可以先将RGB颜色值转成亮度值,这个公式即转换公司,刚好亮度数值是256级的,/就可以统计颜色直方图了pix_color=red*0.299+green*0.587+blue*0.114;Colorijpix_color+;/对该象素点的颜色直方图数组中的相信位置加一,是直方图的物理实现以上三个函数实现对某一图像内部的具体计算,而对于基于颜色对方法的外部计算如下:/计算用户确定的4块位置与其周围位置的颜色对(颜色对现采取用相邻两块
14、的直方图的欧氏距离表示)CalculateColorPair(obj_set.m_x1,obj_set.m_y1);CalculateColorPair(obj_set.m_x2,obj_set.m_y2);CalculateColorPair(obj_set.m_x3,obj_set.m_y3);CalculateColorPair(obj_set.m_x4,obj_set.m_y4);/其实在以上的4部计算中,已经形成了初步的颜色对表,在此只不过是将表中的数据从大到小排列出来/并且祛除差值小于某一域值的颜色对/计算颜色对结束,形成颜色对表SortColorPair();/颜色对表计算出来,表中的数据既是用户输入的该图像的代表特征/读取带比较的图像(在此初定15幅-现定义这15幅图像即图片数据库),comp_pic
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2