数字图像处理实验报告邻域平均法和中值滤波法.docx
《数字图像处理实验报告邻域平均法和中值滤波法.docx》由会员分享,可在线阅读,更多相关《数字图像处理实验报告邻域平均法和中值滤波法.docx(7页珍藏版)》请在冰豆网上搜索。
数字图像处理实验报告邻域平均法和中值滤波法
数字图像处理实验报告
班级:
姓名:
学号:
日期:
邻域平均法和中值滤波处理
一、实验目的
图像变换是数字图像处理中的一种综合变换,如直方图变换、几何变换等。
通过本实验,使得学生掌握两种变换的程序实现方法。
二、实验任务
请设计程序,分别用邻域平均法,其模板为:
和中值滤波法对testnoise
图像进行去噪处理(中值滤波的模板的大小也设为3X3)。
三、实验环境
本实验在Windows平台上进行,对内存及cpu主频无特别要求,使
用VC或者MINGW(gcc)编译器均可。
四、设计思路
介绍代码的框架结构、所用的数据结构、各个类的介绍(类的功能、类中方法的功能、类的成员变量的作用)、各方法间的关系写。
在此不进行赘述。
五、具体实现
实现设计思路中定义的所有的数据类型,对每个操作给出实际算法。
对主程序和其他模块也都需要写出实际算法。
代码:
<邻域平均法>(3*3)
#include
#include
#include
#include"hdr.h"/*定义结构指针*/
structbmphdr*hdr;
//定义用于直方图变量
unsignedchar*bitmap,*count,*new_color;/*main()函数编*/intmain()
{//定义整数i,j用于函数循环时的,nr_pixels为图像中像素的个数
inti,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("pleaseinputthenameofinputandoutbitmapfiles\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("Fileopenerror!
\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}//填补最后一排
for(i=1;i}//填补左边一排
for(i=0;i}//填补右边一排
for(i=0;i{count[(i+1)*(nr_w+2)-1]=count[(i+1)*(nr_w+2)-2];
}
//邻域平均3*3
for(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;ibitmap[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);
return0;
}
<中值滤波>
#include
#include
#include
#include"hdr.h"
/*定义结构指针*/structbmphdr*hdr;
//定义用于直方图变量
unsignedchar*bitmap,*count,*new_color;
/*main()函数编写*/
intmain()
{//定义整数i,j用于函数循环时的,nr_pixels为图像中像素的个数
inti,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("pleaseinputthenameofinputandoutbitmapfiles\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("Fileopenerror!
\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;icount[(nr_w+2)*(nr_h+1)+i]=bitmap[nr_w*(nr_h-1)+i-1];
}//填补左边一排
for(i=0;i//填补右边一排
for(i=0;i{count[(i+1)*(nr_w+2)-1]=count[(i+1)*(nr