vc++实现基于内容的图像检索系统(三)
RGB空间至HSV空间的转换
void CImagetrievalDlg::RGBToHSV(int r,int g,int b,double *h,double *s,double *v)
{
*h=acos((r-g+r-b)/(2.0*sqrtf((float)(r-g)*(r-g)+(float)(r-b)*(g-b))));
if(b>g)
*h=2*PI-*h;
*s=(mymax(r,g,b)-mymin(r,g,b))/(float)mymax(r,g,b);
*v=mymax(r,g,b)/255.0;
}
int CImagetrievalDlg::mymax(int a,int b,int c)//寻找最大
{
int m;
if(a>b)
m=a;
else
m=b;
if(m<c)
m=c;
return m;
}
int CImagetrievalDlg::mymin(int a,int b,int c)//寻找最小
{
int m;
if(a<b)
m=a;
else
m=b;
if(m>c)
m=c;
return m;
}
特征检索计算相似度排序
选择一张待检索的图像后,分别计算相应方法的特征值,计算每一张图像的曼哈顿距离或者欧式距离作为相似度,然后选出最相似的十张图像,用冒泡排序法显示出来,具体在sort()函数中实现:
void CImagetrievalDlg::sort()
{
int picnum=1009;//图像显示控件的ID号
if(method==1)
{
CString tp;//图像路径
double num;//图像与待检索图像的距离
//图像相似度排序
for(int i=0;i<counts;i+