软件工程实验八

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

实验八:代码优化

一、试验目的:

1. 熟悉掌握代码优化的常规手段;

二、实验要求

1. 以word文档形式提交实验报告,无需压缩;

2. 文档包括:优化措施说明、优化后的程序、优化前后执行时间的截图。

三、实验内容

1. 阅读下面的C程序,优化代码效率(时间效率),给出优化前后的时间对比,要求:速度提高100倍及以上。

代码见文件“ImGaussConv.cpp”,滤波窗口尺寸在本应用场景下是固定的(为5*5)。

for(j = -SUPPORT_SIZE; j <= SUPPORT_SIZE; j++)

{

//计算高斯系数,2.71828为自然数e

pGaussCoef[ (i+SUPPORT_SIZE)*wlen + j+SUPPORT_SIZE ] = pow( 2.71828, (-double(i*i + j*j)/25) );

}

}

for(k = 0; k < wlen*wlen; k++)

{

sum += pGaussCoef[k];

}

for(k = 0; k < wlen*wlen; k++) //进行归一化处理

{

pGaussCoef[k] /= sum;

}

}

}

// 2维卷积函数,实现2维图像高斯滤波

// pGaussCoef为高斯系数

// pSrcImg为原始图像

// pDstImg为滤波后图像

// height:图像高度

// width:图像宽度

// supportSize:高斯滤波窗口半径,直径为2*supportSize + 1

void conv2D(double *pGaussCoef, unsigned char *pSrcImg, unsigned char *pDstImg, int height, int width, int supportSize)

{

int i, j;

int m, n;

int indexI, indexG;

int sw = supportSize;

int slen = sw*2 + 1;

double sum;

double *pTemp = NULL;

pTemp = new double[height*width];

for(i = 0; i < height*width; i++)

{

pTemp[i] = (double)pSrcImg[i];

}

for(i = sw; i < height - sw; i++)

{

for(j = sw; j < width - sw; j++)

sum = 0;

calGaussCoef(pGaussCoef);

for(m = -sw; m <= sw; m++)

{

for(n = -sw; n <= sw; n++)

{

indexI = (i+m)*width + j+n;

indexG = (m+sw)*slen + n+sw;

sum += pSrcImg[indexI] * pGaussCoef[indexG];

}

}

pDstImg[i*width + j] = (unsigned char)(sum);

}

}

}

int main()

{

int wlen, imLen;

time_t start, end;

double *pGaussCoef = NULL;

unsigned char *pSrc = NULL, *pDst = NULL;

unsigned char buffer[1078];

FILE *fin, *fout;

if( !(fin=fopen("in.bmp","rb")) )

{

printf("Open file %s error!\n","in.bmp");

return 0;

}

if( !(fout=fopen("out.bmp","wb")) )

{

printf("Open file %s error!\n","out.bmp");

return 0 ;

}

wlen = SUPPORT_SIZE * 2 + 1;

imLen = IM_WIDTH * IM_HEIGHT;

pGaussCoef = new double[wlen*wlen];

pSrc = new unsigned char[IM_WIDTH*IM_HEIGHT];

pDst = new unsigned char[IM_WIDTH*IM_HEIGHT];

fread(buffer, 1, 1078, fin);

fread(pSrc, sizeof(unsigned char), imLen, fin);

start = clock();

conv2D(pGaussCoef, pSrc, pDst, IM_HEIGHT, IM_WIDTH, SUPPORT_SIZE);

end = clock();

printf("running time is %d\n", end - start);

fwrite(buffer, sizeof(unsigned char), 1078, fout);

fwrite(pDst, sizeof(unsigned char), imLen, fout);

delete[] pGaussCoef;

delete[] pSrc;

delete[] pDst;

fclose(fin);

fclose(fout);

}

删除了一些不必要的循环,修改了一些参数

相关文档
最新文档