数字图像处理实验报告班级:姓名:学号:日期:邻域平均法和中值滤波处理一、实验目的图像变换是数字图像处理中的一种综合变换,如直方图变换、几何变换等。
通过本实验,使得学生掌握两种变换的程序实现方法。
二、实验任务请设计程序,分别用邻域平均法,其模板为:和中值滤波法对testnoise图像进行去噪处理(中值滤波的模板的大小也设为3×3)。
三、实验环境本实验在Windows平台上进行,对内存及cpu主频无特别要求,使用VC或者MINGW(gcc)编译器均可。
四、设计思路介绍代码的框架结构、所用的数据结构、各个类的介绍(类的功能、类中方法的功能、类的成员变量的作用)、各方法间的关系写。
在此不进行赘述。
五、具体实现实现设计思路中定义的所有的数据类型,对每个操作给出实际算法。
对主程序和其他模块也都需要写出实际算法。
代码:<邻域平均法>(3*3)#include <stdio.h>#include <stdlib.h>#include <memory.h>#include "hdr.h" /*------定义结构指针------*/struct bmphdr *hdr;//定义用于直方图变量unsigned char *bitmap,*count,*new_color; /*------main()函数编------*/int main(){ //定义整数i,j 用于函数循环时的,nr_pixels为图像中像素的个数int i, j ,nr_pixels,nr_w,nr_h; //定义两个文件指针分别用于提取原图的数据和生成直方图均衡化后的图像FILE *fp, *fpnew; //定义主函数的参数包括:输入的位图文件名和输出的位图文件名,此处内容可以不要,在DOS下执行命令的时候再临时输入也可,为了方便演示,我这里直接把函数的参数确定了。
//argc=3; //argv[1]="test.bmp"; //argv[2]="testzf.bmp"; //参数输入出错显示/* if (argc != 3) {printf("please input the name of input and out bitm ap files\n");exit(1);}*/// 获取位图文件相关信息//hdr = get_header(argv[1]);hdr = get_header("testnoise.bmp");if (!hdr) exit(1); //以二进制可读方式打开输入位图文件fp = fopen("testnoise.bmp", "rb");if (!fp) {printf("File open error!\n");exit(1);} // 文件指针指向数据区域fseek(fp, hdr->offset, SEEK_SET); //计算位图像素的个数nr_pixels = hdr->width * hdr->height;nr_w = hdr->width;nr_h = hdr->height;bitmap = malloc(nr_pixels);new_color = malloc(nr_pixels);count = malloc((nr_w+2)*(+nr_h+2));//读取位图数据到bitmap中fread(bitmap, nr_pixels, 1, fp);fclose(fp);//因为图像边缘无法使用邻域平均,所以根据邻近颜色填补图像的周围一圈,存入count[]数组中//中心图像存入count[]for(i=nr_w+3;i<(nr_w+2)*(+nr_h+2)-nr_w-3;i++) {j=i/(nr_w+2);if(i%(nr_w+2)!=0&&(i+1)%(nr_w+2)!=0) count[i]=bitmap[i-nr_ w-1-2*j];}//填补第一排for(i=1;i<nr_w+1;i++) {count[i]=bitmap[i-1];} //填补最后一排for(i=1;i<nr_w+1;i++) {count[(nr_w+2)*(nr_h+1)+i]=bitmap[nr_w*(nr_h-1)+i-1];} //填补左边一排for(i=0;i<nr_h+3;i++) {count[i*(nr_w+2)]=count[i*(nr_w+2)+1];} //填补右边一排for(i=0;i<nr_h+3;i++){ count[(i+1)*(nr_w+2)-1]=count[(i+1)*(nr_w+2)-2];}//邻域平均3*3for(j=nr_w+3,i=0;j<(nr_w+2)*(+nr_h+2)-nr_w-3;j++) {if(j%(nr_w+2)!=0&&(j+1)%(nr_w+2)!=0)new_color[i]=(count[j]+count[j-1]+count[j+1]+count[j-nr_w-2 ]+count[j-1-nr_w-2]+count[j+1-nr_w-2]+count[j+nr_w+2]+count [j-1+nr_w+2]+count[j+1+nr_w+2])/9,i++; } //结果存入bitmap[]中for (i = 0; i < nr_pixels; i++;bitmap[i]=new_color[i]; // 打开一个以输出文件名命名的文件,设为可写的二进制形式fpnew = fopen("test_lynoise.bmp", "wb+");//由于位图文件的头部信息并没有因直方图均衡化而改变,因此输出图像的头部信息从原位图文件中拷贝即可:fwrite(hdr->signature, 2, 1, fpnew);fwrite(&hdr->size, 4, 1, fpnew);fwrite(hdr->reserved, 4, 1, fpnew);fwrite(&hdr->offset, 4, 1, fpnew);fwrite(&hdr->hdr_size, 4, 1, fpnew);fwrite(&hdr->width, 4, 1, fpnew);fwrite(&hdr->height, 4, 1, fpnew);fwrite(&hdr->nr_planes, 2, 1, fpnew);fwrite(&hdr->bits_per_pixel, 2, 1, fpnew);fwrite(&hdr->compress_type, 4, 1, fpnew);fwrite(&hdr->data_size, 4, 1, fpnew);fwrite(&hdr->resol_hori, 4, 1, fpnew);fwrite(&hdr->resol_vert, 4, 1, fpnew);fwrite(&hdr->nr_colors, 4, 1, fpnew);fwrite(&hdr->important_color, 4, 1, fpnew);if (hdr->offset > 54)fwrite(hdr->info, (hdr->offset - 54), 1, fpnew); //直方图均衡化的数据(bitmap)赋值fwrite(bitmap, nr_pixels, 1, fpnew);//关闭fclose(fpnew);//释放内存(优化程序必需)free(hdr);free(bitmap);free(new_color);free(count);return 0;}<中值滤波>#include <stdio.h>#include <stdlib.h>#include <memory.h>#include "hdr.h"/*------定义结构指针------*/struct bmphdr *hdr;//定义用于直方图变量unsigned char *bitmap,*count,*new_color;/*------main()函数编写------*/int main(){ //定义整数i,j 用于函数循环时的,nr_pixels为图像中像素的个数int i, j, m, n, nr_pixels,nr_w,nr_h,temp,t[9]; //定义两个文件指针分别用于提取原图像的数据和生成直方图均衡化后的图像FILE *fp, *fpnew; //定义主函数的参数包括:输入的位图文件名和输出的位图文件名,此处内容可以不要,在DOS下执行命令的时候再临时输入也可.// argc=3;// argv[1]="test.bmp";// argv[2]="testzf.bmp";//参数输入出错显示/* if (argc != 3) {printf("please input the name of input and out bi tmap files\n");exit(1);}*/// 获取位图文件相关信息//hdr = get_header(argv[1]);hdr = get_header("testnoise.bmp");if (!hdr) exit(1); //以二进制可读方式打开输入位图文件fp = fopen("test.bmp", "rb");if (!fp) {printf("File open error!\n");exit(1);} // 文件指针指向数据区域fseek(fp, hdr->offset, SEEK_SET);//计算位图像素的个数nr_pixels = hdr->width * hdr->height;nr_w = hdr->width;nr_h = hdr->height;bitmap = malloc(nr_pixels);new_color = malloc(nr_pixels);count = malloc((nr_w+2)*(+nr_h+2)); //读取位图数据到bitmap中fread(bitmap, nr_pixels, 1, fp);fclose(fp); //因为图像边缘无法使用邻域平均,所以根据邻近颜色填补图像的周围一圈,存入count[]数组中//中心图像存入count[]for(i=nr_w+3;i<(nr_w+2)*(+nr_h+2)-nr_w-3;i++) {j=i/(nr_w+2);if(i%(nr_w+2)!=0&&(i+1)%(nr_w+2)!=0) count[i]=bitmap[i-nr_ w-1-2*j];} //填补第一排for(i=1;i<nr_w+1;i++) { count[i]=bitmap[i-1]; } //填补最后一排for(i=1;i<nr_w+1;i++) {count[(nr_w+2)*(nr_h+1)+i]=bitmap[nr_w*(nr_h-1)+i-1];} //填补左边一排for(i=0;i<nr_h+3;i++) { count[i*(nr_w+2)]=count[i*(nr_w+ 2)+1]; }//填补右边一排for(i=0;i<nr_h+3;i++){ count[(i+1)*(nr_w+2)-1]=count[(i+1)*(nr_w+2)-2];} //中值平均3*3for(j=nr_w+3,i=0;j<(nr_w+2)*(+nr_h+2)-nr_w-3;j++) {if(j%(nr_w+2)!=0&&(j+1)%(nr_w+2)!=0){t[0]=count[j];t[1]=count[j-1];t[2]=count[j+1];t[3]=count[j-nr_w-2];t[4]=count[j-1-nr_w-2];t[5]=count[j+1-nr_w-2];t[6]=count[j+nr_w+2];t[7]=count[j-1+nr_w+2];t[8]=count[j+1+nr_w+2];for(m=0;m<9;m++)for(n=0;n<9-m;n++)if(t[n]>t[n+1]) {temp=t[n];t[n]=t[n+1];t[n+1]=temp;}new_color[i]=t[4];i++;}} //结果存入bitmap[]中for (i = 0; i < nr_pixels; i++)bitmap[i]=new_color[i]; // 打开一个以输出文件名命名的文件,设为可写的二进制形式fpnew = fopen("test_zznoise.bmp", "wb+");//由于位图文件的头部信息并没有因直方图均衡化而改变,因此输出图像的头部信息从原位图文件中拷贝即可:fwrite(hdr->signature, 2, 1, fpnew);fwrite(&hdr->size, 4, 1, fpnew);fwrite(hdr->reserved, 4, 1, fpnew);fwrite(&hdr->offset, 4, 1, fpnew);fwrite(&hdr->hdr_size, 4, 1, fpnew);fwrite(&hdr->width, 4, 1, fpnew);fwrite(&hdr->height, 4, 1, fpnew);fwrite(&hdr->nr_planes, 2, 1, fpnew);fwrite(&hdr->bits_per_pixel, 2, 1, fpnew);fwrite(&hdr->compress_type, 4, 1, fpnew);fwrite(&hdr->data_size, 4, 1, fpnew);fwrite(&hdr->resol_hori, 4, 1, fpnew);fwrite(&hdr->resol_vert, 4, 1, fpnew);fwrite(&hdr->nr_colors, 4, 1, fpnew);fwrite(&hdr->important_color, 4, 1, fpnew);if (hdr->offset > 54)fwrite(hdr->info, (hdr->offset - 54), 1, fpnew);//直方图均衡化的数据(bitmap)赋值fwrite(bitmap, nr_pixels, 1, fpnew);//关闭fclose(fpnew);//释放内存(优化程序必需)free(hdr);free(bitmap);free(new_color); free(count);return 0;。