数字图像解决实验报告 班级: 姓名: 学号: 日期:邻域平均法和中值滤波解决一、实验目的图像变换是数字图像解决中的一种综合变换,如直方图变换、几何变换等通过本实验,使得学生掌握两种变换的程序实现方法二、实验任务请设计程序,分别用邻域平均法,其模板为:和中值滤波法对testnoise图像进行去噪解决(中值滤波的模板的大小也设为3×3)三、实验环境本实验在Windows平台上进行,对内存及cpu主频无特别规定,使用VC或者MINGW(gcc)编译器均可四、设计思绪介绍代码的框架结构、所用的数据结构、各个类的介绍(类的功能、类中方法的功能、类的成员变量的作用)、各方法间的关系写在此不进行赘述 五、具体实现实现设计思绪中定义的所有的数据类型,对每个操作给出实际算法对主程序和其他模块也都需要写出实际算法 代码:<邻域平均法>(3*3) #include #include #include #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 bitmap 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;isignature, 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 #include #include #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 bitmap 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