数字图像处理实验报告
实验一数字图像处理编程基础
一、实验目的
1. 了解MATLAB图像处理工具箱;
2. 掌握MATLAB的基本应用方法;
3. 掌握MATLAB图像存储/图像数据类型/图像类型;
4. 掌握图像文件的读/写/信息查询;
5. 掌握图像显示--显示多幅图像、4种图像类型的显示方法;
6. 编程实现图像类型间的转换。
二、实验容
1. 实现对图像文件的读/写/信息查询,图像显示--显示多幅图像、4种图像类型的显示方法、图像类型间的转换。
2. 运行图像处理程序,并保存处理结果图像。
三、源代码
I=imread('cameraman.tif')
imshow(I);
subplot(221),
title('图像1');
imwrite('cameraman.tif')
M=imread('pout.tif')
imview(M)
subplot(222),
imshow(M);
title('图像2');
imread('pout.bmp')
N=imread('eight.tif')
imview(N)
subplot(223),
imshow(N);
title('图像3');
V=imread('circuit.tif')
imview(V)
subplot(224),
imshow(V);
title('图像4');
N=imread('C:\Users\Administrator\Desktop\1.jpg') imshow(N);
I=rgb2gary(GRB)
[X.map]=gary2ind(N,2)
RGB=ind2 rgb(X,map)
[X.map]=gary2ind(I,2)
I=ind2 gary(X,map)
I=imread('C:\Users\dell\Desktop\111.jpg'); subplot(231),imshow(I);
title('原图');
M=rgb2gray(I);
subplot(232),imshow(M);
[X,map]=gray2ind(M,100);
subplot(233),imshow(X);
RGB=ind2rgb(X,map);
subplot(234),imshow(X);
[X,map]=rbg2ind(I);
subplot(235),imshow(X);
四、实验效果
实验二 图像几何变换实验
一、实验目的
1.学习几种常见的图像几何变换,并通过实验体会几何变换的效果;
2.掌握图像平移、剪切、缩放、旋转、镜像等几何变换的算法原理及编程实现; 3.掌握matlab 编程环境中基本的图像处理函数。
二、实验原理
1. 初始坐标为(,)x y 的点经过平移00(,)x y ,坐标变为(',')x y ,两点之间的关系为:
''x x x y y y =+??
=+?,以矩阵形式表示为: 00'10'01100
11x x x y y y ??????
??????=??????????????????
2. 图像的镜像变换是以图象垂直中轴线或水平中轴线交换图像的变换,分为垂直镜像变换
和水平镜像变换,两者的矩阵形式分别为:
'100'01010011x x y y -????????????=??????????????????'100'01010011x x y y ??????
??????=-??????????????????
3. 图像缩小和放大变换矩阵相同:
'00'0010
11X y x S x y S y ????????????=??????????????????
当1x S ≤,1y S ≤时,图像缩小;当1x S ≥,1y S ≥时,图像放大。
4. 图像旋转定义为以图像中某一点为原点以逆时针或顺时针方向旋转一定 角度。其变换矩
阵为:
'cos sin 0'sin cos 010
11x x y y θθθθ??????
??????=-??????????????????
该变换矩阵是绕坐标轴原点进行的,如果是绕一个指定点旋转,则先要将坐标系平移到该点,
进行旋转,然后再平移回到新的坐标原点。
三、实验容
1. 启动MATLAB程序,对图像文件分别进行平移、垂直镜像变换、水平镜像变换、缩放和旋转操作。
2.运行图像处理程序,并保存处理结果图像。
四、源代码及实验效果
1.平移
I=imread('circuit.tif');
subplot(121),imshow(I);
title('before');
I=double(I);
M=zeros(size(I));
N=size(I);
x=10;
y=10;
M(x+1:N(1),y+1:N(2))=I(1:N(1)-x,1:N(2)-y);
subplot(122),imshow(uint8(M));
title('after');
2.水平垂直镜像
I=imread('pout.tif');
subplot(131),imshow(I);
title('before');
I=double(I);
A=zeros(size(I));
B=zeros(size(I));
M=size(I);
A(1:M(1),1:M(2))=I(M(1):-1:1,1:M(2)); B(1:M(1),1:M(2))=I(1:M(1),M(2):-1:1); subplot(132),imshow(uint8(A));
title('竖直');
subplot(133),imshow(uint8(B));
title('水平');
3.缩放
I=imread('pout.tif');
subplot(131),imshow(I);
title('before');
I=double(I);
A=zeros(size(I));
B=zeros(size(I));
[m,n]=size(I);
x=1.8;
y=1.8;
x2=0.85;
y2=0.85;
for i=1:m
for j=1:n
i1=round(i*x);
j1=round(j*y);
i2=round(i*x2);
j2=round(j*y2);
if(j1>=0)&&(i1>=0)&&(i1<=m)&&(j1<=n)
A(i,j)=I(i1,j1);
end
if(j2>=0)&&(i2>=0)&&(i2<=m)&&(j2<=n)
B(i,j)=I(i2,j2);
end
end
end
subplot(132),imshow(uint8(A));
title('small');
subplot(133),imshow(uint8(B));
title('big');
4.旋转
jiao=50;
M=imread('cameraman.tif');
imshow(M);
[h w]=size(M);
theta=jiao/180*pi;
rot=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1]; %建立变换矩阵
pix1=[1 1 1]*rot; %变后左上
pix2=[1 w 1]*rot; %变后右上
pix3=[h 1 1]*rot; %变后左下
pix4=[h w 1]*rot; %变后右下
height=round(max([abs(pix1(1)-pix4(1))+0.5 abs(pix2(1)-pix3(1))+0.5])); %新宽width=round(max([abs(pix1(2)-pix4(2))+0.5 abs(pix2(2)-pix3(2))+0.5])); %新高N=zeros(height,width);
chao_y=abs(min([pix1(1) pix2(1) pix3(1) pix4(1)])); %y负轴超量
chao_x=abs(min([pix1(2) pix2(2) pix3(2) pix4(2)])); %x负轴超量
for i=1-chao_y:height-chao_y
for j=1-chao_x:width-chao_x
pix=[i j 1]/rot; %用变换后图像的点的坐标去寻找原图像点的坐标,
float_Y=pix(1)-floor(pix(1)); %向下舍入
float_X=pix(2)-floor(pix(2));
if pix(1)>=1 && pix(2)>=1 && pix(1) <= h && pix(2) <= w
pix_up_left=[floor(pix(1)) floor(pix(2))]; %四个相邻的点
pix_up_right=[floor(pix(1)) ceil(pix(2))];
pix_down_left=[ceil(pix(1)) floor(pix(2))];
pix_down_right=[ceil(pix(1)) ceil(pix(2))];
value_up_left=(1-float_X)*(1-float_Y); %周围四个点权重
value_up_right=float_X*(1-float_Y);
value_down_left=(1-float_X)*float_Y;
value_down_right=float_X*float_Y;
N(i+chao_y,j+chao_x)=value_up_left*M(pix_up_left(1),pix_up_left(2))+ ...
value_up_right*M(pix_up_right(1),pix_up_right(2))+ ...
value_down_left*M(pix_down_left(1),pix_down_left(2))+ ...
value_down_right*M(pix_down_right(1),pix_down_right(2));
end
end
end
figure,imshow(uint8(N))
实验三 图像增强实验
一、实验目的
1. 掌握基本的图像增强方法,观察图像增强的效果,加深对灰度直方图的理解。
2. 掌握对数和和指数增强,直方图均衡化方法,重点掌握图像直方图增强的原理和程序设计。
二、实验原理
对数变化能对原图像的动态围进行压缩,其数学表达如下:
log(1||)t C s =+
其中C 为尺寸比例常数。
指数变化一般的表示形式:[(,)]
(,)1c f x y a g x y b
-=-(a,b,c 用于调整曲线的位置和形状
的参数。)
利用直方图统计的结果,使图像的直方图均衡的方法称为直方图均衡化,直方图均衡化可以达到增强图像显示效果的作用。通过直方图统计,可以观察出,图像中各种亮度所占的比例大部分布不均匀,设法增加在直方图统计中所占比例高的象素和其他比例少的象素之间亮度差,可以提高图像的显示效果。简单来说,直方图增强的方法就是压缩直方图中比例少的象素所占用的灰度围,多出来的灰度空间按照统计比例分配给直方图中比例高的象素使用。这种方法主要是针对人眼对灰度差别越大的图像越容易分辨的特点而进行的增强。
三、实验容
1.实现对数增强或指数增强。
2.实现图像直方图均衡化增强。
四、分析思考
思考为什么进行图像直方图均衡化后,能够增强图像效果。
答:因为直方图均衡化处理之后,原来比较少像素的灰度会被分配到别的灰度去,像素相对集中,处理后灰度围变大,对比度变大,清晰度变大,所以能有效增强图像。
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
五、源代码及实验效果
1.对数增强
I=imread('cameraman.tif');
subplot(221);
imshow(I);
I=double(I);
I2=41*log(1+I);
I2=uint8(I2);
subplot(222);
imshow(I2);
2.指数增强
I=imread('circuit.tif'); >> [M,N]=size(I);
>> g=zeros(M,N);
>> I=double(I);
>> g=double(g);
>> k1=min(min(I)); >> k2=max(max(I)); >> a=(k2-k1)/2;
b=k2-80;
c=k1-20;
for i=1:M
for j=1:N
g(i,j)=b^(c*(I(i,j)-a))-1; end
end
>> figure;
>> subplot(121);
imshow(I,[]);
>> subplot(122);
>> imshow(g,[]);
>>
3.直方图均衡化增强
I=imread('pout.tif');
graydis=zeros(1,256); %设置矩阵大小graydispro=zeros(1,256);
new_graydis=zeros(1,256);
new_graydispro=zeros(1,256);
[h w]=size(I);
N=zeros(h,w);
%计算原始直方图各灰度级像素个数graydis
for x=1:h
for y=1:w
graydis(1,I(x,y))=graydis(1,I(x,y))+1; end
end
%计算原始直方图graydispro
graydispro=graydis./sum(graydis);
subplot(2,2,1);
plot(graydispro);
title('灰度直方图');
xlabel('灰度值');ylabel('像素的概率密度');
%计算原始累计直方图
for i=2:256
graydispro(1,i)=graydispro(1,i)+graydispro(1,i-1);
end
%计算和原始灰度对应的新的灰度t[],建立映射关系
for i=1:256
t(1,i)=floor(254*graydispro(1,i)+0.5);
end
%统计新直方图各灰度级像素个数
for i=1:256
new_graydis(1,t(1,i)+1)=new_graydis(1,t(1,i)+1)+graydis(1,i); end
%计算新的灰度直方图new_graydispro
new_graydispro=new_graydis./sum(new_graydis);
subplot(2,2,2);
plot(new_graydispro);
title('均衡化后的灰度直方图');
xlabel('灰度值');ylabel('像素的概率密度');
%计算直方图均衡后的新图new_tu
for x=1:h
for y=1:w
N(x,y)=t(1,I(x,y));
end
end
subplot(2,2,3),imshow(I,[]);
title('原图');
subplot(2,2,4),imshow(N,[]);
title('直方图均衡化后的图');
实验四图像滤波实验
一、实验目的
掌握中值滤波方法,掌握图像锐化方法,比较各个梯度算子锐化的效果。掌握频域滤波方法,观察低通滤波和高通滤波的效果。
二、实验原理
中值滤波是一种非线性平滑滤波,它是用一个有奇数点的滑动窗口,将窗口中心点的值用窗口各点的中值代替。
图像的锐化是使边缘和轮廓线模糊的图像变得清晰,使其细节更加清晰。从数学上看,图像模糊的实质是图像受到平均或者积分运算的影响,因此对其进行逆运算(如微分运算)就可以使图像清晰。
在频域上卷积被表示为乘积,因此在频域上对图像进行滤波就变得更加直观了。在频域上进行滤波的步骤:
计算需增强的图像的傅里叶变化。
将其与1个传递函数相乘。
再将结果进行傅里叶逆变化可以得到增强的图像。
三、实验容
1. 选择测试图像分别添加高斯、椒盐、泊松噪声,实现中值滤波;
2. 选择测试图像实现两种常用梯度算子(Sobel算子、Prewitt算子);
3. 选择测试图像实现理想低通滤波;
4. 选择测试图像实现巴特沃斯高通滤波。
四、分析思考
依次给出“均值滤波器、中值滤波器、laplace滤波器”是线性还是非线性的。
答:均值滤波器和中值滤波器是线性的,laplace滤波器是非线性的。
五、源代码及实验效果
1.椒盐噪声
I=imread('cameraman.tif');
I=imnoise(I,'salt & pepper',0.02);
I=double(I);
[dep,wide]=size(I);
M=ones(size(I));
for i=3:dep-2
for j=3:wide-2
M(i,j)=median([I(i-2,j-2) I(i-2,j-1) I(i-2,j) I(i-2,j+1) I(i-2,j+2) I(i-1,j-2) I(i-1,j-1) I(i-1,j) I(i-1,j+1) I(i-1,j+2) I(i,j-2) I(i,j-1) I(i,j) I(i,j+1) I(i,j+2) I(i+1,j-2) I(i+1,j-1) I(i+1,j) I(i+1,j+1) I(i+1,j+2) I(i+2,j-2) I(i+2,j-1) I(i+2,j) I(i+2,j+1) I(i+2,j+2)]);
end
end
for i=3:dep-2
M(i,1)=M(i,3);
M(i,2)=M(i,3);
M(i,wide-1)=M(i,wide-2);
end
M(1,:)=M(3,:);
M(2,:)=M(3,:);
M(dep,:)=M(dep-2,:);
M(dep-1,:)=M(dep-2,:);
figure
subplot(121),imshow(uint8(I));
subplot(122),imshow(uint8(M));
2.高斯噪声
3.泊松噪声