void Comp_Picture(float *&color,pmyColor &pcolor, pvariance &vance, int Method)
{
while(pcolor)
{
pvariance ppvariance = new variance;
memset(ppvariance,0,sizeof(variance));
//保存图片路径
strcpy(ppvariance->picpath,pcolor->picpath);
if(Method == 1)
{
//求均方差
float fsum = 0, temp = 0;
for(int i = 0; i < 9; i++)
{
temp = (color[i]) - (pcolor->colors[i]);
//printf("差=%f\t",temp);
fsum += temp * temp;
//printf("差的平方=%f\n",fsum);
}
ppvariance->van = fsum / 9;
//printf("均方差=%f\n",ppvariance->van);
}
if(Method == 2)
{
//直方图相交
for(int i = 0; i < 9; i++)
{
ppvariance->van += min(color[i],pcolor->colors[i]);
}
}
if(Method == 3)
{
//直方图卡方
for(int i = 0; i < 9; i++)
{
float d_ch = ( (color[i] - pcolor->colors[i]) * (color[i] - pcolor->colors[i]) ) / (color[i] + pcolor->colors[i]);
ppvariance->van += d_ch;
}
}
if(pVarianceHead == NULL)
{
pVarianceHead = ppvariance;
pVarianceEnd = ppvariance;
}
else
{
if(ppvariance->van > pVarianceEnd->van)
{
pVarianceEnd->pNext = ppvariance;
pVarianceEnd = ppvariance;
}
else
{
if(ppvariance->van < pVarianceHead->van)
{
pvariance ptem = pVarianceHead;
pVarianceHead = ppvariance;
pVarianceHead->pNext = ptem;
}
else
{
pvariance ppp = pVarianceHead->pNext;
pvariance pcur = pVarianceHead;
while(ppp)
{
if(ppvariance->van < ppp->van)
{
ppvariance->pNext = ppp;
pcur->pNext = ppvariance;
break;
}
pcur = ppp;
ppp = ppp->pNext;
}
}
}
}
pcolor = pcolor->pNext;
}
vance = pVarianceHead;
}
{
while(pcolor)
{
pvariance ppvariance = new variance;
memset(ppvariance,0,sizeof(variance));
//保存图片路径
strcpy(ppvariance->picpath,pcolor->picpath);
if(Method == 1)
{
//求均方差
float fsum = 0, temp = 0;
for(int i = 0; i < 9; i++)
{
temp = (color[i]) - (pcolor->colors[i]);
//printf("差=%f\t",temp);
fsum += temp * temp;
//printf("差的平方=%f\n",fsum);
}
ppvariance->van = fsum / 9;
//printf("均方差=%f\n",ppvariance->van);
}
if(Method == 2)
{
//直方图相交
for(int i = 0; i < 9; i++)
{
ppvariance->van += min(color[i],pcolor->colors[i]);
}
}
if(Method == 3)
{
//直方图卡方
for(int i = 0; i < 9; i++)
{
float d_ch = ( (color[i] - pcolor->colors[i]) * (color[i] - pcolor->colors[i]) ) / (color[i] + pcolor->colors[i]);
ppvariance->van += d_ch;
}
}
if(pVarianceHead == NULL)
{
pVarianceHead = ppvariance;
pVarianceEnd = ppvariance;
}
else
{
if(ppvariance->van > pVarianceEnd->van)
{
pVarianceEnd->pNext = ppvariance;
pVarianceEnd = ppvariance;
}
else
{
if(ppvariance->van < pVarianceHead->van)
{
pvariance ptem = pVarianceHead;
pVarianceHead = ppvariance;
pVarianceHead->pNext = ptem;
}
else
{
pvariance ppp = pVarianceHead->pNext;
pvariance pcur = pVarianceHead;
while(ppp)
{
if(ppvariance->van < ppp->van)
{
ppvariance->pNext = ppp;
pcur->pNext = ppvariance;
break;
}
pcur = ppp;
ppp = ppp->pNext;
}
}
}
}
pcolor = pcolor->pNext;
}
vance = pVarianceHead;
}
本文介绍了一种通过不同方法计算图片相似度的算法实现。该算法可以使用均方差、直方图相交或直方图卡方三种方式来评估图片间的相似程度,并通过链表结构保存每张图片的计算结果。
&spm=1001.2101.3001.5002&articleId=41351937&d=1&t=3&u=105eb146843441c3abbc3a66585ffcd2)
1081

被折叠的 条评论
为什么被折叠?



