数字图像处理实验报告
数字图像处理与分析
课程设计
2014 ~ 2015学年第二学期
院(系) 计算机科学与通信工程 专业 计算机科学与技术 班级 计算机1201 学号
学生姓名 指导老师 刘哲
一. 实验目的:
熟悉数字图像处理中各种椒盐噪声的实质,明确各种滤波算法的的原理。进一步熟悉
matlab 的编程环境,熟悉各种滤波算法对应的matlab 函数。实验结果给以数字图像处理课程各种算法处理效果一个更直观的印象。
二. 实验原理:
1.IPT(图像处理工具箱) 基本函数介绍
1. imread函数
该函数用于从图形文件中读出图像。格式A=IMRAED(FILENAME,FMT)。该函数把FILENAME 中的图像读到A 中。若文件包含一个灰度图, 则为二维矩阵。若文件包含一个真彩图(RGB),则A 为一三维矩阵。FILENAME 指明文件,FMT 指明文件格式。格式[X,MAP]=IMREAD(FILENAME,FMT).把FILENAME 中的索引图读入X, 其相应的调色板读到MAP 中. 图像文件中的调色板会被自动在范围[0,1]内重新调节。FMT 的可能取值为jpg 或jpeg,tif 或tiff,bmp,png,hdf,pcx,xwd 。
2.imwrite 函数
该函数用于把图像写入图形文件中。格式IMWRITE(A,FILENAME,FMT)把图像A 写入文件FILENAME 中。FILENAME 指明文件名, FMT指明文件格式。A 既可以是一个灰度图, 也可以是一个真彩图像。格式IMWRITE(X,MAP,FILENAME,FMT)把索引图及其调色板写入FILENAME 中。MAP 必须为合法的MATLAB 调色板, 大多数图像格式不支持多于256色的调色板。FMT 的可能取值为tif 或tiff,jpg 或jpeg,bmp,png,hdf,pcx,xwd 。
3. imshow函数
显示图像。格式IMSHOW(I,N).用N 级离散灰度级显示灰度图象I 。若省略N, 默认用256级灰度显示24位图像,64级灰度显示其他系统。格式IMSHOW(I,[LOW HIGH]),把I 作为灰度图显示。LOW 值指定为黑色,HIGH 指定为白色,中间为按比例分布的灰色。若[LOW,HIGH]为[],则函数把图像中的最小值显示为黑色, 最大值显示为白色。 2.图像几何变换
1.imcrop 函数
该函数用于把一幅图像经裁剪后放入一指定的矩形中。例如在以下的语法格式中IMCORP 显示输入图像, 并等待用鼠标指定矩形。
2.imrotate 函数
该函数用于旋转图像。格式B=IMROTATE(A,ANGLE,METHOD)。用于把图像A 按逆时针方向和特殊的填充方法旋转ANGLE 度,METHOD 可取以下值: “nearest ”:默认值, 用最近邻插值。 “bilinear ”:用双线性插值。 “bicubic ”:用双立方插值。 3.直方图绘制
IMHIST 函数
该函数用于计算图像数据的直方图。格式IMHIST(I,N).用于显示灰度图像I 的N 级直方图。对灰度图默认N 为256,对二值图默认N 为2。格式IMHIST(X,MAP)。用于显示索引图的直方图。 5. 直方图均衡
HISTEQ 函数
该函数用直方图均衡的方法增强图像的对比度。例如用直方图均衡的方法增强一幅灰度图。
三. 实验内容:
1. 给出一幅灰度图像,请加上高斯噪声,绘制其直方图,选择合适的滤波器滤波,并做直方图均衡。(利用IPT 函数) 实验代码:
f=imread('Fig0318(a)(ckt-board-orig).tif'); imshow(f);
H=imnoise(f,'salt & pepper',0.05) imhist(f); figure; imshow(H);
H1=fspecial('average' ,[3 3]); %3*3均值滤波 MotionBlur1 = imfilter(H,H1,'replicate' ); figure;
imshow(MotionBlur1)
J=histeq(H); %直方图均衡化 figure;
imhist(J); %直方图均衡化后的直方图 figure,imshow(J); %直方图均衡化后的图片
实验原始图像:
加上椒盐噪声后的照片
:
加入椒盐噪声后的直方图:
使用均值滤波器后的图片:
直方图均衡化后的直方图:
直方图均衡化后的图片:
2. 给出一幅图像,请加上高斯噪声,选择合适的滤波器滤波,并做直方图均衡。(不能使用IPT 加噪声、滤波与直方图均衡函数) 实验代码:
I=imread('Fig0318(a)(ckt-board-orig).tif'); imshow(I);%实验图像 figure,imhist(I); array1 = size(I); a=im2double(I) s = 0.01;
J = a + sqrt(s)*randn(array1); figure,imshow(J);%加入高斯噪声后的图像 figure,imhist(J);
n=3; p=size(I); p1=double(I); p2=p1;
for i=1:p(1)-n+1 for j=1:p(2)-n+1
c=p1(i:i+(n-1),j:j+(n-1)).*1; s=sum(sum(c));
p2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); end end
K=uint8(p2);
figure,imshow(K);%均值滤波后的图像 figure,imhist(K); array1=double(K); [m,n]=size(K); c=255; result=0; x=zeros(1,256); y=zeros(1,256); z=zeros(1,256); for i=1:m for j=1:n
t=array1(i,j); y(t+1)=y(t+1)+1; end end
for k=1:256
z(k)=y(k)/(m*n); end
for l=1:256
result=result+z(l); x(l)=result; end
x=round(c*x); for i1=1:m for j1=1:n
M(i1,j1)=x(array1(i1,j1)+1); end end
P=uint8(M);
figure,imshow(P);%直方图均衡后的图像 figure,imhist(P);
实验图像:
原图像直方图:
加高斯噪声后的图像:
加高斯噪声后的直方图:
直方图均衡后的图像:
直方图均衡后的图像的直方图
四. 实验总结
:
Matlab 数字图像处理整体来说比c 语言好用的多。很多时候,我们可以直接利用现成的函数而不必了解其中的具体过程。但是,第二题的,主要还是利用了滤波的真正算法思想,相当于在matlab 中将整个滤波,加噪声的算法重新过了一遍。整个实验,进一步熟悉了matlab 编程,熟悉掌握matlab 中与数字头图像处理有关的函数及其用法,也进一步巩固了之前所学的算法的基本思想。也让我明白在实际应用之中,对于特定的情形,一般会有最好的滤波等处理方法,我们应该努力寻找此情景下的最佳算法。