数字图像处理_邻域平均法和中值滤波处理_实验报告
数字图像处理实验报告
数字图像处理实验报告数字图像处理实验报告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图像进行处理。
数字图像处理报告
中南民族大学计算机科学学院数字图像处理实验报告年级 09级专业计算机科学与技术指导教师李波小组成员(姓名学号) 09061232 陆文美实验类型综合型成绩评定评语:教师签名:年月日2012年5月15 日一、实验安排1.实验目的加深对数字图像处理理论课程的理解,进一步熟悉数字图像处理课程的相关算法和原理。
2.实验内容实验二:(1)选择一副图像,叠加椒盐噪声,分别用邻域平均法和中值滤波法对该图像进行滤波,显示滤波后的图像,比较和分析各滤波器的效果。
(2)选择一副图像,叠加零均值高斯噪声,设计一种处理方法,既能去噪声,又能保持边缘清晰。
3.实验环境Matlab7二、算法原理(1)邻域平均法有力的抑制了噪声,同时也引起了模糊,模糊程度与邻域半径成正比,该方法程序中主要用到了fspecial和filter2函数,fspecial函数主要用于创建一个指定的滤波器模板filter2函数主要进行二维线性数字滤波。
Matlab代码1:邻域平均法:I=imread('eight.tif');J=imnoise(I,'salt & pepper',0.02);subplot(231),imshow(I);title('原图象');subplot(232),imshow(J);title('添加椒盐噪声图象')k1=filter2(fspecial('average',3),J);k2=filter2(fspecial('average',5),J);k3=filter2(fspecial('average',7),J);k4=filter2(fspecial('average',9),J);subplot(233),imshow(uint8(k1));title('3*3模版平滑滤波'); subplot(234),imshow(uint8(k1));title('5*5模版平滑滤波'); subplot(235),imshow(uint8(k1));title('7*7模版平滑滤波'); subplot(236),imshow(uint8(k1));title('9*9模版平滑滤波'); 2:中值滤波法:I=imread('eight.tif');I=imread('eight.tif');J=imnoise(I,'salt & pepper', 0.02);subplot(231),imshow(I);title('原图象');subplot(232),imshow(J);title('添加椒盐噪声图像')k1=medfilt2(J);k2=medfilt2(J,[5,5]);k3=medfilt2(J,[7,7]);k4=medfilt2(J,[9,9]);subplot(233),imshow(k1);title('3*3模板中值滤波') subplot(234),imshow(k1);title('5*5模板中值滤波') subplot(235),imshow(k1);title('7*7模板中值滤波') subplot(236),imshow(k1);title('9*9模板中值滤波')3:叠加零均值高斯噪声:I=imread('tire.tif');[M,N]=size(I);II1=zeros(M,N);for i=1:16II(:,:,i)=imnoise(I,'gaussian',0,0.01);II1=II1+double(II(:,:,i));if or(or(i==1,i==4),or(i==8,i==16));figure;imshow(uint8(II1/i));endend四、实验结果1:邻域平均法:2:中值滤波法:3:叠加零均值高斯噪声:一、实验安排1.实验目的加深对数字图像处理理论课程的理解,进一步熟悉数字图像处理课程的相关算法和原理。
数字图像处理实验报告(邻域平均法和中值滤波法)
数字图像处理实验报告(邻域平均法和中值滤波法)数字图像处理实验报告班级:姓名:学号:日期:邻域平均法和中值滤波处理一、实验目的图像变换是数字图像处理中的一种综合变换,如直方图变换、几何变换等。
通过本实验,使得学生掌握两种变换的程序实现方法。
二、实验任务请设计程序,分别用邻域平均法,其模板为:和中值滤波法对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++)<>。
数字图像处理滤波报告
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 稍大杂点的简单平滑分析原因,可以发现平滑线性滤波器的工作原理可以比喻为用水冲洗桌面上的污点,冲洗的结果污点并没有消失,只是被淡化,如果污点较大较密集,则冲洗的结果是整个桌面都被污点所影响。
尝试换一种思路,如果不采取冲淡污点的办法而是将污点直接去除,这样就可以避免污点数量较多时难以去除的困难,这也就是中值滤波的基本思想。
在中值滤波算法中,对于孤立像素的属性并不非常关注,而是认为图像中的每个像素都跟邻域内其他像素有着密切的关系,对于每一个邻域,算法都会在采样得到的若干像素中,选择一个最有可能代表当前邻域特征的像素的灰度作为中心像素灰度,这样就有效避免了离散型杂点对图像的影响。
数字图像处理实验教学报告.doc
数字图像处理实验报告实验内容:主要实现以下几个内容:⑴直方图均衡化(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邻域平均和计算邻域标准差,再对其黑暗部分的特征进行局域增强而保持明亮部分图像不变,显示增强后的效果图。
在进行局域增强时,应按下列算法进行:E ·f (x ,y ) if m Sxy ≤k 0M G and k 1D G ≤σSxy ≤k 2D G f (x ,y )otherwisen =g (x ,y )=适当调整k 0,k 1和k 2的值,使局域增强达到最佳效果。
多媒体图像处理实验——中值滤波实验报告
中值滤波:一.实验原理中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。
方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。
二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。
W为二维模板,通常为3*3,5*5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
二.实验内容用大小为5×5的中值滤波器对图1进行处理,在不同窗口中显示原图像及各处理结果图像。
图1—待处理图像三.实验程序%对边缘进行拓展再进行5*5滤波clearI=imread('D:\lvbo.jpg'); %读入原图像I=double(I);figure()subplot(121); %画出原图像imshow(I,[]);title('before');[M,N]=size(I);new=ones(M+4,N+4); %定义对原图像进行边沿拓展之后的新图像new(3:(M+2),3:(N+2))=I(1:M,1:N);%3到M+2行,3到N+2列与原图像相等new(1,3:N+2)=I(2,:); %行对称拓展new(2,3:N+2)=I(1,:);new(M+3,3:N+2)=I(M,:);new(M+4,3:N+2)=I(M-1,:);new(:,1)=new(:,4); %列对称拓展new(:,2)=new(:,3);new(:,N+3)=new(:,N+2);new(:,N+4)=new(:,N+1);for i=1:M; %1到M 行,1到N 列用5*5模板循环计算中值并赋值给中间数 for j=1:N; %即进行中值滤波A=new(i:i+4,j:j+4);A=A(:);B=sort(A,'ascend');C=median(B);new(i+2,j+2)=C;end ;end ;D=new(3:M+2,3:N+2);subplot(122);imshow(D,[]);title('after'); %显示均值滤波后的图像四.结果分析经过中值滤波前后图像如图2所示,由图可以看出,中值滤波后,去除了椒盐噪声,且处理之后的图像相比较于均值滤波处理之后的图像清晰,所以中值滤波效果优于均值滤波。
邻域平均实验报告
一、试验内容: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)中值滤波法算法思想:把以某像素为中心的小窗口内的所有像素的灰度按从小到大排序,取排序结果的中间值作为该像素的灰度值。
数字图像处理实验二报告(图像滤波器)
实验报告课程名称数字图像处理实验名称图像滤波器姓名学号 20120712 专业班级数媒1202 实验日期 2014 年 10 月 16日成绩指导教师一、实验目的1.继续熟悉仿真工具MATLAB2.巩固图像读取与显示的方法3.掌握给图像添加噪声的方法4.掌握图像空间域的滤波方法5.掌握图像频率域的滤波方法二、实验原理图像的平滑有模糊图像和消除噪声的功能。
图像锐化则是使模糊的图像变清晰,增强图像的边缘细节。
对图的处理像既可以在频率域内进行,又可在空间域进行(一般为模版卷积方式)。
从信号频谱角度来讲,信号缓慢变化的部分(大面积背景区和灰度变化缓慢的区域)在频域表现为低频,迅速变化的部分(图像边缘、跳跃以及噪声等灰度变化剧烈的区域)则表现为高频。
因此,通过低通滤波来实现图像的平滑,而高通滤波可以实现图像的锐化。
三、实验环境Windows XP/ Windows 7Matlab 7.0.1/ Matlab R2008四、实验内容与步骤1.空间平滑域操作读取并显示一幅灰度图像,对原图像分别添加高斯噪声和椒盐噪声,并显示添加噪声之后的图像:调整高斯噪声和椒盐噪声的参数,比较不同参数之间噪声的区别;进行平滑操作,观察、记录并比较实验结果;针对两幅含有噪声的图像,采用中值滤波方法进行平滑处理,观察并记录实验结果,并将之与上一步实验结果相比较,得出结论。
2.空间锐化操作读取并显示一幅灰度图像,分别采用Prewitt水平/垂直边缘检测算子,Sobel水平/垂直边缘检测算子对原图像进行锐化操作,比较实验结果;采用拉普拉斯模板进行锐化处理,与上一步骤实验结果相比较。
3.图形的频域处理1)利用循环语句,自己构建理想低通滤波器;对一幅弧度图像进行傅里叶变换,显示其频谱图;对一幅灰度图像作频率域理想低通滤波,调整滤波器半径,观察并记录不同结果,分析原因;2)利用循环语句,自己构建理想高通滤波器;对同一幅灰度图像作频率域理想高通滤波,调整滤波器半径,观察并记录不同结果,分析原因;五、实验结果与分析(可提供屏幕抓图)1.添加高斯噪声与椒盐噪声:结论:高斯噪声的参数越大,图像变得越模糊,亮度也越亮。
数字图像处理实验三(邻域平均法和中值滤波)
数字图像处理 实验三
邻域平均法(box 模板)和中值滤波处理
加入脉冲噪声后的图像:testnoise.bmp 去噪过程 结果图像
请设计程序,分别用邻域平均法,其模板为:
和中值滤波法对testnoise 图像进行去噪处理(中值滤波的模板的大小也设为3×3)。
得出实验结果图像后,比较这两种方法去噪的效果好坏,并分析具体原因。
完成上述工作后,使用程序进行验证分析:使用邻域平均法时,3×3和5×5模板大小对图像进行处理的效果有何差别?并分析原因。
附加说明:程序框架可以参考第二次实验指导书上给出的示例程序。
邻域平均法 中值滤波法
⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎣⎡1111*1111191。
数字图像处理实验报告2
实验二: 数字图像的空间域滤波——平滑滤波1. 1. 实验目的2.掌握图像滤波的基本定义及目的。
3.理解空间域滤波的基本原理及方法。
4.掌握进行图像的空域滤波的方法。
1. 2. 实验基本原理2.空间域增强空间域滤波是在图像空间中借助模板对图像进行领域操作, 处理图像每一个像素的取值都是根据模板对输入像素相应领域内的像素值进行计算得到的。
空域滤波基本上是让图像在频域空间内某个范围的分量受到抑制, 同时保证其他分量不变, 达到增强图像的目的。
空域滤波一般分为线性滤波和非线性滤波两类。
各种空域滤波器根据功能主要分为平滑滤波器和锐化滤波器。
平滑的目的可分为两类: 一类是模糊, 目的是在提取较大的目标前去除太小的细节或将目标内的小肩端连接起来;另一类是消除噪声。
锐化的目的是为了增强被模糊的细节。
结合这两种分类方法, 可将空间滤波增强分为四类:线性平滑滤波器(低通)非线性平滑滤波器(低通)线性锐化滤波器(高通)非线性锐化滤波器(高通)1)空间滤波器都是基于模板卷积, 其主要工作步骤是:2)将模板在图中移动, 并将模板中心与图中某个像素位置重合;3)将模板上的系数与模板下对应的像素相乘;4)将所有乘积相加;5)将和(模板的输出响应)赋给图中对应模板中心位置的像素。
3.平滑滤波器1)线性平滑滤波器线性低通平滑滤波器也称为均值滤波器, 这种滤波器的所有系数都是正数, 对3×3的模板来说, 最简单的是取所有系数为1, 为了保持输出图像任然在原来图像的灰度值范围内, 模板与象素邻域的乘积都要除以9。
MATLAB 提供了fspecial 函数生成滤波时所用的模板, 并提供filter2和imfilter 函数用指定的滤波器模板对图像进行运算。
函数fspecial 的语法格式为:h=fspecial(type);h=fspecial(type,parameters);其中参数type 指定滤波器的种类, parameters 是与滤波器种类有关的具体参数。
数字图像处理实验三(附源程序)
南京航空航天大学 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 某某
数字图像处理实验报告
数字图像处理试验报告实验二:数字图像的空间滤波与频域滤波姓名:XX学号:2XXXXXXX 实验日期:2017 年4 月26 日1、实验目的1、掌握图像滤波的基本定义及目的。
2、理解空间域滤波的基本原理及方法。
3、掌握进行图像的空域滤波的方法。
4、掌握傅立叶变换及逆变换的基本原理方法。
5、理解频域滤波的基本原理及方法。
6、掌握进行图像的频域滤波的方法。
2、实验内容与要求1、平滑空间滤波:1) 读出一幅图像,给这幅图像分别加入椒盐噪声与高斯噪声后并与前一张图显示在同一图像窗口中。
2) 对加入噪声图像选用不同的平滑(低通)模板做运算,对比不同模板所形成的效果, 要求在同一窗口中显示。
3) 使用函数 imfilter 时, 分别采用不同的填充方法( 或边界选项, 如零填充、’replicate’、’symmetric’、’circular’)进行低通滤波,显示处理后的图像。
4) 运用for 循环,将加有椒盐噪声的图像进行10 次,20 次均值滤波,查瞧其特点, 显示均值处理后的图像(提示:利用fspecial 函数的’average’类型生成均值滤波器)。
5) 对加入椒盐噪声的图像分别采用均值滤波法,与中值滤波法对有噪声的图像做处理,要求在同一窗口中显示结果。
6) 自己设计平滑空间滤波器,并将其对噪声图像进行处理,显示处理后的图像。
2、锐化空间滤波1) 读出一幅图像,采用3×3 的拉普拉斯算子 w = [ 1, 1, 1; 1 – 8 1; 1, 1, 1]对其进行滤波。
2) 编写函数w = genlaplacian(n),自动产生任一奇数尺寸n 的拉普拉斯算子,如5×5的拉普拉斯算子w = [ 1 1 1 1 11 1 1 1 11 1 -24 1 11 1 1 1 11 1 1 1 1]3) 分别采用5×5,9×9,15×15与25×25大小的拉普拉斯算子对blurry_moon、tiff (x, y) -∇2 f (x, y) 完成图像的锐化增强,观察其有何进行锐化滤波,并利用式g(x, y) =不同,要求在同一窗口中显示。
实用文库汇编之数字图像处理实验三中值滤波和均值滤波实验报告
*作者:座殿角*作品编号48877446331144215458创作日期:2020年12月20日实用文库汇编之数字图像处理实验三均值滤波、中值滤波的计算机实现12281166 崔雪莹计科1202班一、实验目的:1)熟悉均值滤波、中值滤波处理的理论基础;2)掌握均值滤波、中值滤波的计算机实现方法;3)学习VC++ 6。
0 的编程方法;4)验证均值滤波、中值滤波处理理论;5)观察均值滤波、中值滤波处理的结果。
二、实验的软、硬件平台:硬件:微型图像处理系统,包括:主机,PC机;摄像机;软件:操作系统:WINDOWS2000或WINDOWSXP应用软件: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{// 构造public: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(int nWidth,int nHeight,BYTE *lpInput,BYTE*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()函数,对原始图像转化为灰度图像之后再显示。
数字图像处理实验三中值滤波和均值滤波实验报告
数字图像处理实验三均值滤波、中值滤波的计算机实现12281166 崔雪莹计科1202 班一、实验目的:1)熟悉均值滤波、中值滤波处理的理论基础;2)掌握均值滤波、中值滤波的计算机实现方法;3)学习VC++ 6。
0 的编程方法;4)验证均值滤波、中值滤波处理理论;5)观察均值滤波、中值滤波处理的结果。
二、实验的软、硬件平台:硬件:微型图像处理系统,包括:主机,PC机;摄像机;软件:操作系统:WINDOWS2000或WINDOWSXP应用软件:VC++6.0三、实验内容:1)握高级语言编程技术;2)编制均值滤波、中值滤波处理程序的方法;3)编译并生成可执行文件;4)考察处理结果。
四、实验要求:1)学习VC+确6。
0编程的步骤及流程;2)编写均值滤波、中值滤波的程序;3)编译并改错;4)把该程序嵌入试验二给出的界面中(作适当修改);5)提交程序及文档;6)写出本次实验的体会。
五、实验结果截图实验均值滤波采用的是3X3的方块,取周围的像素点取得其均值代替原像素点。
边缘像素的处理方法是复制边缘的像素点,增加一个边框,计算里面的像素值得均值滤波。
均值氓浜1W赵六、实验体会本次实验在前一次的实验基础上增加均值滤波和中值滤波,对于椒盐噪声的处理,发现中值滤波的效果更为好一点,而均值滤波是的整个图像变得模糊了一点,效果差异较大。
本次实验更加增加了对数字图像处理的了解与学习。
七、实验程序代码注释及分析// HistDemoADIg.h :头文件//#in elude "ImageWnd.h"#pragma once// CHistDemoADIg 对话框classCHistDemoADIg : public CDialogEx{//构造public:CHistDemoADlg(CWnd* pParent = NULL); // 标准构造函数intnWidth;intnHeight;intnLen;intnByteWidth;BYTE *lpBackup;BYTE *lpBitmap;BYTE *lpBits;CStringFileName;CImageWndsource,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:voidLoadBitmap(void);afx_msg void OnOpen();afx_msg void OnHist();voidHistogramEq(void);voidNoColor(void);void HistogramEq1(intnWidth,intnHeight,BYTE *lpInput,BYTE *lpOutput);voidMeanFilter(intnWidth,intnHeight,BYTE *lpInput,BYTE *lpOutput);voidMedianFilter(intnWidth,intnHeight,BYTE *lpInput,BYTE *lpOutput); afx_msgvoid 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.setlmage()显示处理之后的图像,以及NoColor()函数,对原始图像转化为灰度图像之后再显示。
完整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、程序运⾏结果⽐较。
数字图像处理实验报告 (2)
数字图像处理实验报告实验一数字图像基本操作及灰度调整一、实验目得1)掌握读、写图像得基本方法。
2)掌握MATLAB语言中图像数据与信息得读取方法。
3)理解图像灰度变换处理在图像增强得作用。
4)掌握绘制灰度直方图得方法,理解灰度直方图得灰度变换及均衡化得方法。
二、实验内容与要求1.熟悉MATLAB语言中对图像数据读取,显示等基本函数特别需要熟悉下列命令:熟悉imread()函数、imwrite()函数、size()函数、Subplot()函数、Figure()函数。
1)将MA TLAB目录下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.灰度变换灰度变换就是图像增强得一种重要手段,它常用于改变图象得灰度范围及分布,就是图象数字化及图象显示得重要工具。
1)图像反转灰度级范围为[0,L-1]得图像反转可由下式获得2)对数运算:有时原图得动态范围太大,超出某些显示设备得允许动态范围,如直接使用原图,则一部分细节可能丢失。
图像处理实验报告
图像处理实验报告专业:姓名:学号:1几种边缘检测算子比较简单做了几组算子的边缘检测效果对比,包括几组梯度算子和二阶倒数算子。
这里简单记录一下Roberts算子、Sobel算子、Prewitt 算子、Log算子、Canny算子的运算原理与结果。
1.1Roberts算子Roberts算子是一种利用局部差分来寻找边缘的算子,Roberts 梯度算子所采用的是对角方向相邻两像素值之差,算子形式如下:Gx = f(i,j) - f(i-1,j-1)Gy = f(i-1,j) - f(i,j-1)|G(x,y)| = sprt(Gx^2+Gy^2)Roberts梯度算子对应的卷积模版为然后选择适当的阈值τ,若G ( x,y)>τ,则(i ,j)为边缘点,否则,判断(i ,j)为非边缘点。
由此得到一个二值图像{ g (i,j)},即边缘图像。
1.2Sobel算子Sobel算子在边缘检测算子扩大了其模版,在边缘检测的同时尽量削弱了噪声。
其模版大小为3×3,其将方向差分运算与局部加权平均相结合来提取边缘。
Sobel算子所对应的卷积模版为然后选择适当的阈值τ,若G ( x,y)>τ,则(i ,j)为边缘点,边缘定位精度不够高。
当对精度要求不是很高时,是一种较为常用的边缘检测方法。
1.3Prewitt 算子同Sobel 算子相似,Prewitt 算子也是一种将方向的差分运算和局部平均相结合的方法,也是取水平和垂直两个卷积核来分别对图像中各个像素点做卷积运算,所不同的是,Sobel 算子是先做加权平均然后再微分,Prewitt 算子是先平均后求微分,其对应的卷积模版为梯度幅值G ( x,y),然后选取适当的阈值τ,若G ( x,y)>τ,则(i ,j)为边缘点,否则,判断(i ,j)为非边缘点。
由此得到一个二值图像{ g (i,j)},即边缘图像。
1.4Log 算子Log算子基本思想是:先在一定的围做平滑滤波,然后再利用差分算子来检测在相应尺度上的边缘。
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区域,可以取方形,也可以取近似圆形或十字形。
MATLAB自编均值和中值滤波实验报告
实验二数字图像的空间域滤波一、实验目的1、理解图像空间域滤波的原理;2、掌握图像均值滤波、中值滤波的原理与实现方法;3、掌握上述方法的改进方法。
二、实验原理均值滤波的主要步骤为:(1)将模板在途中漫游,并将模板中心与途中某个象素位置重合;(2)将模板上系数与模板下对应象素相乘;(3)将所有乘积相加;(4)将和(模板的输出响应)赋给途中对应模板中心位置的象素。
中值滤波的主要步骤为:(1)将模板在途中漫游,并将模板中心与途中某个象素位置重合;(2)读取模板下各对应象素的灰度值;(3)将这些灰度值从小到大排成1列;(4)找出这些值里排在中间的1个;(5)将这个中间值赋给对应模板中心位置的象素。
三、实验内容基本要求:1、自己编程实现图像的均值滤波;2、自己编程实现图像的中值滤波;3、利用matlab图像处理工具箱中的函数实现图像的上述处理;扩展要求:4、实现一种图像加权中值滤波或加权均值滤波;四、实验步骤1、编程实现图像的均值滤波程序代码:h=imread('444.jpg'); %读入彩色图片c=rgb2gray(h); %把彩色图片转化成灰度图片,256级figure,imshow(c),title('原始图象'); %显示原始图象g=imnoise(c,'gaussian',0.1,0.002); %加入高斯噪声figure,imshow(g),title('加入高斯噪声之后的图象');Y2=avefilt(g,3); %调用自编函数进行均值滤波,n为模板大小figure,imshow(Y2),title('用自己的编写的函数进行均值滤波之后的结果'); Y4=midfilt(g,3); %调用自己编写的函数进行中值滤波,figure,imshow(Y4),title('用自己编写的函数进行中值滤波之后的结果');自己编写的脚本代码均值滤波function d=avefilt(x,n)a(1:n,1:n)=1; %a即n×n模板,元素全是1p=size(x); %输入图像是p×q的,且p>n,q>nx1=double(x);x2=x1;%A(a:b,c:d)表示A矩阵的第a到b行,第c到d列的所有元素for i=1:p(1)-n+1for j=1:p(2)-n+1c=x1(i:i+(n-1),j:j+(n-1)).*a; %取出x1中从(i,j)开始的n行n列元素与模板相乘s=sum(sum(c)); %求c矩阵(即模板)中各元素之和x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %将模板各元素的均值赋给模板中心位置的元素endend%未被赋值的元素取原值d=uint8(x2);中值滤波function d=midfilt(x,n)p=size(x); %输入图像是p×q的,且p>n,q>nx1=double(x);x2=x1;for i=1:p(1)-n+1for j=1:p(2)-n+1c=x1(i:i+(n-1),j:j+(n-1)); %取出x1中从(i,j)开始的n行n列元素,即模板(n×n的)e=c(1,:); %是c矩阵的第一行for u=2:ne=[e,c(u,:)]; %将c矩阵变为一个行矩阵endmm=median(e); %mm是中值x2(i+(n-1)/2,j+(n-1)/2)=mm; %将模板各元素的中值赋给模板中心位置的元素endend%未被赋值的元素取原值d=uint8(x2);程序运行截图五、实验结果分析从实验结果可以看出,中值滤波较均值滤波效果好些,并且滤波与所选的模板有关,若选择权值相同(本实验为0.1/9)相对不同权值的效果好些。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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);
所遇问题
分析原因
解决方法
盐全部几种在图像的下面部分,如下图
temp=rand()%nr_pixels中temp是int型,而int型的数有效范围是-32767~32767,所以不能获得32768~65536之间的随机数
1、可采取“回避”法,换一种取随机中的算法
2、把temp换成长整型或浮点型。
运行了几次但每次生成的图像中噪声分布都一样
可以让系统获取当前时间,让其转换为int值,再从这个范围内通过对nr_pixels取整,获得一个从0~nr_pixels范围内的随机数
srand((unsigned int)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之间的随机数,才恍然大悟只能给图像的一半加噪声的原因。
其中,hdr.h用来定义位图头文件的结构体,hdr.c用来读取位图的头文件信息,ff.c用来对图像加上椒盐噪声。
5.3
位图头文件的数据结构如下:
/*以下为定义位图头文件的结构体*/
struct bmphdr
{
char signature[2];//文件类型
int size;//位图大小
short reserved[2];//两个保留字
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);
}
hdr = (struct bmphdr *)malloc(sizeof(struct bmphdr));//分配空间
fread(hdr->signature, 2, 1, fp);
if (hdr->signature[0] != 'B' || hdr->signature[1] != 'M')//如果打开文件的扩展名不是.BMP,则说明不是
fread(&hdr->important_color, 4, 1, fp);
if (hdr->offset > 54) //获得位图有效信息,偏移量=54时,才读的是位图第一个像素
fread(&hdr->info, 1024, 1, fp);
fclose(fp);//关闭文件
return hdr;
row = rand()%hdr->height;
column = rand()%hdr->width;
bitmap[row*256+column] = (unsigned char)0;//椒为黑色,所以给该像素赋值为0
}
// 打开一个以输出文件名命名的文件,设为可写的二进制形式
fpnew = fopen(argv[2], "wb+");
column = rand()%hdr->width;
bitmap[row*256+column] =(unsigned char) 255;//盐为白色,所以给该像素赋值为255
}
for(i = 0; i < PEPPER; i++)//加入PEPPER“颗”椒
{
//在0~nr_pixels中随机生成一个数,即选择要加上椒的像素
}
6.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <memory.h>
#include "hdr.h"
#define SALT 500 //加盐数量为500
#define PEPPER 500//加椒数量为500
struct bmphdr *hdr;
BMP位图文件
{
printf("Not a bmp file!\n");
return NULL;
}
//以下都是读位图头文件信息
fread(&hdr->size, 4, 1, fp);
fread(hdr->reserved, 4, 1, fp);
fread(&hdr->offset, 4, 1, fp);
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);
FILE *fp, *fpnew;//定义两个文件指针分别用于提取原图像的数据和进行邻域平均后的图像
//定义主函数的参数包括:输入的位图文件名和输出的位图文件名
argc=3;
argv[1]="test.bmp";
argv[2]="testsaltpepper.bmp";
if (argc != 3)
{
printf("please input the name of input and out bitmap files\n");
exit(1);
}
// 获取位图文件相关信息
hdr = get_header(argv[1]);
if (!hdr) exit(1);
//以二进制可读方式打开输入位图文件
fp = fopen("test.bmp", "rb");
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);
unsigned char *bitmap;
int main(int argc,char *argv[3])
{
int i, nr_pixels;//定义整数 i 用于函数循环时的,nr_pixels用于计算位图的像素个数
int sum = 0;//sum用来存放用模块后新的像素值
int row,column;//用来临时保存该产生噪声的像素
short nr_planes;//位平面数
short bits_per_pixel;//每像素的位数
int compress_type;//压缩类型
int data_size;//数据大小
int resol_hori;//水平
int resol_vert;//垂直
int nr_colors;
int important_color;
{
FILE *fp;
struct bmphdr *hdr;
fp = foቤተ መጻሕፍቲ ባይዱen(filename, "rb");//打开位图文件
if (!fp)//位图文件打开出错时给出提示
{
printf("File open error or such file does not exist!\n");
return NULL;
四、实验环境
操作系统:Windows XP
试验平台:VC++ 6.0
五、设计思路
5.1
5.1.1、
基本思想是:生成一些随机数,根据这些随机数把对应的像素灰度级设为255。
5.1.
基本思想是:生成一些随机数,根据这些随机数把对应的像素灰度级设为0。
5.2
该程序一共包含3个文件hdr.h,hdr.c,和ff.c
char info[1024];
};
struct bmphdr *get_header(char filename[]);