数字图像处理_领域平均滤波_中值滤波
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
东华大学实验报告
课程 数字图像处理 名称 数字图像变换
实验名称: 邻域平均法(box 模板)和中值滤波处理 一、 实验目的
图像变换是数字图像处理中的一种综合变换,如直方图变换、几何变换等。通过本实验,使得学生掌握两种变换的程序实现方法。
二、 实验任务
请设计程序,分别用邻域平均法,其模板为:
和中值滤波法对testnoise 图像进行去噪处理(中值滤波的模板的大小也设为3×3)。
三、实验环境
本实验在Windows 平台上进行,对内存及cpu 主频无特别要求,使用VC 或者MINGW (gcc )编译器均可。
四、设计思路 介绍代码的框架结构、所用的数据结构、各个类的介绍(类的功能、类中方法的功能、类的成员变量的作用)、各方法间的关系
⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1111*1111191
试验要求中以给出大致的编程思路和源代码以及代码注释,只有黑框部分需要自己填写。在此不进行赘述。
五、具体实现
实现设计思路中定义的所有的数据类型,对每个操作给出实际算法。对主程序和其他模块也都需要写出实际算法。
注意:源代码中要加上注释。
代码:(红色为重点代码)
<邻域平均法>(3*3)
/*------利用第一次实验课提供的和文件以获取位图的高宽以及从文件头到实际的位图数据的偏移字节数,从而实现对位图实际数据的操作。------*/
#include <>
#include <>
#include <>
#include ""
/*------定义结构指针------*/
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]="";
// argv[2]="";
//参数输入出错显示
/* 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("");
if (!hdr) exit(1);
//以二进制可读方式打开输入位图文件
fp = fopen("", "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 { count[i]=bitmap[i-1]; } //填补最后一排 for(i=1;i { count[(nr_w+2)*(nr_h+1)+i]=bitmap[nr_w*(nr_h-1)+i-1]; } //填补左边一排 for(i=0;i { count[i*(nr_w+2)]=count[i*(nr_w+2)+1]; } //填补右边一排 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; i < nr_pixels; i++) bitmap[i]=new_color[i]; // 打开一个以输出文件名命名的文件,设为可写的二进制形式 fpnew = fopen("", "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);