数字图像处理实验报告(邻域平均法和中值滤波法)

合集下载

数字图像处理实验报告

数字图像处理实验报告

数字图像处理实验报告数字图像处理实验报告161420230 蔡讴实验一1.获取实验用图像:rice.jpg. 使用imread函数将图像读入Matlab。

a=imread('D\:rice.png');figure;title(‘原图’);axis on;imshow(a);2.产生灰度变换函数T1,使得:0.3r r < 0.35s = 0.105 + 2.6333(r –0.35) 0.35 ≤r ≤0.651 + 0.3(r – 1) r > 0.65用T1对原图像rice.jpg进行处理,使用imwrite函数保存处理后的新图像。

a=double(a)/256;figure,imhist(a),title('原直方图');axis on;r=[0:0.001:1];s1=[r<0.35].*r*0.3+[r<=0.65].*[r>=0.35].*(0.105+2.6333*(r-0.35))+[ r>0.65].*(1+0.3*(r-1));a1=[a<0.35].*a*0.3+[a<=0.65].*[a>=0.35].*(0.105+2.6333*(a -0.35)) +[a>0.65].*(1+0.3*(a-1));figure,imshow(a1),title('改后一');axis on;figure,imhist(a1),title('改后直方图一');axis on;imwrite(a1,'改后rice一.jpg');3.产生灰度变换函数T2,使得:s =用T2对原图像rice.jpg 进行处理,使用imwrite 保存处理后的新图像。

r2=[0:0.001:1];t2=[r2<=0.5].*(15.9744*r2.^5)+[r2>0.5].*((r2-0.5).^0.2+0.12); subplot(2,3,5); plot(r2,t2,'r'); title('更改后直方图');subplot(2,3,4); imshow(a); title('更改后');A3=[a<=0.5].*(15.9744*a.^5)+[a>0.5].*((a-0.5).^0.2+0.12); subplot(2,3,6); imshow(A3); title('更改后');imwrite(A3,'更改_3.jpg','jpg');15.9744r 5 r ≤ 0.5 (r – 0.5)0.2+ 0.12 r > 0.54.分别用s = r0.6; s = r0.4; s = r0.3对kids.tiff图像进行处理。

数字图像处理实验报告(邻域平均法和中值滤波法)

数字图像处理实验报告(邻域平均法和中值滤波法)

数字图像处理实验报告(邻域平均法和中值滤波法)数字图像处理实验报告班级:姓名:学号:日期:邻域平均法和中值滤波处理一、实验目的图像变换是数字图像处理中的一种综合变换,如直方图变换、几何变换等。

通过本实验,使得学生掌握两种变换的程序实现方法。

二、实验任务请设计程序,分别用邻域平均法,其模板为:和中值滤波法对testnoise 图像进行去噪处理(中值滤波的模板的大小也设为3X 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;i} // 填补最后一排for(i=1;i} // 填补左边一排for(i=0;i} // 填补右边一排for(i=0;i<nr_h+3;i++)< p="">{ 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);</nr_h+3;i++)<>。

数字图像处理实验报告

数字图像处理实验报告

实验三、图像的傅立叶变换一、实验目的1、了解图像变换的意义和手段;2、熟悉傅里叶变换的性质;3、熟练掌握FFT变换及其应用;4、通过实验了解二维频谱的分布特点;5、通过本实验掌握利用MATLAB编程实现数字图像的傅立叶变换。

二、实验设备1、计算机;2、MATLAB软件;3、记录用的笔、纸。

4、移动式存储器(软盘、U盘等)。

三、实验原理1、应用傅立叶变换进行图像处理傅里叶变换是线性系统分析的一个有力工具,它能够定量地分析诸如数字化系统、采样点、电子放大器、卷积滤波器、噪音和显示点等的作用。

通过实验培养这项技能,将有助于解决大多数图像处理问题。

2、傅立叶(Fourier)变换的定义二维Fourier变换和二维离散傅立叶变换为:图像的傅立叶变换与一维信号的傅立叶变换变换一样,有快速算法,具体参1见相关书目,有关傅立叶变换的快速算法的程序不难找到。

实际上,现在有实现傅立叶变换的芯片,可以实时实现傅立叶变换。

四、实验步骤1、打开计算机,启动MATLAB程序;2、利用MatLab工具箱中的函数编制FFT频谱显示的函数;3、 a).调入、显示“实验一”获得的图像;图像存储格式应为“.gif”;b)对这幅图像做FFT并利用自编的函数显示其频谱;4、实现数字图像傅立叶变换的部分参考程序:I=imread(‘原图像名.gif’); %读入原图像文件imshow(I); %显示原图像fftI=fft2(I); %二维离散傅立叶变换sfftI=fftshift(fftI); %直流分量移到频谱中心RR=real(sfftI); %取傅立叶变换的实部II=imag(sfftI); %取傅立叶变换的虚部A=sqrt(RR.^2+II.^2);%计算频谱幅值A=(A-min(min(A)))/(max(max(A))-min(min(A)))*225; %归一化figure; %设定窗口imshow(A); %显示原图像的频谱五、实验数据记录输入数字图像傅立叶变换的代码如下:I=imread(‘fengshu.gif’);imshow(I);fftI=fft2(I);sfftI=fftshift(fftI);RR=real(sfftI);II=imag(sfftI);A=sqrt(RR.^2+II.^2);A=(A-min(min(A)))/(max(max(A))-min(min(A)))*225;figure;imshow(A);运行以上程序原图像经傅立叶变换后的图像3实验四、图像的离散余弦变换和哈达玛变换一、实验目的1、了解图像离散余弦变换和逆变换的原理;2、理解离散余弦变换系数的特点;3、理解离散余弦变换在图像数据压缩中的应用;4、理解哈达玛变换的原理。

数字图像处理滤波报告

数字图像处理滤波报告

2010年4月一,实验目的。

1.了解在数字图像处理中滤波的概念和意义。

2.掌握数字图像处理滤波程序。

二,实验原理。

图像的中值滤波是一种非线性的图像处理方法,它通过对邻域内像素按灰度排序的结果决定中心像素的灰度。

图像的中值滤波是统计排序滤波器的一种常见应用,它是通过对邻域内采样数据进行排序并取得中值来决定中心像素灰度的一种处理手段,图像的中值滤波在少量离散杂点的消除方面效果显著。

前面介绍过图像简单平滑和高斯平滑,以这两种算法为代表的平滑线性滤波算法在消除离散型杂点方面,都采取的是将杂点的干扰分摊到整个邻域中的每个像素,以减少杂点的影响,然而这样做的代价就是图像清晰度的大量损失。

如图11-14所示,a表示一个5×5邻域的像素灰度,其中中点位置的像素为孤立的杂点,b为对a进行一次简单平滑处理的结果,c 为对b进行简单平滑的结果,从图中可看出简单平滑将杂点对图像的影响分担到了邻域的其他像素。

图11-14 孤立杂点的简单平滑从图11-14中可以发现简单平滑对于孤立的杂点消除较为有效,而对于稍大的杂点或是密集的杂点,图像简单平滑的效果就不够理想。

如图11-15所示,其中a表示一个5×5邻域的像素灰度,其中灰度为0的点为杂点,b为对a进行简单平滑的结果,从图中可以看出简单平滑使画面质量严重下降,并且并没有很好地去除杂点影响。

图11-15 稍大杂点的简单平滑分析原因,可以发现平滑线性滤波器的工作原理可以比喻为用水冲洗桌面上的污点,冲洗的结果污点并没有消失,只是被淡化,如果污点较大较密集,则冲洗的结果是整个桌面都被污点所影响。

尝试换一种思路,如果不采取冲淡污点的办法而是将污点直接去除,这样就可以避免污点数量较多时难以去除的困难,这也就是中值滤波的基本思想。

在中值滤波算法中,对于孤立像素的属性并不非常关注,而是认为图像中的每个像素都跟邻域内其他像素有着密切的关系,对于每一个邻域,算法都会在采样得到的若干像素中,选择一个最有可能代表当前邻域特征的像素的灰度作为中心像素灰度,这样就有效避免了离散型杂点对图像的影响。

邻域平均实验报告

邻域平均实验报告

一、试验内容:1.熟悉程序基本框架;2.读取位图,转换为灰度图;3.完成灰度图像的平滑和锐化处理。

二、试验方法:1. 图像平滑(1)邻域平均法算法思想:邻域平均法是用像素及其指定邻域内像素的平均值或加权平均值作为该像素的新值,以便除去突变的像素点,从而滤除一定的噪声。

本试验采用3*3高斯模板对图像进行处理,主要程序如下:void CWvltDoc::Onsmo(){// TODO: Add your command handler code hereLPBITMAPINFOHEADER lpBitmapInfoHeader = (LPBITMAPINFOHEADER)(m_pBitmap+14);//信息头LPBITMAPFILEHEADER lpBitmapFileHeader = (LPBITMAPFILEHEADER)m_pBitmap;//文件头unsigned char *lpData = m_pBitmap + lpBitmapFileHeader->bfOffBits;//指向实际位图信息数据unsigned long biHeight = lpBitmapInfoHeader->biHeight;unsigned long biWidth = lpBitmapInfoHeader->biWidth;unsigned long biAlign = ( biWidth*3+3) /4 *4;//实际宽度unsigned long bmSize = biHeight * biAlign;if (m_pTransfered == NULL)m_pTransfered = (unsigned char*)malloc(bmSize);if (m_pTransfered2 == NULL)m_pTransfered2 = (unsigned char*)malloc(bmSize);if (m_pTransfered2 == NULL)return ;int tem_height,tem_width,tem[3][3]={1,2,1,2,4,2,1,2,1};double tem_xishu;tem_height=3;tem_width=3;tem_xishu=16;int x, y, cur;for (y = 0; y < (int)biHeight; y++){for (x = 0; x < (int)biWidth; x++){cur = y*biAlign+3*x; //current pixel当前像素位置m_pTransfered[cur]=(lpData[cur]+lpData[cur+1]+lpData[cur+2])/3;m_pTransfered[cur+1]=m_pTransfered[cur];m_pTransfered[cur+2]=m_pTransfered[cur];}}for (int j = 0; j < (int)biHeight; j++){for (int i = 0; i < (int)biWidth; i++){cur = j*biAlign+3*i;m_pTransfered2[cur]=(m_pTransfered[cur-biAlign-3]*tem[0][0]+m_pTransfered[cur-3]*tem [0][1]+m_pTransfered[cur-3+biAlign]*tem[0][2]+m_pTransfered[cur-biAlign]*tem[1][0]+m_pTr ansfered[cur]*tem[1][1]+m_pTransfered[cur+biAlign]*tem[1][2]+m_pTransfered[cur-biAlign+3] *tem[2][0]+m_pTransfered[cur+3]*tem[2][1]+m_pTransfered[cur+3+biAlign]*tem[2][2])/tem_xi shu;m_pTransfered2[cur+1]= m_pTransfered2[cur];m_pTransfered2[cur+2]= m_pTransfered2[cur];}}UpdateAllViews(NULL);}(2)中值滤波法算法思想:把以某像素为中心的小窗口内的所有像素的灰度按从小到大排序,取排序结果的中间值作为该像素的灰度值。

数字图像处理实验三(邻域平均法和中值滤波)

数字图像处理实验三(邻域平均法和中值滤波)

数字图像处理 实验三
邻域平均法(box 模板)和中值滤波处理
加入脉冲噪声后的图像:testnoise.bmp 去噪过程 结果图像
请设计程序,分别用邻域平均法,其模板为:
和中值滤波法对testnoise 图像进行去噪处理(中值滤波的模板的大小也设为3×3)。

得出实验结果图像后,比较这两种方法去噪的效果好坏,并分析具体原因。

完成上述工作后,使用程序进行验证分析:使用邻域平均法时,3×3和5×5模板大小对图像进行处理的效果有何差别?并分析原因。

附加说明:程序框架可以参考第二次实验指导书上给出的示例程序。

邻域平均法 中值滤波法
⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎣⎡1111*1111191。

数字图像处置实验报告3

数字图像处置实验报告3

安阳工学院数字图像处置实验报告实验名称:数字图像处置学院(系):电气系专业班级:通信工程专升本2020 姓名: 王帅学号:0019实验一数字图像直方图均衡化一、实验目的把握大体的图象均衡化方式,观看图象增强的成效,加深对灰度直方图的明白得。

熟悉图象格式、颜色系统间的转换。

二、实验内容对照度增强,灰度变换,直方图均衡化,图象滑腻,图象锐化。

给定一幅如下的图象(Matlab提供‘’),作如下增强处置操作:1.用直接灰度变换方式进行对照度增强,设计分段线性变换函数,做增强处置;2.统计原图的灰度直方图,并利用直方图均衡方式进行图象增强;3.利用Matlab函数IMNOISE(),在原图上别离叠加高斯噪声和椒盐噪声,对照线性滑腻滤波器和非线性滑腻滤波器(中值滤波)的性能;4.利用线性锐化器和非线性锐化滤波器增强原图象的边缘信息;对上述实验内容,自己制造性地设计实验,得出成心义的结论。

三、实验分析1.灰度变换是图像增强的一种重要手腕,用于改善图像显示成效,属于空域处置方式,它可使图像动态范围加大,使图像对照度扩展,图像加倍清楚,特点加倍明显。

灰度变换依照映射函数可分为线性、分段线性、非线性。

2.对每一个灰度值,求出在图像中该灰度值的像素的图形称为灰度值直方图,简称直方图。

直方图均衡化确实是把一已知灰度概率散布的图像通过一种变换,使之演变成一幅具有均灰度概率散布的新图像。

3.图像滑腻的要紧目的是减少图像噪声。

线性滑腻滤波器包括领域平均法(均值滤波器),非线性滑腻滤波器有中值滤波器。

领域平均法对抑制噪声是有效的,可是随着领域的加大,图像的模糊程度也越发严峻;中值滤波器产生的模糊较少,更适合于排除图像的鼓舞噪声点。

4.图像锐化的要紧目的是为了突出图像的边缘信息,增强图像的轮廓特点,以便于人眼的观看和机械的识别。

非线性锐化滤波器典型的有梯度算子,图像通过梯度运算后,留下灰度值急剧转变的边沿处的点,这确实是图像通过梯度运算后可使其细节清楚从而达到锐化目的的实质;线性锐化滤波器比较典型的有拉普拉斯算子。

数字图像处理实验

数字图像处理实验

数字图像处理实验实验总学时:10学时实验目的:本实验的目的是通过实验进一步理解和掌握数字图像处理原理和方法。

通过分析、实现现有的图像处理算法,学习和掌握常用的图像处理技术。

实验内容:数字图像处理的实验内容主要有三个方面:(1) 对图像灰度作某种变换,增强其中的有用信息,抑制无用信息,使图像的视在质量提高,以便于人眼观察、理解或用计算机对其作进一步的处理。

(2) 用某种特殊手段提取、描述和分析图像中所包含的某些特征和特殊的信息,主要的目的是便于计算机对图像作进一步的分析和理解,经常作为模式识别和计算机视觉的预处理。

这些特征包括很多方面,例如,图像的频域特性、灰度特征、边界特征等。

(3) 图像的变换,以便于图像的频域处理。

实验一图像的点处理实验内容及实验原理:1、灰度的线性变换灰度的线性变换就是将图像中所有的点的灰度按照线性灰度变换函数进行变换。

该线性灰度变换函数是一个一维线性函数:灰度变换方程为:其中参数为线性函数的斜率,函数的在y轴的截距,表示输入图像的灰度,表示输出图像的灰度。

要求:输入一幅图像,根据输入的斜率和截距进行线性变换,并显示。

2、灰度拉伸灰度拉伸和灰度线性变换相似。

不同之处在于它是分段线性变换。

表达如下:其中,(x1,y1)和(x2,y2)是分段函数的转折点。

要求:输入一幅图像,根据选择的转折点,进行灰度拉伸,显示变换后的图像。

3、灰度直方图灰度直方图是灰度值的函数,描述的是图像中具有该灰度值的像素的个数,其横坐标表示像素的灰度级别,纵坐标表示该灰度出现的频率(象素的个数)。

要求:输入一幅图像,显示它的灰度直方图,可以根据输入的参数(上限、下限)显示特定范围的灰度直方图。

4、直方图均衡:要求1 显示一幅图像pout.bmp的直方图;2 用直方图均衡对图像pout.bmp进行增强;3 显示增强后的图像。

实验二:数字图像的平滑实验内容及实验原理:1.用均值滤波器(即邻域平均法)去除图像中的噪声;2.用中值滤波器去除图像中的噪声3. 比较两种方法的处理结果 实验步骤:用原始图象lena.bmp 或cameraman.bmp 加产生的3%椒盐噪声图象合成一幅有噪声的图象并显示;1. 用均值滤波器去除图像中的噪声(选3x3窗口);2. f (x 0,y 0)=Med {f (x,y )∨x ∈[x 0−N,x 0+N ],y ∈[y 0−N,y 0+N ]}用中值滤波器去除图像中的噪声(选3x3窗口做中值滤波);3. 将两种处理方法的结果与原图比较,注意两种处理方法对边缘的影响。

数字图像处理实验-滤波

数字图像处理实验-滤波

实验三1.实验目的:(1)对指定图像进行均值、中值滤波增强,比较增强的效果;(2)对图片进行噪声处理,进行图像恢复;2.实验内容:对指定图像进行均值、中值滤波增强,比较增强的效果。

图1是一张原始人物图像,图2是一张近似20%像素带有冲激噪声后的人物图像。

现分别利用①5×5区域的邻域平均法和②5×5中值滤波法对图2进行去噪声处理,进行图像恢复。

将原始图像及增强后的图像都显示于屏幕上,观察两种方法对去噪的不同作用。

图1图23.实验结果(代码&结果可视化)1、利用已有的图像处理应用软件集成环境编写相应的平滑程序。

5×5邻域平均法:邻域平均是最简单的平滑滤波,即是将原图的一个像素的灰度值和它周围邻近的24个像素的灰度值相加,然后求得的平均值作为新图该像素的灰度值。

具体算法类似与图像锐化。

5×5中值滤波法:采用滑动窗口法设窗口为5×5 的矩形,该窗口在被处理的图像上逐点移动内含25个像素,每次移动均计算一次中值,赋给窗口中间点,作为其灰度,具体算法类似邻域平均。

2、核心程序:邻域平均核心算法类似梯度锐化,本报告只给出中值滤波的核心程序:// 开始中值滤波// 行(除去边缘几行)for(i = iFilterMY; i < lHeight - iFilterH + iFilterMY + 1; i++){// 列(除去边缘几列)for(j = iFilterMX; j < lWidth - iFilterW + iFilterMX + 1; j++){// 指向新DIB第i行第j个像素的指针lpDst = (unsigned char*)lpNewDIBBits + lLineBytes * (lHeight - 1 - i) + j;// 读取滤波器数组for (k = 0; k < iFilterH; k++){for (l = 0; l < iFilterW; l++){lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i + iFilterMY - k) + j - iFilterMX + l;// 保存像素值aValue[k * iFilterW + l] = *lpSrc;}}// 获取中值* lpDst = GetMedianNum(aValue, iFilterH * iFilterW);}}4.实验分析和总结采用滤波器(低频/高频)处理后的图像可以更加平滑,可以对图像去除噪音,恢复到原始图像。

数字图像处理实验三(附源程序)

数字图像处理实验三(附源程序)

南京航空航天大学 close al329
某某
%%%%%%%%处理 test3_1.jpg I=imread('test3_1.jpg'); I=im2double(I); %%%%%%%%邻域平均函数“nlfilter” tic J=nlfilter(I,[5 5],@mean2); toc tic T=nlfilter(I,[5 5],@std2); toc figure(1),subplot(2,3,1),imshow(I),title('原始图像');axis on; subplot(2,3,2),imshow(J),title('邻域均值图像');axis on; subplot(2,3,3),imshow(T),title('邻域均值标准差图像');axis on; imwrite(J,'nlfilterl 滤波后.jpg'); %%%%%%%%加噪声后用邻域平均法 I=imnoise(I,'gaussian',0,0.02); J=nlfilter(I,[5 5],@mean2); T=nlfilter(I,[5 5],@std2); subplot(2,3,4),imshow(I),title('加噪图像');axis on; subplot(2,3,5),imshow(J),title('加噪邻域均值图像');axis on; subplot(2,3,6),imshow(T),title('加噪邻域均值标准差图像');axis on; imwrite(J,'加噪 nlfilterl 滤波后.jpg'); %%%%%%%%%处理 test3_2.jpg I2=imread('test3_2.jpg'); J2=im2double(I2); %%%%%%%%%邻域平均窗函数“filter2” tic ave=fspecial('average',5); J2=filter2(ave,J2); 南京航空航天大学 电子信息工程学院 信息工程 041010329 某某

数字图像处理实验报告

数字图像处理实验报告

数字图像处理实验报告实验一数字图像的获取一、实验目的1、了解图像的实际获取过程。

2、巩固图像空间分辨率和灰度级分辨率、邻域等重要概念。

3、熟练掌握图像读、写、显示、类型转换等matlab函数的用法。

二、实验内容1、读取一幅彩色图像,将该彩色图像转化为灰度图像,再将灰度图像转化为索引图像并显示所有图像。

2、编程实现空间分辨率变化的效果。

三、实验原理1、图像读、写、显示I=imread(‘image.jpg’)Imview(I)Imshow(I)Imwrite(I,’wodeimage.jpg’)2、图像类型转换I=mat2gray(A,[amin,amax]);按指定的取值区间[amin,amax]将数据矩阵A转化为灰度图像I,amin对应灰度0,amax对应1,也可以不指定该区间。

[x,map]=gray2ind(I,n);按指定的灰度级n将灰度图像转化为索引图像,n默认为64I=ind2gray(x,map);索引图像转化为灰度图像I=grb2gray(RGB);真彩色图像转化为灰度图像[x,map]=rgb2ind(RGB);真彩色图像转化为索引图像RGB=ind2rgb(x,map);索引图像转化为真彩色图像BW=im2bw(I,level);将灰度图像转化为二值图像,level取值在[0,1]之间BW=im2bw(x,map,level);将索引图像转化为二值图像,level取值在[0,1]之间BW=im2bw(RGB,level);将真彩色图像转化为二值图像,level取值在[0,1]之间四、实验代码及结果1、in=imread('peppers.png');i=rgb2gray(in);[x,map]=gray2ind(i,128);subplot(131),imshow(in)subplot(132),imshow(i)subplot(133),imshow(x),colormap(map)2、%空间分辨率变化的效果clc,close all,cleari=imread('cameraman.tif');i=imresize(i,[256,256]);i1=i(1:2:end,1:2:end);[m1,n1]=size(i)i2=i1(1:2:end,1:2:end);[m2,n2]=size(i2)i3=i2(1:2:end,1:2:end);[m3,n3]=size(i3)subplot(221),imshow(i),xlabel('256x256')subplot(222),imshow(i1),xlabel('128x128')subplot(223),imshow(i2),xlabel('64x64')subplot(224),imshow(i3),xlabel('32x32')256 x 256128 x 12864 x 6432 x 32实验二图像的几何变换一、实验目的掌握图像的基本几何变换的方法1、图像的平移2、图像的旋转二、实验内容练习用matalb 命令实现图像的平移、旋转操作1、.编写实现图像平移的函数2、用imread 命令从你的硬盘读取一幅256×256灰度图;3、调用平移函数,将256×256灰度图平移100行200列,在同一个窗口中显示平移前和平移后的图像。

完整word版数字图像处理邻域平均法滤波实验报告matlab实现

完整word版数字图像处理邻域平均法滤波实验报告matlab实现

完整word版数字图像处理邻域平均法滤波实验报告matlab实现数字图像处理实验报告实验三邻域平均法滤波学号姓名实验三邻域平均法滤波⼀、实验内容选取噪声较明显的图像,分别采⽤3*3、5*5、7*7的模板进⾏邻域平均法滤波,并⽐较滤波效果。

⼆、实验步骤1、设计思想或者流程图。

邻域平均法的思想是⽤像素及其指定邻域内像素的平均值或加权平均值作为该像素的新值,以便去除突变的像素点,从⽽滤除⼀定的噪声。

邻域平均法的数学含义可⽤下式表⽰:wziii1)(x,yg mnw i(1)mn??1?i wz(x,y)为中⼼的邻域像素值;是对每个邻域像素的加权系上式中:是以ii数或模板系数;是加权系数的个数或称为模板⼤⼩。

邻域平均法中常⽤的模mn板是:111??1??11??1T??Box9??111??(2)为了解决邻域平均法造成的图像模糊问题,采⽤阈值法(⼜叫做超限邻域平均法,如果某个像素的灰度值⼤于其邻域像素的平均值,且达到⼀定⽔平,则判断该像素为噪声,继⽽⽤邻域像素的均值取代这⼀像素值;否则,认为该像素不T:是噪声点,不予取代),给定阈值0?)x,y)x,y?Tf(yf(x,)? g(0?y)xh(,?)g(x,)(yf(x,)?gx,y?Ty?0(3)f(x,y)g(x,y)是由(1)式计算的平均值,是原始含噪声图像,(3)式中,h(x,y)滤波后的像素值。

2、源程序并附上注释。

3、A=imread('1.jpg');B=rgb2gray(A);figure; imshow(B); title('原始图象');H=imnoise(B,'gaussian');figure; imshow(H); title('⾼斯噪声');Q=imnoise(B,'salt & pepper');figure; imshow(Q); title('椒盐噪声');M=fspecial('average',3*3);E=imfilter(Q,M);figure; imshow(E); title('3*3平均模板'); N=fspecial('average',5*5);K=imfilter(Q,N);figure; imshow(K); title('5*5平均模板'); Z=fspecial('average',7*7);J=imfilter(Q,Z);figure; imshow(J); title('7*7平均模板');4、程序运⾏结果⽐较。

数字图像处理实验三中值滤波和均值滤波实验报告

数字图像处理实验三中值滤波和均值滤波实验报告

数字图像处理实验三中值滤波和均值滤波实验报告数字图像处理实验三中值滤波和均值滤波实验报告数字图像处理实验三均值滤波、中值滤波的计算机实现12281166 崔雪莹计科1202 班一、实验目的:1)熟悉均值滤波、中值滤波处理的理论基础;2)掌握均值滤波、中值滤波的计算机实现方法;3)学习 VC++ 6。

0 的编程方法;4)验证均值滤波、中值滤波处理理论;5)观察均值滤波、中值滤波处理的结果。

二、实验的软、硬件平台:硬件:微型图像处理系统,包括:主机, PC 机;摄像机;软件:操作系统:WINDOWS200或0 WINDOWSX应P用软件:VC++6.0三、实验内容:1)握高级语言编程技术;2)编制均值滤波、中值滤波处理程序的方法;3)编译并生成可执行文件;4)考察处理结果。

四、实验要求:1)学习VC++确6。

0 编程的步骤及流程;2)编写均值滤波、中值滤波的程序;3)编译并改错;4)把该程序嵌入试验二给出的界面中(作适当修改);5)提交程序及文档;6)写出本次实验的体会。

五、实验结果截图实验均值滤波采用的是3X3的方块,取周围的像素点取得其均值代替原像素点。

边缘像素的处理方法是复制边缘的像素点,增加一个边框,计算里面的像素值得均值滤波。

六、实验体会本次实验在前一次的实验基础上增加均值滤波和中值滤波,对于椒盐噪声的处理,发现中值滤波的效果更为好一点,而均值滤波是的整个图像变得模糊了一点,效果差异较大。

本次实验更加增加了对数字图像处理的了解与学习。

七、实验程序代码注释及分析// HistDemoADlg.h : 头文件//#include "ImageWnd.h"#pragma once// CHistDemoADlg 对话框class CHistDemoADlg : public CDialogEx{// 构造CHistDemoADlg(CWnd* pParent = NULL); int nWidth; int nHeight; int nLen; int nByteWidth; BYTE *lpBackup; BYTE *lpBitmap; BYTE *lpBits; CString FileName; CImageWnd source,dest;// 对话框数据enum { IDD = IDD_HISTDEMOA_DIALOG }; protected:virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 支持// 实现 protected:HICON m_hIcon; // 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP()public:void LoadBitmap(void); afx_msg void OnOpen(); afx_msg void OnHist(); void HistogramEq(void); void NoColor(void);void HistogramEq1(intnWidth,intnHeight,BYTE*lpInput,BYTEpublic:// 标准构造函数*lpOutput);void MeanFilter(int nWidth,int nHeight,BYTE*lpInput,BYTE*lpOutput);void MedianFilter(int nWidth,int nHeight,BYTE*lpInput,BYTE *lpOutput);afx_msg void OnBnClickedClose();afx_msg void OnBnClickedMeanfilter(); afx_msg void OnBnClickedMedianfilter();};HistDemoADlg.cpp 对HistDemoADlg.h 进行具体的实现,OnOpen()函数响应ID 为IDC_OPEN 的按钮事件,而且会调取文件选择对话框,选取文件之后,会显示在原始图像区域显示对应的位图图像,OnHist() 函数会响应ID 为IDC_HIST 的按钮事件,调用HistogramEq() 进行直方图均衡化的处理,HistogramEq() 会调用HistogramEq1() 进行直方图均衡化的处理,并用dst.setImage() 显示处理之后的图像,以及NoColor() 函数,对原始图像转化为灰度图像之后再显示。

2空域图像滤波实验(邻域平均法、中值滤波法)

2空域图像滤波实验(邻域平均法、中值滤波法)

《图像处理技术》课程 第2次实验报告试验名称:空域图像滤波实验(邻域平均法、中值滤波法)一、试验目的1.培养学生理解中值滤波的方法2.掌握图像处理的基本方法二、试验设备1、PC 机一台,windows 操作系统;2、CCS 编程环境;三、试验原理中值滤波是由图基(Turky )在1971年提出的,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近真实值,从而消除孤立的噪声点。

对于奇数个元素,中值是指按大小排序后中间的数值;对于偶数个元素,中值是指排序后中间两个元素灰度值的平均值。

对序列而言,中值的定义是这样的:若1,...,n x x 为一组序列,先把其按大小排列为:123i i i in x x x x ≤≤≤≤ 则该序列的中值y 为:{}12121221n 2n i n n n i i x n y Med x x x x x +⎛⎫⎪⎝⎭+⎛⎫ ⎪⎝⎭⎧⎪⎪==⎨⎡⎤⎪+⎢⎥⎪⎢⎥⎣⎦⎩ 为奇数为偶数(11.5)公式11.2.5中,若把一个点的特定长度或形状的邻域作为窗口,在一维情况下,中值滤波器是一个含有奇数个像素的滑动窗口。

