⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scramdegree.c

📁 图像置乱代码
💻 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 + -