河北工业大学数字图像处理之matlab实验报告.docx
《河北工业大学数字图像处理之matlab实验报告.docx》由会员分享,可在线阅读,更多相关《河北工业大学数字图像处理之matlab实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
河北工业大学数字图像处理之matlab实验报告
实验一
1、实验要求
1、熟悉MATLAB软件的开发环境、基本操作以及图像处理工具箱,为编写图像处理程序奠定基础。
2、掌握二进制(黑白)图像、灰度图像、彩色图像读、写和显示的基本方法,分别选择以上几种类型的图像,观察其图像类型参数。
3、说明以下程序的显示结果为何是一幅几乎全黑的图像。
clear;closeall;
myi=zeros(20,20);
myi(2:
2:
18,2:
2:
18)=1;
myi=uint8(myi);
figure,imshow(myi,'notruesize');
编写程序将图一中orangutan_1.tif图片拉伸一倍后形成orangutan_2.tif所示的图片。
4、应用MATLAB(或C)语言编写一幅灰度图像直方图统计程序,并选择一幅图像显示其直方图,将结果与MATLAB图像处理工具箱中提供的灰度直方图函数imhist的处理结果进行比较。
5、利用以上编写的程序,估算图一所示图像iris.tif中的瞳孔半径(以像素为单位)。
orangutan_1.tiforangutan_2.tifiris.tif
图一
2、实验内容
1,通过安装matlab软件,熟悉MATLAB软件的开发环境、基本操作以及图像处理工具箱
2,图像的读、写、显示和图像类型参数查看
通过I=imread(FILENAME),读取图像,注意FILENAME=‘图像文件所在的位置+文件名’;
1)通过imwrite(a,FILENAME,fmt),可以把a图像写进FILENAME图像,即是替换掉FILENAME,但是文件图像格式不替换。
2)通过imshow(I),可以把I图像显示出来。
3)例如:
在matlab软件中,运行如下命令:
I=imread('E:
\orangutan_2.tif');
figure,imshow(I)
I1=imread('E:
\iris.tif');
figure,imshow(I1)
imwrite(I,'E:
\iris.tif','tif')
I2=imread('E:
\iris.tif');
figure,imshow(I2)
原图:
orangutan_2.tifiris.tif
运行结果:
可以看到orangutan_2.tif已成功写入iris.tif中。
4)在matlab的可以查看各图像类型的参数
先在workspace中导入一幅名为xx.jpg的真彩图,然后在命令窗口输入如下命令:
I8=imread('E:
\iris.tif');
I64=double(I8)/255;
imshow(I64);
将一幅名为iris.tif的灰度图像转换成二值图像,然后观察workspace中显示的二值图像、灰度图像、和真彩图像的参数如下图所示
3,全黑图像的解释和拉伸图像程序
1)、解释
由程序myi=uint8(myi);可知此程序编写的图像在计算机中采用的是8位存储,即灰度值为0~255,其中0为黑,255为白,中间值为由黑向白过度的值。
而程序myi=zeros(20,20);构造了一个20行20列的0值矩阵,程序myi(2:
2:
18,2:
2:
18)=1;将1赋值给矩阵的2,4,6,8,10,12,14,16,18行和2,4,6,8,10,12,14,16,18列,即这些位置的值为1。
因为0,1都在人眼识别的黑色范围内,固图像是全黑的,如果将myi(2:
2:
18,2:
2:
18)=1;改为myi(2:
2:
18,2:
2:
18)=255;就会发现图像是黑白相间的条格。
2)、纵向二倍拉伸图像代码
T1=maketform('affine',[100;020;001]);
I=imread('E:
\orangutan_1.tif');
I1=imtransform(I,T1);
imshow(I),figure,imshow(I1)
4,灰度图像直方图统计程序
1)编写的程序
img=imread('E:
\iris.tif');
imshow(img);
[M,N]=size(img);
img=double(img);
h=zeros(256,256);
fori=1:
M,
forj=1:
N,
f=img(i,j);
h(f+1)=h(f+1)+1;
end
end
figure;bar(h);grid;
2)直接调用MATLAB图像处理工具箱中提供的灰度直方图函数imhist
I=imread('E:
\iris.tif');
imhist(I)
3)显示分别如下图1和图2
图1
图2
5,估算图像iris.tif中的瞳孔半径(以像素为单位)
方法:
从图1中带网格线的图中估算像素
具体方法:
100~200之间的单位个数为8,则瞳孔面积大概为80000像素,利用求半径公式S=3.14R^2得到半径R=√ ̄(S/3.14)=√ ̄(80000/3.14)≈160像素
实验二
应用MATLAB工具箱自带的图像函数或自己编程进行图像处理,包括显示图像、格式转换、图像傅立叶变换、图像灰度调整、对比度增强、直方图均衡、邻域平均法、中值滤波法、图像代数运算、边缘增强、伪彩色增强、假彩色合成、二值化、边缘检测等;分析处理结果,掌握方法和原理,巩固所学内容。
部分示例以及需要完成的具体实验题目:
1)二维傅立叶变换示例:
选择一幅图像,对其进行离散傅立叶变换并显示离散傅立叶谱。
%根据以下生成的图像矩阵数据进行图像的傅立叶变换并显示其频谱
clear;closeall;
f=zeros(30,30);
f(5:
24,13:
17)=1;
figure,imshow(f,'notruesize');
F=fft2(f);
%可视化二维傅立叶变换结果的常用方法是使用对数,以便更详细地观察在0附近区域的细节
figure,imshow(log(abs(F)),[-15],'notruesize');colorbar;colormap(jet);
pause
%以上可视化f的DFT振幅谱存在以下两个问题:
%一、傅立叶变换采样比较粗糙
%原因:
快速傅立叶变换算法只能处理大小为2的幂次的矩阵,而本例中矩阵维数不是2的幂次
%解决办法:
在计算DFT时可以通过对f进行零填充来获得较好的傅立叶变换采样
%二、零频率系数显示在图形的左上角而不是传统的中心位置
%原因:
计算机系统在执行傅立叶变换算法时是以图像的左上角为坐标原点的
%解决办法:
用函数fftshift通过将图像FF的四个象限进行交换,使零频率系数位于图形的中心
FF=fft2(f,256,256);%对f进行零填充,得到一个256X256矩阵,然后再计算离散傅立叶变换
figure,imshow(log(abs(FF)),[-15],'notruesize');colorbar;colormap(jet);
pause
FFF=fftshift(FF);%使用函数fftshift对第二个问题进行修正解决
figure,imshow(log(abs(FFF)),[-15],'notruesize');colorbar;colormap(jet);
return
代码:
%根据以下生成的图像矩阵数据进行图像的傅立叶变换并显示其频谱
clear;closeall;
f=zeros(30,30);
f(5:
24,13:
17)=1;
figure,imshow(f,'notruesize');
F=fft2(f);
%可视化二维傅立叶变换结果的常用方法是使用对数,以便更详细地观察在0附近区域的细节
figure,imshow(log(abs(F)),[-15],'notruesize');colorbar;colormap(jet);
pause
FF=fft2(f,256,256);%对f进行零填充,得到一个256X256矩阵,然后再计算离散傅立叶变换
figure,imshow(log(abs(FF)),[-15],'notruesize');colorbar;colormap(jet);
pause
FFF=fftshift(FF);%使用函数fftshift对第二个问题进行修正解决
figure,imshow(log(abs(FFF)),[-15],'notruesize');colorbar;colormap(jet);
return
2)直方图均衡化:
利用Matlab提供的可进行图像直方图修正的函数,自己选择几幅直方图不均匀的图像(如图二pout.tif),对这些图像进行直方图均衡处理,显示处理前后的图像以及它们的灰度直方图,体会直方图均衡化算法的特点。
代码:
I=imread('pout.tif');
H=histeq(I);%对源图像的直方图进行均衡化
subplot(2,2,1),imshow(I);%显示源图像
title('源图像');
subplot(2,2,2),imshow(H);%显示均衡化后的图像
title('均衡化后的图像');
subplot(2,2,3),imhist(I);%显示原始图像的灰度直方图
title('源图像的直方图');
subplot(2,2,4),imhist(H);%显示均衡化后图像的直方图
title('均衡化后的图像直方图');
3)灰度修正技术:
按照教材64页上的公式(4.1.6)
(4.1.6)
以及以下公式
(1),分别编程实现图像的分段线性灰度变换和非线性灰度变换。
(1)
利用以上自己编写的代码对图三所示的实验图像(bottle.tif)进行灰度变换,使拍摄主体瓶子的花纹更加清晰地表现出来,改善视觉效果,显示增强前、后的图像以及它们的灰度直方图,并考虑利用Matlab提供的imadjust函数是否能完成同样的工作。
代码:
F=imread('bottle.tif');
[raw,col]=size(F);%读取图像的行列数
max=double(F(1,1))+1;%转换为double类型
fori=1:
raw%循环查找灰度的最大值
forj=1:
col
k=double(F(i,j))+1;
ifmaxmax=k;
end
end
end
disp('灰度最大值:
');
max%将最大值输出
disp('--------------首先进行线性变换--------------');
fo=input('请输入源图像的灰度范围:
');%输入格式:
[num1num2]
a=fo
(1);%将第一个数赋值给a
b=fo
(2);%将第二个数赋值给b
ifb>max%判断b是否超过max
disp('输入源图像的范围不能大于最大值!
');
end
re=input('请输入变换后的灰度范围:
');
c=re
(1);
d=re
(2);
ifd>256%判断d是否超过256
disp('输入变换后的范围不能超过255!
');
end
G=zeros(raw,col);%初始一个图像的行列数
fori=1:
raw%对源图像的每一个节点进行三段线性灰度变换
forj=1:
col
k=double(F(i,j))+1;
ifkG(i,j)=(c/a)*F(i,j);
elseifk
G(i,j)=((d-c)/(b-a))*(F(i,j)-a)+c;
else
G(i,j)=((255-d)/(max-b))*(F(i,j)-b)+d;
end
end
end
out=uint8(round(G-1));%将图像转换回uint8格式
figure,imshow(F);%显示源图像
title('源图像');
figure,imshow(out);%显示线性变换后的图像
title('线性变换后');
figure,imhist(F);%源图像的直方图
title('源图像的直方图');
figure,imhist(out);%线性变换后的直方图
title('线性变换后的直方图');
disp('--------下面进行非线性变换,其变换公式为g=c*f^y--------');
y=input('请输入指数y:
');
c=input('请输入乘数c:
');
g=zeros(raw,col);%%初始第二个图像的行列数
fori=1:
raw%对源图像的每一个节点进行非线性灰度变换
forj=1:
col
k=double(F(i,j))+1;
g(i,j)=c*(k^y);%根据公式求得各个节点的值
end
end
max=g(1,1);
fori=1:
raw%循环查找g(i,j)的最大值
forj=1:
col
ifmaxmax=g(i,j);
end
end
end
scale=max/256;
fori=1:
raw%将所求的g(i,j)等比例转换到1-256的像素值;
forj=1:
col
g(i,j)=round(g(i,j)/scale);
end
end
out2=uint8(round(g-1));
figure,imshow(out2);%显示非线性变换后的图像
title('非线性变换后');
figure,imhist(out2);%非线性变换后的直方图
title('非线性变换后的直方图');
灰度最大值:
max=
256
--------------首先进行线性变换--------------
请输入源图像的灰度范围:
[70120]
请输入变换后的灰度范围:
[20200]
Warning:
Imageistoobigtofitonscreen;displayingat75%scale.
>Intruesize>Resize1at308
Intruesizeat44
Inimshowat161
Warning:
Imageistoobigtofitonscreen;displayingat75%scale.
>Intruesize>Resize1at308
Intruesizeat44
Inimshowat161
--------下面进行非线性变换,其变换公式为g=c*f^y--------
请输入指数y:
3
请输入乘数c:
3
Warning:
Imageistoobigtofitonscreen;displayingat75%scale.
>Intruesize>Resize1at308
Intruesizeat44
Inimshowat161
>>
4)图像平滑(去噪):
(1)选择一幅图像(如图四lena512.jpg),叠加零均值高斯噪声,然后分别利用邻域平均法和中值滤波法对该图像进行滤波,显示滤波前后的图像,比较各滤波器的滤波效果。
(2)选择一幅图像,叠加椒盐噪声,寻则合适的滤波器将噪声滤除。
(3)选择一幅叠加了零均值高斯噪声的图像,设计一种处理方法,即能去噪声又能保持边缘清晰。
(选作)
(4)利用图像空间低通滤波法,对于给定的任意图像和低通滤波器(模板),编写一个较为通用的函数实现对输入图像的平滑处理。
(选作)
代码:
(1)x=imread('lena512.jpg');
subplot(2,2,1);
imshow(x);%显示源图像
title('源图像');
y=imnoise(x,'gaussian',0);%添加0均值的高斯噪声
subplot(2,2,2);
imshow(y);%显示添加高斯噪声的图像
title('添加高斯噪声');
mo=fspecial('average');%产生一个3*3的方形平均滤波模板
x1=imfilter(x,mo,'replicate');%对图像进行邻域平均法处理
%'replicate'指卷积填充边缘时用复制边界的值来扩展
subplot(2,2,3);
imshow(x1);%显示邻域平均法处理后的图像
title('邻域平均法处理');
x2=medfilt2(y);%对高斯躁声中值滤波
subplot(2,2,4);
imshow(x2);%显示中值滤波后的图像
title('对高斯噪声进行中值滤波');
(2)M=imread('lena512.jpg');
subplot(1,3,1);
imshow(M);%显示原始图像
title('源图像');
P=imnoise(M,'salt&pepper');%加入椒盐躁声
P=imnoise(M,'salt&pepper');%两次叠加椒盐躁声
subplot(1,3,2);
imshow(P);%两次叠加椒盐躁声后显示图像
title('加入椒盐噪声');
h=medfilt2(P);%对椒盐躁声中值滤波
subplot(1,3,3);
imshow(h);
title('中值滤波后');
5)边缘检测技术:
(1)选择三种不同的边缘检测算子对一幅图像(如图五rice.png)进行边缘检测,显示检测结果。
(2)对含噪图像进行边缘检测,比较各边缘检测算子对噪声的敏感性,并提出抗噪性能较好的边缘检测方法。
(3)编制一个比较通用的边缘提取函数。
通过输入不同的参数,能够实现Roberts算子、Prewitt算子、Sobel算子以及Laplacian算子边缘检测。
(选作)
代码:
(1)I=imread('rice.png');
imshow(I);%显示源图像
title('源图像');
A1=edge(I,'sobel');%用SOBEL算子进行边缘检测
figure,subplot(1,3,1);
imshow(A1);%SOBEL算子图像显示
title('SOBEL算子');
A2=edge(I,'roberts');%用Roberts算子进行边缘检测
subplot(1,3,2);
imshow(A2);%Roberts算子图像显示
title('Roberts算子');
A3=edge(I,'prewitt');%用prewitt算子进行边缘检测
subplot(1,3,3);
imshow(A3);%prewitt算子图像显示
title('prewitt算子');
(2)I=imread('rice.png');
P=imnoise(I,'salt&pepper');%加入椒盐噪声
subplot(2,2,1);
imshow(P);%椒盐噪声图像显示
title('椒盐噪声图像');
B1=edge(P,'sobel');%用SOBEL算子进行边缘检测
subplot(2,2,2);
imshow(B1);%SOBEL算子图像显示
title('SOBEL算子');
B2=edge(P,'roberts');%用Roberts算子进行边缘检测
subplot(2,2,3);
imshow(B2);%Roberts算子图像显示
title('Roberts算子');
B3=edge(P,'prewitt');%用prewitt算子进行边缘检测
subplot(2,2,4);
imshow(B3);%prewitt算子图像显示
title('prewitt算子');
实验心得:
其实刚开始我只是听老师课上听讲,但是终究无法深刻理解计算机图像具体的处理过程,通过这次上机实验,不会的上网XX,然后请教同学,才对图像处理有了更深的理解。