图片相似度比较 方法及源码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、大致实现步骤如下:

1,将图像转换成相同大小,以有利于计算出相像的特征

2,计算转化后的灰度,二值

3,利用相似度公式,得到图像相似度的定量度量

4,统计相似度结果数据

相似度公式:

二、部分代码

#define MAX(a, b) (((a) > (b)) ? (a) : (b))

//计算相减后的绝对值

float GetAbs(float f, float s)

{

float abs = fabs((float)f - (float)s);

float result = MAX(f, s);

if (result == 0)

result = 1;

return abs / result;

}

//相似度

float GetResult(float firstNum[], float scondNum[],int nSize) {

if (nSize==0)

{

return 0;

}

else

{

float result = 0;

int j = nSize;

for (int i = 0; i < j; i++)

{

result += 1 - GetAbs(firstNum[i], scondNum[i]);

}

return result/j;

}

}

//函数功能:自动普通二值化

//参数说明:iSrc,表示原图像

//iDst,表示目标图像

//nLevel,表示阈值 [OUT]

//iIterationTimes,表示迭代次数

void AutoThreshold(CxImage *iSrc, int &nLevel,CxImage *iDst,int iIterationTimes)

{

void* pDib = NULL;

pDib = iSrc->GetDIB();

if (!pDib)

return ;

if (iSrc->GetBpp()==1)

return ;

long iWidth = 0,iHeight =0,x = 0,y = 0,i = 0,t = 0;

unsigned char iThreshold, iNewThreshold, iMaxGrayValue = 255, iMinGrayValue = 0, iMean1GrayValue, iMean2GrayValue;

double w0,w1,iMeanGrayValue;

double G=0, tempG=0;

long lP1, lS1, lP2, lS2;

iWidth = iSrc->GetWidth();

iHeight = iSrc->GetHeight();

//保存原始图像

CxImage tmpSrc(iWidth,iHeight,iSrc->GetBpp());

tmpSrc.Copy(*iSrc);

///////////////////////////////////////////////

iSrc->GrayScale();

//灰度分布统计

long *pGray = new long[256];

memset(pGray,0,sizeof(long)*256);

for (y=0;y

{

for (x=0;x

{

i = iSrc->GetPixelIndex(x,y);

pGray[i]++;

//修改最大灰度值和最小灰度值

if(iMinGrayValue > i)

{

iMinGrayValue = i;

if(iMaxGrayValue < i)

{

iMaxGrayValue = i;

}

}

}

// 遍历t, 选取最佳阈值

for(t = iMinGrayValue; t < iMaxGrayValue ; t++)

{

iNewThreshold = t;

lP1 = 0;

lS1 = 0;

lP2 = 0;

lS2 = 0;

// 求前景,背景两个区域的平均灰度值, 点数所占比例

for(i = iMinGrayValue; i <= iNewThreshold; i++)

{

lP1 += pGray[i] * i;

lS1 += pGray[i];

}

if(lS1==0)

continue;

iMean1GrayValue = (unsigned char) (lP1/lS1);

w0 = (double) (lS1) / (iWidth * iHeight);

for(i = iNewThreshold + 1; i <= iMaxGrayValue; i++)

{

lP2 += pGray[i] * i;

lS2 += pGray[i];

}

if(lS2==0)

continue;

iMean2GrayValue = (unsigned char) (lP2/lS2);

w1 = 1 - w0;

iMeanGrayValue=w0*iMean1GrayValue +w1*iMean2GrayValue ;

G = w0 *(iMean1GrayValue-iMeanGrayValue)*(iMean1GrayValue-iMeanGrayValue)+w1* (iMean2GrayValue-iMeanGrayValue)*(iMean2GrayValue-iMeanGrayValue);

if(G > tempG)

{

tempG = G;

iThreshold = iNewThreshold;

相关文档
最新文档