数字图像处理邻域平均法和中值滤波处理实验报告.docx
- 文档编号:4887257
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:11
- 大小:272.82KB
数字图像处理邻域平均法和中值滤波处理实验报告.docx
《数字图像处理邻域平均法和中值滤波处理实验报告.docx》由会员分享,可在线阅读,更多相关《数字图像处理邻域平均法和中值滤波处理实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
数字图像处理邻域平均法和中值滤波处理实验报告
数字图像处理实验报告
实验名称:
邻域平均法和中值滤波处理(续)
一、实验名称
邻域平均法和中值滤波处理(续)
二、实验目的
图像变换是数字图像处理中的一种综合变换,如直方图变换、几何变换、领域平均和中值滤波等。
通过本实验,掌握图像变换的程序实现方法,了解熟悉gcc平台、vc的使用。
三、实验任务
使用C语言对位图文件的头信息进行读取,从而对图像加上椒盐噪声
四、实验环境
操作系统:
WindowsXP
试验平台:
VC++6.0
五、设计思路
5.1、思路与分析
5.1.1、加盐噪声
基本思想是:
生成一些随机数,根据这些随机数把对应的像素灰度级设为255。
5.1.2、加椒噪声
基本思想是:
生成一些随机数,根据这些随机数把对应的像素灰度级设为0。
5.2、代码的框架结构
该程序一共包含3个文件hdr.h,hdr.c,和ff.c
其中,hdr.h用来定义位图头文件的结构体,hdr.c用来读取位图的头文件信息,ff.c用来对图像加上椒盐噪声。
5.3、所用的数据结构
位图头文件的数据结构如下:
/*以下为定义位图头文件的结构体*/
structbmphdr
{
charsignature[2];//文件类型
intsize;//位图大小
shortreserved[2];//两个保留字
intoffset;//位图偏移位置
inthdr_size;//头文件大小
intwidth;//位图宽度
intheight;//位图高度
shortnr_planes;//位平面数
shortbits_per_pixel;//每像素的位数
intcompress_type;//压缩类型
intdata_size;//数据大小
intresol_hori;//水平
intresol_vert;//垂直
intnr_colors;
intimportant_color;
charinfo[1024];
};
六、具体实现
6.1、hdr.h文件:
定义位图头文件的结构体
#ifndef__HDR_H__
#define__HDR_H__
/*以下为定义位图头文件的结构体*/
structbmphdr
{
charsignature[2];//文件类型
intsize;//位图大小
shortreserved[2];//两个保留字
intoffset;//位图偏移位置
inthdr_size;//头文件大小
intwidth;//位图宽度
intheight;//位图高度
shortnr_planes;//位平面数
shortbits_per_pixel;//每像素的位数
intcompress_type;//压缩类型
intdata_size;//数据大小
intresol_hori;//水平
intresol_vert;//垂直
intnr_colors;
intimportant_color;
charinfo[1024];
};
structbmphdr*get_header(charfilename[]);
#endif
6.2、hdr.c文件:
读入位图头文件信息。
#include
#include
#include"hdr.h"
structbmphdr*get_header(charfilename[])//获取位图头文件信息
{
FILE*fp;
structbmphdr*hdr;
fp=fopen(filename,"rb");//打开位图文件
if(!
fp)//位图文件打开出错时给出提示
{
printf("Fileopenerrororsuchfiledoesnotexist!
\n");
returnNULL;
}
hdr=(structbmphdr*)malloc(sizeof(structbmphdr));//分配空间
fread(hdr->signature,2,1,fp);
if(hdr->signature[0]!
='B'||hdr->signature[1]!
='M')//如果打开文件的扩展名不是.BMP,则说明不是
BMP位图文件
{
printf("Notabmpfile!
\n");
returnNULL;
}
//以下都是读位图头文件信息
fread(&hdr->size,4,1,fp);
fread(hdr->reserved,4,1,fp);
fread(&hdr->offset,4,1,fp);
fread(&hdr->hdr_size,4,1,fp);
fread(&hdr->width,4,1,fp);
fread(&hdr->height,4,1,fp);
fread(&hdr->nr_planes,2,1,fp);
fread(&hdr->bits_per_pixel,2,1,fp);
fread(&hdr->compress_type,4,1,fp);
fread(&hdr->data_size,4,1,fp);
fread(&hdr->resol_hori,4,1,fp);
fread(&hdr->resol_vert,4,1,fp);
fread(&hdr->nr_colors,4,1,fp);
fread(&hdr->important_color,4,1,fp);
if(hdr->offset>54)//获得位图有效信息,偏移量=54时,才读的是位图第一个像素
fread(&hdr->info,1024,1,fp);
fclose(fp);//关闭文件
returnhdr;
}
6.3、给图像加入椒盐噪声
#include
#include
#include
#include
#include"hdr.h"
#defineSALT500//加盐数量为500
#definePEPPER500//加椒数量为500
structbmphdr*hdr;
unsignedchar*bitmap;
intmain(intargc,char*argv[3])
{
inti,nr_pixels;//定义整数i用于函数循环时的,nr_pixels用于计算位图的像素个数
intsum=0;//sum用来存放用模块后新的像素值
introw,column;//用来临时保存该产生噪声的像素
FILE*fp,*fpnew;//定义两个文件指针分别用于提取原图像的数据和进行邻域平均后的图像
//定义主函数的参数包括:
输入的位图文件名和输出的位图文件名
argc=3;
argv[1]="test.bmp";
argv[2]="testsaltpepper.bmp";
if(argc!
=3)
{
printf("pleaseinputthenameofinputandoutbitmapfiles\n");
exit
(1);
}
//获取位图文件相关信息
hdr=get_header(argv[1]);
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;
bitmap=malloc(nr_pixels);
//读取位图数据到bitmap中
fread(bitmap,nr_pixels,1,fp);
fclose(fp);
for(i=0;i { //在0~nr_pixels中随机生成一个数,即选择要加上盐的像素 row=rand()%hdr->height; column=rand()%hdr->width; bitmap[row*256+column]=(unsignedchar)255;//盐为白色,所以给该像素赋值为255 } for(i=0;i { //在0~nr_pixels中随机生成一个数,即选择要加上椒的像素 row=rand()%hdr->height; column=rand()%hdr->width; bitmap[row*256+column]=(unsignedchar)0;//椒为黑色,所以给该像素赋值为0 } //打开一个以输出文件名命名的文件,设为可写的二进制形式 fpnew=fopen(argv[2],"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); return0; } 七、运行截图 7.1原位图 7.2加入“盐”噪声后生成的位图 7.3加入“椒”噪声后生成的位图 7.4加入椒盐噪声后生成的位图 八、分析思考 这次实验的原理并不难理解,但是在实验中还是遇到了不少问题。 VC里面单步跟踪是个很管用的东西,我在程序结果不正确时,经常通过单步跟踪来确定出错的地方然后加之更正。 在这里,我把所遇到的问题,分析以及我的解决方法列在下面,以供以后实验借鉴。 所遇问题 分析原因 解决方法 盐全部几种在图像的下面部分,如下图 temp=rand()%nr_pixels中temp是int型,而int型的数有效范围是-32767~32767,所以不能获得32768~65536之间的随机数 1、可采取“回避”法,换一种取随机中的算法 2、把temp换成长整型或浮点型。 运行了几次但每次生成的图像中噪声分布都一样 可以让系统获取当前时间,让其转换为int值,再从这个范围内通过对nr_pixels取整,获得一个从0~nr_pixels范围内的随机数 srand((unsignedint)time(NULL)); i=(rand()%nr_pixels); 在做实验时,我通过反复测试,惊讶的发现在读取位图上每个像素的信息时,居然是从左下角开始读的(我之前一直以为是左上角)。 但实验过程中我有个地方一直想不明白也费了很多时间去调试的地方是,在随机算法中,我先是用temp=rand()%nr_pixels来获取一个从0~65536的随机数,但只能对一半图像加上噪声,单步跟踪时也没发现什么问题,我只好换一种算法来获得随机数,即row=rand()%hdr->weight;column=rand()%hdr->height;bitmap[row*256+column]=255;就一切正常了。 可是这两种获取随机数的方法实质上应该是一样的啊……后天听室友做的时候也出现相同状况,经过分析后发现temp是int型,而int型的数有效范围是-32767~32767,所以不能获得32768~65536之间的随机数,才恍然大悟只能给图像的一半加噪声的原因。 九、心得体会 通过本次实验,我学会了如何给图像中加噪声,也对随机数算法有了进一步的了解。 同时, 关于获得一个随机数,我通过网上资料查询发现根据获取系统当前时间,然后让其转换为数值型,再从这个范围内通过对nr_pixels取整,可以获得一个从0~nr_pixels范围内的随机数,由于每次运行系统的时间肯定不一样,所以这样来获得随机数确实是个好方法。 上次实验我们是学会如何去掉图像中的噪声,而这次实验是要求在原图像上加噪声。 相对来说无论从思路上还是语句上都要比上次要简单,可见破坏一样东西要比恢复容易! 而且即使是再高明的算法,再先进的电脑,对破坏了的图像也不能恢复到跟以前一模一样了……所以我们要好好珍惜现在拥有的每一样东西,不要等失去时才后悔莫及。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像 处理 邻域 平均 中值 滤波 实验 报告