📄 scramdegree.c
字号:
#include <math.h>
#include <tina/tv.h>
static double **double_matrix(int row, int col)
{
int i;
double **m;
m=(double **)malloc((unsigned) (row*sizeof(double *)));
for(i = 0; i < row; i++)
{
m[i]=(double *)malloc((unsigned) (col*sizeof(double)));
if (!m[i])
{
printf("memory allocation failure in double_matrix()");
return;
}
}
return m;
}
static void free_double_matrix(double **m, int row)
{
int i;
for(i = 0; i < row; i++) free((double *) m[i]);
free((double *) m);
}
/* To get the DSF:distance scrambling factor. */
double getDSF(int **r, int **c, int height, int width)
{
int i, j;
double d, Ed, max_Ed, DSF;
Ed = 0;
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
{
d = sqrt( (double)((r[i][j]-i)*(r[i][j]-i) + (c[i][j]-j)*(c[i][j]-j)) );
Ed += d;
}
}
Ed /= (height*width);
//max_Ed = sqrt( (double)((height-1)*(height-1) + (width-1)*(width-1)) ); max_Ed = sqrt( (double)(height*width));
DSF = Ed / max_Ed;
printf("DSF = %f\t", DSF);
return DSF;
}
/* To get the GSF:gray scrambling factor. */
double getGSF(Imrect *srcIm, Imrect *destIm, int height, int width)
{
int subHeight = 8,
subWidth = 8;
int i, j, u, v;
double **srcEb, **destEb;
double Eaveg;
double srcCida, destCida, GSF;
unsigned char pix;
srcEb = double_matrix(height/subHeight, width/subWidth);
destEb = double_matrix(height/subHeight, width/subWidth);
Eaveg = 0;
for(i = 0; i < height/subHeight; i++)
{
for(j = 0; j < width/subWidth; j++)
{
/*---*/
srcEb[i][j] = 0;
destEb[i][j] = 0;
for(u = 0; u < subHeight; u++)
{
for(v = 0; v < subWidth; v++)
{
IM_PIX_GET(destIm, i*subHeight+u, j*subWidth+v, pix);
destEb[i][j] += (double)pix;
IM_PIX_GET(srcIm, i*subHeight+u, j*subWidth+v, pix);
srcEb[i][j] += (double)pix;
Eaveg += (double)pix;
}
}
destEb[i][j] /= (double)(subHeight*subWidth);
srcEb[i][j] /= (double)(subHeight*subWidth);
/*---*/
}
}
Eaveg /= (double)(height*width);
destCida = 0;
srcCida = 0;
for(i = 0; i < height/subHeight; i++)
{
for(j = 0; j < width/subWidth; j++)
{
destCida += (destEb[i][j]-Eaveg)*(destEb[i][j]-Eaveg);
srcCida += (srcEb[i][j]-Eaveg)*(srcEb[i][j]-Eaveg);
}
}
GSF = srcCida / destCida;
printf("GSF = %f\t", GSF);
free_double_matrix(srcEb, height/subHeight);
free_double_matrix(destEb, height/subHeight);
return GSF;
}
double getDDR(Imrect *srcIm, Imrect *destIm, int height, int width)
{
double DDR = 0.0;
int i, j;
unsigned char a, b;
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
IM_PIX_GET(srcIm, i, j, a);
IM_PIX_GET(destIm, i, j, b);
if (0 == a)
{
DDR += (double)(abs(b - a));
}
else
{
DDR += ( (double)(abs(b - a)) )/a;
}
}
}
DDR = DDR / (height*width);
/*printf("--> DDR = %f\n", DDR);*/
return DDR;
}
double getZhiLuanDu_1(int **r, int **c, Imrect *srcIm, Imrect *destIm, int height, int width)
{
double DSF, GSF, Ds;
double DDR;
DSF = getDSF(r, c, height, width);
GSF = getGSF(srcIm, destIm, height, width);
DDR = getDDR(srcIm, destIm, height, width);
Ds = DSF * GSF * DDR;
printf("--> Ds = %f\n", Ds);
return Ds;
}
double getZhiLuanDu_2(Imrect *srcIm, Imrect *destIm, int height, int width)
{
int subHeight = 4,
subWidth = 4;
int i, j, u, v;
double **srcEb, **destEb;
double srcCida, destCida, SD;
unsigned char pix;
srcEb = double_matrix(height/subHeight, width/subWidth);
destEb = double_matrix(height/subHeight, width/subWidth);
for(i = 0; i < height/subHeight; i++)
{
for(j = 0; j < width/subWidth; j++)
{
/*---*/
srcEb[i][j] = 0;
destEb[i][j] = 0;
for(u = 0; u < subHeight; u++)
{
for(v = 0; v < subWidth; v++)
{
IM_PIX_GET(destIm, i*subHeight+u, j*subWidth+v, pix);
destEb[i][j] += (double)pix;
IM_PIX_GET(srcIm, i*subHeight+u, j*subWidth+v, pix);
srcEb[i][j] += (double)pix;
}
}
destEb[i][j] /= (double)(subHeight*subWidth);
srcEb[i][j] /= (double)(subHeight*subWidth);
/*---*/
}
}
destCida = 0;
srcCida = 0;
for(i = 0; i < height/subHeight; i++)
{
for(j = 0; j < width/subWidth; j++)
{
/*---*/
for(u = 0; u < subHeight; u++)
{
for(v = 0; v < subWidth; v++)
{
IM_PIX_GET(destIm, i*subHeight+u, j*subWidth+v, pix);
destCida += (pix-destEb[i][j]) * (pix-destEb[i][j]);
IM_PIX_GET(srcIm, i*subHeight+u, j*subWidth+v, pix);
srcCida += (pix-srcEb[i][j]) * (pix-srcEb[i][j]);
}
}
/*---*/
}
}
SD = destCida / srcCida;
printf("SD = %f\t", SD);
free_double_matrix(srcEb, height/subHeight);
free_double_matrix(destEb, height/subHeight);
return SD;
}
double getZhiLuanDu_3(int **r, int **c, Imrect *srcIm, Imrect *destIm, int height, int width)
{
double DSF, D2, D3;
DSF = getDSF(r, c, height, width);
/*GSF = getGSF(srcIm, destIm, height, width);*/
D2 = getZhiLuanDu_2(srcIm, destIm, height, width);
D3 = DSF * D2;
printf("--> D3 = %f\n", D3);
return D3;
}
/*
add on 2006-02-04
*/
double getUniformity(int **r, int **c, int height, int width)
{
int i, j, p, q;
double u;
int w = (int)sqrt(width)+1, h = (int)sqrt(height)+1;
int r0 = (height - h)/2, c0 = (width - w)/2;
int s, t = 0;
for(i = 0; i < height-h; i++)
{
for(j = 0; j < width-w; j++)
{
/*---*/
s = 0;
for(p = i; p < i+h; p++)
{
for(q = j; q < j+w; q++)
{
if((r[p][q]>=r0) && (r[p][q]<r0+h) && (c[p][q]>=c0) && (c[p][q]<c0+w))
++s;
}
}
if(s<=5) ++t;
/*---*/
}
}
u = (double)s / ((width-w+1)*(height-h+1));
printf("Even = %f\n", u);
return u;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -