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

合集下载

数字图像处理实验报告

数字图像处理实验报告

数字图像处理实验报告数字图像处理实验报告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、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  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;。

相关文档
最新文档