窗口中中间那个像素的值用窗口各像素值的中值来代替,设输入序列为{},∈i x i I ,I 为自然数集合或子集,窗口长度为n ,且令12-=n u ,则滤波器的输出为:{}{}-+==i i i u i i u y Med x Med x x x(11.6)公式11.2.6表明i 点的中值仅与窗口前后个点的中值有关,i y 为序列i x 的中值。

若把公式11-2中,中值滤波的概念推广到二维并利用某种形式的二维窗口。

则可对二维中值滤波做如下定义:设(){}2,,∈ij x i j I 表示数字图像各点的灰度值,滤波窗口为A ,ij x 点的中值,则:{}()()(){}2+*+==,,,i,j,I ij ij j r j s Ay Med x Med x r s A ∈∈(11.7)公式11.7为窗口是A的x点的中值表达式,二维中值滤波的窗口通常选为3*3,5*5ij区域,可以取方形,也可以取近似圆形或十字形。

数字图像处理实验报告

数字图像处理实验报告

数字图像处理实验报告数字图像处理实验报告实验⼀数字图像基本操作及灰度调整⼀、实验⽬的1)掌握读、写图像的基本⽅法。

2)掌握MATLAB语⾔中图像数据与信息的读取⽅法。

3)理解图像灰度变换处理在图像增强的作⽤。

