PERFLAB实验报告
【实验目的】优化smooth函数。 【函数介绍】
Rotate:将图片逆时针旋转90°。 Smooth:用3*3的窗进行图片的均值滤波。
【程序优化】
Smooth: 1.1初始代码:
void naive_smooth(int dim, pixel *src, pixel *dst) {
int i, j;
for (i = 0; i < dim; i++) }
代码频繁调用avg函数,avg函数也频繁调研initialize_pixel_sum、sccumulate_sum、assign_sum_to_pixel函数。应该减少函数调用的时间开销。因此将所有函数都写在smooth内部,不再调用avg。
像素点分成图片四个角、图片四条边、图片内部三块分别进行处理。对角而言只需要4个像素点的均值,对于边而言为6个像素点均值,图片内部则需要9个像素点均值。
如图所示图片内部对于每行相邻的像素点A、B,滤波时其6个像素块重叠(绿色),对B而言,完全可以用上一步处理A后所得到的值,仅需加上B右边3个像素点(蓝色),并减去A多余的像素点(红色)即可。 每次所需要的数据由9个变为7个。
1.2改动代码:
void smooth(int dim, pixel *src, pixel *dst) {
dst[0].red=(src[0].red+src[1].red+src[dim].red+src[dim+1].red)>>2; //用\代替\节省时间 >2;
dst[dim*dim-1].red=(src[dim*dim-1].red+src[dim*dim-2].red+src[(dim-1)*dim-1].red+src[(dim-1)*dim-2].red)>>2; dst[dim*dim-1].blue=(src[dim*dim-1].blue+src[dim*dim-2].blue+src[(dim-1)*dim-1].blue+src[(dim-1)*dim-2].blue)>>2; dst[dim*dim-1].green=(src[dim*dim-1].green+src[dim*dim-2].green+src[(dim-1)*dim-1].green+src[(dim-1)*dim-2].green)>>dst[(dim-1)*dim].green=(src[(dim-1)*dim].green+src[(dim-1)*dim+1].green+src[(dim-2)*dim].green+src[(dim-2)*dim+1].green)>>2;
dst[(dim-1)*dim].red=(src[(dim-1)*dim].red+src[(dim-1)*dim+1].red+src[(dim-2)*dim].red+src[(dim-2)*dim+1].red)>>2; dst[(dim-1)*dim].blue=(src[(dim-1)*dim].blue+src[(dim-1)*dim+1].blue+src[(dim-2)*dim].blue+src[(dim-2)*dim+1].blue)>dst[dim-1].red=(src[dim-1].red+src[dim-2].red+src[dim*2-2].red+src[dim*2-1].red)>>2; dst[dim-1].blue=(src[dim-1].blue+src[dim-2].blue+src[dim*2-2].blue+src[dim*2-1].blue)>>2; dst[dim-1].green=(src[dim-1].green+src[dim-2].