4)掌握绘制灰度直⽅图的⽅法,理解灰度直⽅图的灰度变换及均衡化的⽅法。

⼆、实验内容与要求1.熟悉MATLAB语⾔中对图像数据读取,显⽰等基本函数特别需要熟悉下列命令:熟悉imread()函数、imwrite()函数、size()函数、Subplot()函数、Figure()函数。

1)将MATLAB⽬录下work⽂件夹中的forest.tif图像⽂件读出.⽤到imread,imfinfo等⽂件,观察⼀下图像数据,了解⼀下数字图像在MATLAB中的处理就是处理⼀个矩阵。

将这个图像显⽰出来(⽤imshow)。

尝试修改map颜⾊矩阵的值,再将图像显⽰出来,观察图像颜⾊的变化。

2)将MATLAB⽬录下work⽂件夹中的b747.jpg图像⽂件读出,⽤rgb2gray()将其转化为灰度图像,记为变量B。

2.图像灰度变换处理在图像增强的作⽤读⼊不同情况的图像,请⾃⼰编程和调⽤Matlab函数⽤常⽤灰度变换函数对输⼊图像进⾏灰度变换,⽐较相应的处理效果。

3.绘制图像灰度直⽅图的⽅法,对图像进⾏均衡化处理请⾃⼰编程和调⽤Matlab函数完成如下实验。

1)显⽰B的图像及灰度直⽅图,可以发现其灰度值集中在⼀段区域,⽤imadjust函数将它的灰度值调整到[0,1]之间,并观察调整后的图像与原图像的差别,调整后的灰度直⽅图与原灰度直⽅图的区别。

2) 对B 进⾏直⽅图均衡化处理,试⽐较与源图的异同。

3) 对B 进⾏如图所⽰的分段线形变换处理,试⽐较与直⽅图均衡化处理的异同。

图1.1 分段线性变换函数三、实验原理与算法分析1. 灰度变换灰度变换是图像增强的⼀种重要⼿段,它常⽤于改变图象的灰度范围及分布,是图象数字化及图象显⽰的重要⼯具。

数字图像处理实验报告

数字图像处理实验报告
对于中值滤波,对应的像素点的灰度值用窗口内的中间值代替。实现均值或中值滤波时,为了简便编程工作,可以定义一个n*n的模板数组。另外,读者需要注意一点,在用窗口扫描图像过程中,对于图像的四个边缘的像素点,可以不处理;也可以用灰度值为"0"的像素点扩展图像的边缘。
本实验采用均值滤波。
二、图象锐化
图像平滑往往使图像中的边界、轮廓变的模糊,为了减少这类不利效果的影响,这就需要利用图像鋭化技术,使图像的边缘变的清晰。图像銳化处理的目的是为了使图像的边缘、轮廓线以及图像的细节变的清晰,经过平滑的图像变得模糊的根本原因是因为图像受到了平均或积分运算,因此可以对其进行逆运算(如微分运算)就可以使图像变的清晰。从频率域来考虑,图像模糊的实质是因为其高频分量被衰减,因此可以用高通滤波器来使图像清晰。
式中f,g分别为锐化前后的图像。 表示对图像f进行二次微分的拉普拉斯算子。
四.响应函数代码及处理效果
1
void CTest1View::OnPinghua()
{
//功能:实现平滑图像
//判断图像是否打开,没打开,则弹出提示框并退出函数
if(!m_dib.m_bLoaded)
{
AfxMessageBox("图像还打开,请先打开图像!");

1、图像平滑
在空域中,图像平滑的常用方法是采用均值滤波或中值滤波。
对于均值滤波,它是用一个有奇数点的滑动窗口在图像上滑动,将窗口中心点对应的图像像素点的灰度值用窗口内的各个点的灰度值的平均值代替,如果滑动窗口规定了在取均值过程中窗口各个像素点所占的权重,也就是各个像素点的系数,这时候就称为加权均值滤波;
int masterplate[9]={0,1,0,

图像处理实验报告

图像处理实验报告

数字图像处理实验报告2013552070 王跃洋 一. 实验内容:主要实现以下几个内容:⑴直方图均衡化(histogram equalization ) ⑵直方图匹配(histogram matching ) ⑶邻域平均(neighborhood averaging ) ⑷局域增强(local enhancement ) ⑸中值滤波(median filtering )。

二.实验目的:下载安装MATLAB 图像处理工具箱,对图像进行处理;学会用Matlab 中的下列函数对输入图像进行上述5类运算;感受各种不同的图像处理方法对最终图像效果的影响。

Imhist :对灰度图像画直方图 Histeq :是图像直方图均衡化处理 Nlfilter :实现双边滤波器mean2:图像处理工具箱中的函数,用来计算矩阵元素的平均数 std2:计算矩阵元素的标准差 fspecial :建立预定义的滤波算子 filter2:使用指定的滤波器进行滤波 medfilt2:中值滤波三.实验步骤1.仔细阅读Matlab 帮助文件中有关以上函数的使用说明,能充分理解其使用方法并能运用它们完成实验内容。

2.将桌面上文件1(a).jpg 图像文件用函数imread 读入Matlab 中,对其作直方图均衡化和直方图匹配运算,显示运算前后该图像的直方图,处理后的图像和灰度变换函数。

直方图反映灰度等级的分布情况,本实验指定的直方图如下:1400×rr ≤5 7000-310×r 5<r ≤20 900-5×r 20<r ≤180 -1440+8×r 180<r ≤225 3060-12×r225<r ≤2553.将文件2.jpg 图像文件读入Matlab,用nlfilter 对其进行3×3邻域平均和计算邻域标准差,再对其黑暗部分的特征进行局域增强而保持明亮部分图像不变,显示增强后的效果图。

东南大学数字图像处理实验报告

东南大学数字图像处理实验报告

imshow(P)
处理后的图片:
4. 彩色图象锐化处理(对基色空间分别处理,然后合成)
程序:
clear all; close all; I = imread('acute.bmp'); L = [-1,-1,-1;-1,9,-1;-1,-1,-1]; P = imfilter(I , L); imshow(P)
end; P = uint8(P); imshow(P);
8. 使用小波分解产生多种分辨率图像
function y=mywavedec2(x,dim) x=modmat(x,dim); [m,n]=size(x); xd=double(x); for i=1:dim xd=modmat(xd,i); [dLL,dHL,dLH,dHH]=dwt2(xd); tmp=[dLL,dHL;dLH,dHH]; xd=dLL; [row,col]=size(tmp);
结果:
7. 图象勾边处理:用各种算勾出图象边界
1 梯度法
clear all; close all; I = imread('edge.jpg'); I = double(rgb2gray(I));
[m,n] = size(I); P = I; for i = 1:m-1 for j = 1:n-1 P(i,j) = abs(I(i,j) - I(i+1,j)) + abs(I(i,j) - I(i,j+1)); end; end; P = uint8(P); imshow(P);
end; Y = Y / (a * b); bar(X , Y)
结果:
2. 图象的线性变换:变换到最大对比度(全程变换,对比 变换前后直方图)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字图像处理实验报告班级:姓名:学号:日期:邻域平均法和中值滤波处理一、实验目的图像变换是数字图像处理中的一种综合变换,如直方图变换、几何变换等。

通过本实验,使得学生掌握两种变换的程序实现方法。

二、实验任务请设计程序,分别用邻域平均法,其模板为:和中值滤波法对testnoise 图像进行去噪处理(中值滤波的模板的大小也设为3X 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 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;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 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<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*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){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;。

相关文档
最新文档