matlab实践报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“matlab实践报告模板”。
MATLAB 实践 课程设计
学生姓名:
学
号:
专业班级:
指导教师:
二○一二
年
六 月 二十 日1
《》
目录
1.设计目的„„„„„„„„„„„„„„„„„„„3 2.题目分析„„„„„„„„„„„„„„„„„„„3 3.总体设计„„„„„„„„„„„„„„„„„„„3 4.具体设计„„„„„„„„„„„„„„„„„„„4 5.结果分析„„„„„„„„„„„„„„„„„„„32 6.心得体会„„„„„„„„„„„„„„„„„„„33 6.附录代码„„„„„„„„„„„„„„„„„„„351、设计目的综合运用MATLAB工具箱实现图像处理的GUI程序设计。
2、题目分析
1.课程设计的基本要求
1)熟悉和掌握MATLAB 程序设计方法 2)掌握MATLAB GUI 程序设计 3)学习和熟悉MATLAB图像处理工具箱
4)学会运用MATLAB工具箱对图像进行处理和分析 2. 课程设计的内容
学习MATLAB GUI程序设计,利用MATLAB图像处理工具箱,设计和实现自己的Photoshop。要求:按照软件工程方法,根据需求进行程序的功能分析和界面设计,给出设计详细说明。然后按照自己拟定的功能要求进行程序设计和调试。
1)图像的读取和保存。
2)设计图形用户界面,让用户能够对图像进行任意的亮度和对比度变化调整,显示和对比变换前后的图像。
3)设计图形用户界面,让用户能够用鼠标选取图像感兴趣区域,显示和保存该选择区域。
4)编写程序通过最近邻插值和双线性插值等算法将用户所选取的图像区域进行放大和缩小整数倍的操作,并保存,比较几种插值的效果。
5)图像直方图统计和直方图均衡,要求显示直方图统计,比较直方图均衡后的效果。
6)能对图像加入各种噪声,并通过几种滤波算法实现去噪并显示结果。7)设计图形用户界面,让用户能够对图像进行伪彩色和真彩色处理。8)能够对图像进行一些特效处理,如底片,浮雕,倒影等
3、总体设计
这次的设计的功能按钮主要是菜单部分,菜单功能上的伪彩色、真彩色增强和各种特效算是比较有特色的地方,其他的功能是一些图像处理的基本实现大多可以通过Matlab自带的一些现成函数来调用以实现,关键是要注意它的使用语法和支持的图像类型。
具体的菜单功能和面板设计如下图所示:
4、具体设计 4.1 菜单的设计 通过Menu Editor创建如下菜单
4.2 图像的读取和保存
1)利用matlab中 “ uigetfile”、“imread” “imshow”实现图像文件的读取与显示:
[filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'载入图像');if isequal(filename,0)lisequal(pathname,0)errordlg('没有选中文件','出错');return;else
file=[pathname,filename];global S %设置一个全局变量S,保存初始图像路径,以便之后的还原操作
S=file;x=imread(file);set(handles.axes1,'HandleVisibility','ON');axes(handles.axes1);imshow(x);set(handles.axes1,'HandleVisibility','OFF');axes(handles.axes2);imshow(x);handles.img=x;guidata(hObject,handles);End 程序关键部分:
通过[filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'载入图像')选择相应路径打开的图像;通过file=[pathname,filename];x=imread(file);读取选中的图像;最后,通过imshow(x)在显示区域上显示图像。2)
利用“uiputfile”、“imwrite”函数实现图像文件的保存。
[sfilename ,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存图像文件','untitled.jpg');if ~isequal([sfilename,sfilepath],[0,0])sfilefullname=[sfilepath ,sfilename];imwrite(handles.img,sfilefullname);else
msgbox('你按了取消键','保存失败');end
程序关键部分:
通[sfilename ,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存图像文件','untitled.jpg')选择图像文件保存的路径与格式;然后,通过sfilefullname=[sfilepath ,sfilename];imwrite(handles.img,sfilefullname);实现对图像的保存。3)程序的退出 clc;close all;close(gcf);clear;4.3 对图像进行任意的亮度和对比度变化调整,显示和对比变换前后的图像。1)亮度调节
%亮度调节
axes(handles.axes2);prompt={'调整倍数'};defans={''};p=inputdlg(prompt,'input',1,defans);p1=str2num(p{1});y=imadjust(handles.img,[ ], [ ],p1);%亮度调节
imshow(y);handles.img=y;guidata(hObject,handles);
2)对比度调节 %对比度调节
axes(handles.axes2);prompt={'调整倍数'};defans={''};p=inputdlg(prompt,'input',1,defans);p1=str2num(p{1});7
y=immultiply(handles.img,p1);%对比度调节
imshow(y);handles.img=y;guidata(hObject,handles);
4.4 用鼠标选取图像感兴趣区域,显示和保存该选择区域。
通过imcrop(x)函数来实现对图片某一区域的截取,截取的图片在右框中显示。结合“保存为„”,可把截图处理后的图片保存在指定路径。%截图 global T axes(handles.axes2);T=getimage;x=imcrop(handles.img);%截图 imshow(x);handles.img=x;guidata(hObject,handles);
4.5 图像转化为灰度图像。
利用rgb2gray(X)函数对其他图像进行灰度图像的转化。%灰度变换 global T axes(handles.axes2);T=getimage;x=rgb2gray(handles.img);%灰度变换
imshow(x);handles.img=x;
guidata(hObject,handles);
4.6对图像进行放大和缩小整数倍的操作。
通过imresize(X,n,mode)函数对图像X进行放大或者缩小。N放大缩小倍数,mode为采用的方式,通过处理后可发现保存的图片的比原图放大了(缩小了)。1)放大
%最近邻插值法放大
global T axes(handles.axes2);T=getimage;prompt={'输入放大倍数:'};defans={''};p=inputdlg(prompt,'输入放大倍数',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'nearest');%最近邻插值法放大 imshow(y);handles.img=y;guidata(hObject,handles);%双线性插值法放大 global T axes(handles.axes2);T=getimage;prompt={'输入放大倍数:'};defans={''};p=inputdlg(prompt,'输入放大倍数',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'bilinear');%双线性插值法放大 imshow(y);handles.img=y;guidata(hObject,handles);
2)缩小
%最近邻插值法缩小 global T axes(handles.axes2);T=getimage;prompt={'输入放大倍数:'};defans={''};p=inputdlg(prompt,'输入放大倍数',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'nearest');%最近邻插值法缩小 imshow(y);handles.img=y;guidata(hObject,handles);%双线性插值法缩小 global T axes(handles.axes2);T=getimage;prompt={'输入放大倍数:'};defans={''};p=inputdlg(prompt,'输入放大倍数',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'bilinear');%双线性插值法缩小 imshow(y);handles.img=y;guidata(hObject,handles);4.7图像直方图统计和直方图均衡。(1)通过imhist函数实现直方图统计。
由于imhist函数只能对灰度图像进行直方图统计,所以要先判断图像是彩色图像还是灰度图像,分两种情况处理。global T axes(handles.axes2);T=getimage;s=handles.img;if isrgb(s)%对灰度图像和彩色图像分别处理 for k=1:3 x(:,:,k)=imhist(s(:,:,k));%直方图统计
end else
x=imhist(handles.img);%直方图统计 end
x1=x(1:10:256);horz=1:10:256;bar(horz,x1);axis([0 255 0 15000]);set(handles.axes2,'xtick',0:50:255);set(handles.axes2,'ytick',0:2000:15000);
(2)通过histeq(X)函数实现直方图均衡。
因为此函数只能对灰度图像进行直方图均衡故应先将彩图转为灰度图像所以要先判断图像是彩色图像还是灰度图像,分两种情况处理。%直方图均衡化 global T axes(handles.axes2);T=getimage;s=handles.img;if isrgb(s)%对灰度图像和彩色图像分别处理 a=histeq(s(:,:,1));%对每一种基色直方图均衡 b=histeq(s(:,:,2));c=histeq(s(:,:,3));k(:,:,1)=a;
k(:,:,2)=b;k(:,:,3)=c;imshow(k);else
y=histeq(s);%对灰度图像直方图均衡
imshow(y);handles.img=y;guidata(hObject,handles);end
4.8撤销和还原
1)撤销上一步的操作,通过设一个全局变量T保存是上一次操作后的图像。%撤销
axes(handles.axes2);global T imshow(T);handles.img=T;guidata(hObject,handles);2)通过一个全局变量保存原始图像路径,在需要还原至原始图像时,重新读取该全局变量即可。%还原
global S axes(handles.axes2);y=imread(S);
f=imshow(y);handles.img=y;guidata(hObject,handles);4.9边缘采集 %边缘采集 global T axes(handles.axes2);T=getimage;s=handles.img;if isrgb(s)%对灰度图像和彩色图像分别处理 for k=1:3 f(:,:,k)=edge(s(:,:,k),'sobel');% 用sobel算子,还有roberts算子,prewitt算子等 end else
f=edge(s,'sobel');end
imshow(f);handles.img=f;guidata(hObject,handles);
4.9加入各种噪声 1)高斯噪声
高斯噪声是指它的概率密度函数服从高斯分布的一类噪声。高斯噪声是一种随机噪声,它完全由其时变平均值和两瞬时的协方差函数来确定。%高斯噪声
axes(handles.axes2);y=imnoise(handles.img,'gauian',0,0.05);%加高斯噪声 imshow(y);handles.img=y;guidata(hObject,handles);
2)椒盐噪声
椒盐噪声是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声往往由图像切割引起。去除脉冲干扰级椒盐噪声最常用的算法是中值滤波。%•椒盐噪声
axes(handles.axes2);y=imnoise(handles.img,'salt & pepper',0.08);%加椒盐噪声
imshow(y);handles.img=y;guidata(hObject,handles);
3)斑点噪声
斑点噪声是SAR成像系统的一大特色,源自基本分辨单元内地物的随机散射,在图像上表现为信号相关(如在空间上相关)的小斑点,它既降低了图像的画面质量,又严重影响图像的自动分割、分类、目标检测以及其它定量专题信息的提取。SAR斑点噪声的抑制可通过非相干多视处理,也可使用空间域滤波实现。%斑点噪声
axes(handles.axes2);y=imnoise(handles.img,'speckle',0.04);%加斑点噪声 imshow(y);handles.img=y;guidata(hObject,handles);14
4)泊松噪声 %泊松噪声
axes(handles.axes2);y=imnoise(handles.img,'poion');%加泊松噪声 imshow(y);handles.img=y;guidata(hObject,handles);
4.10滤波 1)高通滤波
高通滤波是只对低于某一给定频率以下的频率成分有衰减作用,而允许这个截止频率以上的频率成分通过,并且没有相位移的滤波过程。主要用来消除低频噪声,保留高频部分。图像中的边缘或线条与图像频谱中的高频分量相对应,因为采用高通滤波器让高频成分顺利通过,可以使图像的边缘或线条更加清楚,从而识相图像的锐化。%高通滤波
axes(handles.axes2);x=(handles.img);f=double(x);% 数据类型转换,matlab不支持图像的无符号整型的计算 k=fft2(f);% 傅里叶变换 g=fftshift(k);% 转换数据矩阵 [M,N]=size(g);nn=2;d0=5;%截止频率5 m=fix(M/2);n=fix(N/2);15
for i=1:M for j=1:N d=sqrt((i-m)^2+(j-n)^2);% 计算高通滤波器传递函数
if d
result(i,j)=h*g(i,j);end end
result=ifftshift(result);y2=ifft2(result);y3=uint8(real(y2));imshow(y3);handles.img=y3;guidata(hObject,handles);% 显示滤波处理后的图像
2)低通滤波
图像的边缘以及噪声干扰在图像的频域上对应于图像傅里叶变换中的高频部分,而图像的背景区则对应于低频部分,因此可以用频域低通滤波法去除图像的高频部分,以去掉噪声使图像平滑。对于低通滤波器截止频率的不同,会发生不同程度的“振铃”现象,同时图像变模糊了。截止频率月底,滤除噪声越彻底,高频分量损失越严重,但图像就越模糊。%低通滤波器
axes(handles.axes2);y1=handles.img;f=double(y1);% 数据类型转换,matlab不支持图像的无符号整型的计算 g=fft2(f);% 傅里叶变换 g=fftshift(g);% 转换数据矩阵
[M,N]=size(g);nn=2;%二阶巴特沃斯低通滤波器 d0=50;%截止频率50 m=fix(M/2);n=fix(N/2);for i=1:M for j=1:N d=sqrt((i-m)^2+(j-n)^2);h=1/(1+0.414*(d/d0)^(2*nn));% 计算低通滤波器传递函数 result(i,j)=h*g(i,j);end end
result=ifftshift(result);y2=ifft2(result);y3=uint8(real(y2));imshow(y3);% 显示处理后的图像 handles.img=y3;guidata(hObject,handles);
3)中值滤波
中值滤波是抑制噪声的非线性处理方法。给定一个滤波窗口,对于二维图像,窗口形状可以使矩形,圆形及十字形等,对于位于中间位置的那个数值称为这n个数值的中值。中值滤波的算法运算简单,易于实现,而且能较好地保护边界,但有时会失掉图像中的细线和小块的目标区域。%中值滤波
axes(handles.axes2);a=handles.img;if isrgb(a)%对灰度和彩色图像分别处理
for k=1:3 y(:,:,k)=medfilt2(a(:,:,k));%中值滤波
end
else
y=medfilt2(a);%中值滤波 end
imshow(y);handles.img=y;guidata(hObject,handles);
4.11图像变换 1)傅里叶变换
为了得到图像的频谱图,先要对数据进行傅里叶变换,用fft2函数对二维数据进行快速傅里叶变换,同时为了更好的观察频谱图,需要把fft2变换后的数据进行平移,利用fftshift函数,把快速傅里叶变换的DC 组件移到光谱中心。这样图像能量的低频成分将集中到频谱中心,图像上的边缘、线条细节信息等高频成分将分散在图像频谱的边缘。%傅里叶变换
axes(handles.axes2);a=handles.img;if isrgb(a)m=fft2(a(:,:,1));%对图像执行二维傅里叶变换 y=fftshift(m);%使低频能量集中在中心位置 else
m=fft2(a);%对图像执行二维傅里叶变换 y=fftshift(m);%使低频能量集中在中心位置 end
imshow(log(abs(y)),[]);%使用对数使低频部分显示效果更明显
2)离散余弦变换
傅里叶变化的一个最大问题是:它的参数都是复数,在数据的描述上相当于实数的两倍,不易计算,因此希望有一种能达到相同功能但数据量有不大的变换,在这个思想的指导下,产生了离散余弦变换。%离散余弦变换 global T axes(handles.axes2);T=getimage;a=handles.img;gray=rgb2gray(a);d=dct2(gray);%对图像进二维行离散余弦变换
imshow(log(abs(d)),[]);%使用对数使低频部分显示效果更明显
3)Radon变换
Radon函数计算指定方向上图像矩阵的投影,计算一定方向上平行光束的线积分。光线间隔1个象素单位。为了表示图像,radon变换通过围绕图像中心旋转光源来从不同角度获得图像的平行光投影。%Radon变换 global T axes(handles.axes2);theta=0:1:180;%对每个角度做radon变换处理 [r,xp]=radon(T,theta);%Radon变换
imagesc(theta,xp,r);xlabel('degrees');%为x轴做标注 colorbar;%显示颜色条
4.12图像增强 1)伪彩色增强
对于灰度图像,人眼分辨的灰度级只有十几到二十几,而对不同的亮度和色彩图像则可以达到几百甚至上千,因此伪彩色增强是将一个波段或单一的黑白图像变换为彩色图像,从而把人眼不能区分的微小的灰度差别显示为明显的色彩差异,更便于解译和提取有用信息。
伪彩色增强的方法主要有以下三种:亮度切割技术,灰度彩色变换,频域滤波法。
我采用的是亮度切割技术,亮度切割技术是伪彩色增强中最简单的一种方法,它是对图像亮度范围进行分割,使一定亮度间隔对应于某一颜色。对于切割平面以下的分配一中颜色,平面以上的再分配一种颜色。这样,便可以把一幅灰度图像变成一幅伪彩色图像,此法比较直观简单,缺点使变换出的彩色数目有限而且颜色生硬不够调和,量化噪声大。%伪彩色增强 global T axes(handles.axes2);T=getimage;a=handles.img;c=zeros(size(a));%a为原灰度图像矩阵
pos=find(a
c=zeros(size(a));%a为原灰度图像矩阵
pos=find((a>=100)&(a
c=zeros(size(a));%a为原灰度图像矩阵
pos=find(a>=230);%找到灰度值大于230的c(pos)=a(pos);b(:,:,1)=c;%变为红色
b=uint8(b);axes(handles.axes2);imshow(b);handles.img=b;guidata(hObject,handles);
2)真彩色增强
真彩色增强时从彩色到彩色的一种变换。通过一定的映射函数变换成新的三基色分量,彩色合成使得增强图像中各目标呈现出与原图像不同的彩色。通过真彩色增强我们可以达到变换图像引起人们的特别关注,以及通过人眼对不同颜色的灵敏度的不同,使景物呈现出与人眼色觉相匹配的颜色,以提高人眼对目标的分辨力。%真彩色增强 global T axes(handles.axes2);T(:,:,1)=immultiply(T(:,:,1),0.3);%对R基色每个元素乘以0.3 T(:,:,2)=immultiply(T(:,:,2),0.2);%对G基色每个元素乘以0.2 T(:,:,3)=immultiply(T(:,:,3),0.5);%对B基色每个元素乘以0.5 axes(handles.axes2);imshow(T);handles.img=T;guidata(hObject,handles);21
4.12图像翻转 1)上下翻转 %上下翻转 global T axes(handles.axes2);T=getimage;a=handles.img;if isrgb(a)%对灰度和彩色图像分别处理 for k=1:3 y(:,:,k)=flipud(a(:,:,k));end else
y=flipud(a);end
imshow(y);handles.img=y;guidata(hObject,handles);
2)左右翻转 %左右翻转
global T %左右镜像 axes(handles.axes2);T=getimage;a=handles.img;if isrgb(a)%对灰度和彩色图像分别处理
for k=1:3 y(:,:,k)=fliplr(a(:,:,k));%左右翻转 end else
y=fliplr(a);%左右翻转 end
imshow(y);handles.img=y;guidata(hObject,handles);
3)任意角度翻转 %任意角度翻转 global T axes(handles.axes2);T=getimage;prompt={'旋转角度:'};defans={''};p=inputdlg(prompt,'input',1,defans);p1=str2num(p{1});f=imrotate(handles.img,p1,'bilinear','crop');imshow(f);handles.img=f;guidata(hObject,handles);
4.13特效效果 1)底片效果
通过f=imcomplement(handles.img);实现图像取反,形成底片效果。%底片效果 global T axes(handles.axes2);T=getimage;f=imcomplement(handles.img);%图像取反 imshow(f);handles.img=f;guidata(hObject,handles);
2)运动模糊 %运动模糊 global T global S axes(handles.axes2);S=fspecial('motion',28,15);T=imfilter(handles.img,S,'circular','conv');imshow(T)handles.img=T;guidata(hObject,handles);24
3)浮雕效果
实现图像浮雕效果的一般原理是,将图像上每个像素点与其对角线的像素点形成差值,使相似颜色值淡化,不同颜色值突出,从而产生纵深感,达到浮雕的效果。%浮雕效果 global T axes(handles.axes2);T=getimage;a=handles.img;r=a(:,:,1);%提取红色分量表示的图像 g=a(:,:,2);%提取绿色分量表示的图像 b=a(:,:,3);%提取蓝色分量表示的图像 m = size(a,1);n = size(a,2);for i=3:m-2 for j=3:n-2 rr(i,j)=0.25*r(i-1,j-1)+0.25*r(i-2,j-2)+0.25*r(i,j)+0.25*r(i+1,j+1)-1.0*r(i+2,j+2)+128;gg(i,j)=0.25*r(i-1,j-1)+0.25*g(i-2,j-2)+0.25*g(i,j)+0.25*g(i+1,j+1)-1.0*g(i+2,j+2)+128;bb(i,j)=0.25*b(i-1,j-1)+0.25*b(i-2,j-2)+0.25*b(i,j)+0.25*b(i+1,j+1)-1.0*b(i+2,j+2)+128;end end
A(:,:,1)=rr;A(:,:,2)=gg;A(:,:,3)=bb;axes(handles.axes2);imshow(A)
4)马赛克
一般来说,图片的每个一细节都是由一个小的像素块组成的,如果将其无限放大,每个像素块就会很明显地表现出来,就是我们说的马赛克。马赛克算法很简单,就是把一张图片分割成若干个val * val像素的小区块(可能在边缘有零星的小块,但不影响整体算法,val越大,马赛克效果越明显),每个小区块的颜色都是相同的。而利用Matlab中的放大和缩小函数imresize,可以方便的实现图像的马赛克效果。具体方法为,首先将图片缩小到原图片大小的1/5,再将图片放大五倍还原到原来的大小。由于图片缩小后,部分像素值会丢失,再次放大时就会出现模糊现象,即为马赛克。%马赛克 pix_grp = 15;global T axes(handles.axes2);T=getimage;a=handles.img;height = size(a,1);width = size(a,2);mosaic = imresize(a,[floor(height/pix_grp)floor(width/pix_grp)]);%B = imresize(A, [numrows numcols])将图像A放大,numrows和numcols分别指定目标图像的高度和宽度
mosaic = imresize(mosaic,[height width],'nearest');a=mosaic;imshow(a);
5)雾化效果
设想有一块透明的玻璃,朝上面哈几口气,然后将玻璃放到一张图片上,得到的图像效果就是雾化效果。下面来分析原理从而推导出算法。
玻璃上面哈气后,有很多小水滴小水汽之类的,形状不规则,因此发生光折射,由于水滴的不规则性,发生折射也是不规则的,也就是折射光的折射角不确定,但是肯定有个范围,假设有像素A(i,j),(i和j分别表示横坐标和纵坐标),折射后一定几率在A(i+d,j+d)处,(-k
对每个像素A(i,j)进行处理,用其周围一定范围内随机点A(i+d,j+d),(-k
rr(i,j)=r(di,dj);%将原像素点用随机像素点代替 gg(i,j)=g(di,dj);bb(i,j)=b(di,dj);
end end
A(:,:,1)=rr;A(:,:,2)=gg;A(:,:,3)=bb;imshow(A)
6)倒影效果
对图像的美化过程中,常常需要制作倒影效果,倒影效果可以更好的展现风景图片和建筑物图片的立体效果,达到让欣赏者赏心悦目的效果。对图像进行倒影处理的基本思路是:将原图像A压缩为原来大小的一半,压缩后的图像旋转180度后做左右镜像处理,即B(i,n-j+1)=A(i,j);然后将下半部分图像进行雾化处理,以得到更好的倒影效果,最后将上下两部分图像合成到一个三维数组中,使用imshow函数显示出来就可以了 %倒影效果 global T axes(handles.axes2);T=getimage;a=handles.img;m=size(a,1);n=size(a,2);img_up=imresize(a,[floor(m*0.5),n]);%将原图像压缩为原来大小的一半 img_down=imrotate(a,180);%压缩后的图像旋转180度 r=img_down(:,:,1);g=img_down(:,:,2);b=img_down(:,:,3);for i=1:m for j=1:n %下半部分图像做左右镜像 rr(i,n-j+1)=r(i,j);28
gg(i,n-j+1)=g(i,j);bb(i,n-j+1)=b(i,j);end end
A(:,:,1)=rr;A(:,:,2)=gg;A(:,:,3)=bb;%A是镜像以后的图像 img_down=A;%倒影部分进行雾化,实现更好的倒影效果 m1=size(img_down,1);n1=size(img_down,2);r1=img_down(:,:,1);g1=img_down(:,:,2);b1=img_down(:,:,3);for i=2:m1-10 for j=2:n1-10 k=rand(1)*10;di=i+round(mod(k,33));dj=j+round(mod(k,33));rr1(i,j)=r1(di,dj);gg1(i,j)=g1(di,dj);bb1(i,j)=b1(di,dj);end end
A1(:,:,1)=rr1;A1(:,:,2)=gg1;A1(:,:,3)=bb1;%雾化完成img_down=imresize(A1,[floor(m*0.5),n]);A=[img_up;img_down];imshow(A)29
7)阈值分割
一幅图像包括目标,背景和噪声,怎样从灰度图像中取出对象物?灰度阈值法就是把图像的灰度分成不同的等级,然后用设置灰度阈值的方法确定有意义的区域或欲分割物体的边界。设定某一阈值T,对图像进行二值化处理。%阈值分割 global T axes(handles.axes2);T=getimage;a=handles.img;a=double(a(:,:,1));fxy=zeros(1,256);[m,n]=size(a);for i=1:m %统计每个灰度值的个数
for j=1:n c=a(i,j);fxy(c+1)=fxy(c+1)+1;end end
figure(1);plot(fxy);p1={'Input Num:'};p2={'180'};p3=inputdlg(p1,'Input Num:1~256',1,p2);p=str2num(p3{1});for i=1:m %小于阈值的为黑,大于阈值的为白
for j=1:n if a(i,j)
image1(i,j)=1;
end
end end
imshow(image1);
如果处理目标或背景内部相邻见得灰度值是高度相关的,但处于目标和背景交界处两边的像素在灰度值上有很大的差别,则它的灰度直方图基本可以看做是分别对应目标和背景的两个单峰直方图混合成,如上图。我们选取波谷作为阈值分割点,就可以将目标和背景分离开了,将目标显示出来。如下图:
阈值分割在交通系统中的车牌识别中扮演着重要的角色,由于车牌的材料有反光的性能,当抓拍到车牌后,对图像进行阈值分割可以得到不错的效果。如下图,对一幅添加了高斯噪声的车牌进行阈值分割:
通过对灰度直方图的统,可以看到大致的两个波峰,取其波谷为分割点,灰度值大概在190左右,大于190的为白,小于190的为黑。
8)添加水印
为了给自己处理过的图像添加标志,设计了添加水印的功能。该功能的主要思想是,图像即为数组,如果要再图像上添加水印,也就是用另一幅图像的数据去覆盖原图像对应部分的数据,也就是对数组内容的替换。然后就是关于水印添加的方位了,由于添加方位的不同,所要替代的范围的不同了。%添加水印 global T axes(handles.axes2);T=getimage;a=handles.img;[filename,pathname]=...uigetfile({'*.jpg';'*.bmp';'*.gif'},'watermark');str=[pathname filename];b=imread(str);m1=size(a,2);n1=size(a,1);m2=size(b,2);n2=size(b,1);c=a((n1-n2+1):n1,(m1-m2+1):m1,:);p1={'Input Num:'};p2={'2'};
p3=inputdlg(p1,'Input Num:1~4',1,p2);p=str2num(p3{1});if isrgb(a)&isrgb(b)switch p case 1 a(1:n2,1:m2,:)=b;%左上角
case 2 a(1:n2,(m1-m2+1):m1,:)=b;%右上角
case 3 a((n1-n2+1):n1,1:m2,:)=b;%左下角
case 4 b=imadd(imadd(c,b),-50);a((n1-n2+1):n1,(m1-m2+1):m1,:)=b;%右下角
otherwise msgbox('error,');end imshow(a);elseif isgray(a)&isgray(b)switch p case 1 a(1:n2,1:m2)=b;%左上角
case 2 a(1:n2,(m1-m2+1):m1)=b;%右上角
case 3 a((n1-n2+1):n1,1:m2)=b;%左下角
case 4 a((n1-n2+1):n1,(m1-m2+1):m1)=b;%右下角
otherwise msgbox('error');end imshow(a);else msgbox('error,the type of two pictures is mismatching');end
335、结果分析
在刚开始学习GUI时,是按着视频教程一步一步的学习的,由于视频介绍的比较简单,很多相应功能都不知道相应的回调函数该怎么写,后来就借了本图像处理matlab版本的书籍以及上网查了一些资料,之后的设计之路就轻松多了,特别是借助于功能强大的help,相应的一些小问题基本都可以自己找出并解决。
因为读入图像得到的是个矩阵,所以说对图像处理也就是对矩阵做相应的修改变换,在矩阵运算过程中遇到了几个很典型的问题。
1)有些函数只能对灰度图像进行操作例如左右翻转函数,所以当图像时彩色图像时就要执行for k=1:3 y(:,:,k)=fliplr(a(:,:,k));%左右翻转 end 操作
2)在实现图像放大,缩小,亮度调整等功能时,为了方便修改,设置对话框输入,但从对话框输入的数其实是字符,并不是真正的整型数值,所以如果没有对字符转数值变化,就会得到错误的结果,举个简单的例子:
a=’2’;b=2;a*b ans = 100 得到的100并不是我们所想要的4,之所以还会出结果是因为,字符2对应的ASCII码值为50,而matlab有支持这种算法,所以会得到100的结果。
正确的做法应该是这样: a=’2’;a=str2num(s);b=2;a*b ans = 4 所以说我们在对数据做处理的时候,一定要分清出它的类型,以免到时候查不出错误。
3)关于全局变量的设置,打开了一张图片,为了能供每个功能做相应的处理,就得把图片矩阵的属性设置为global T,这样做以后却只能实现对源图像做处理,如果要对处理过后的图像再做处理,我们就要把处理完后的新图像矩阵赋给源图像,T=y,这样就可以实现每次处理的对象都为上次处理完的图像了。
4)??? Error using ==> *
Function '*' is not defined for values of cla 'uint8'.对于不同的图像类型,图像矩阵元素的类型也不一样。对于真彩色图像,数据矩阵类型是uint8;对于索引图像,数据矩阵类型可以是double型或者uint8型;对于灰度图像,数据矩阵类型可以是double型或者uint8型;对于二值图像,数据矩阵类型可以是double型或者uint8型。当类型不支持时,我们可以通过强制类型转换来得到所需数据类型,如:double(m).6、心得体会
通过这次“基于matlab的数字图像处理”的GUI课程设计,学到了很多很多,最基本的就是重新熟悉了matlab语言,不仅仅只是在matlab编程上面有所提高和对GUI的熟悉,对数字图像处理也有了更深刻的认识。
当我第一次拿到此次的课题时,感到有些无所适从。虽然,曾经学习过matlab的课程,在课程的考核中也取得了较好的成绩,但由于对matlab的学习更多的只是停留在理论上的学习,在课时内的试验也只是简单的基础性试验,所以对matlab实际运用不是很熟练。
为此,在实践正式开始前,我利用课余时间,重新复习了matlab教材,专门借阅了利用matlab进行图像处理的相关教程,通过索引网络上的相关资料,为课设做了较为充分的准备。在参考了相关材料及源程序,我对自己要做的课设内容有了进一步的了解,并对matlab的使用有了更深的体会。
首先,明白了图像对于matlab而言就是矩阵,灰度图像和彩色图像对应于不同维数的矩阵,分别为二维和三维,其中三维矩阵每一位代表一种颜色。矩阵可以使实数,也可以使复数,不同的图像矩阵的元素对应于不同的类型,有double,uint8,uint16,logic等类型。由于几乎所有的matlab函数及其工具箱函数都可以使用double作为参数类型,不过由于64bit来表示图像数据存储量特别巨大,所以matlab还支持图像数据的无符号整型存储,所以使用时还要注意输出数据类型的转换。
其次,学会了要善于使用matlab中现有的函数。
最后,我们必须要明白理论指导实践,要想实现预期的效果,必须明白它实现的机制和相应的算法,只有通过相应的理论来指导,我们才能有所创新,才能有所突破,而不只是单纯的引用相应的处理函数。例如对于截图函数,它只能是截取坐标轴内的图像,对坐标轴意外的图像却不能处理,而且对于同时显示在坐标轴上的几张图像,它只能处理最后显示的那张,如果我们通过对它改进,能实现像qq截图那样的功能就很强大了。不过通过这次的实现,我对图像的模式,彩色空间,存储结构,图像的傅里叶变换,离散余弦变换的原理,图像的平滑和锐化的算子,直方图的用途和直方图均衡化原理,图像的伪彩色和真彩色增强,以及阈值分割原理都有了更清楚的认识,也明白了它们的实现机制。还有就是,如今的GUI只能在matlab环境下运行,如果能转化成exe
格式,就能独立于matlab外执行了,还有很多很多新功能等待我们去探索。总体来说,此次的课程设计,还是较为满意的。它不但鞭策着我去巩固matlab的基础理论知识,还提高了我对matlab的实际操作运用,使得理论与实践相结合,为进一步学习matlab打下坚实的基础;同时,在实践的工程中,也让我体会到一种努力付出并得到回报的满足感觉。
参考书目:
[1]《MATLAB实用教程》 [2] 《数字图像处理与分析》
郑阿奇 电子工业出版社 张弘.机械工业出版社 36
附录:
function varargout = untitled1(varargin)% UNTITLED1 M-file for untitled1.fig % UNTITLED1, by itself, creates a new UNTITLED1 or raises the existing % singleton*.%
% H = UNTITLED1 returns the handle to a new UNTITLED1 or the handle to % the existing singleton*.%
% UNTITLED1('CALLBACK',hObject,eventData,handles,...)calls the local
%
function named CALLBACK in UNTITLED1.M with the given input arguments.%
% UNTITLED1('Property','Value',...)creates a new UNTITLED1 or raises the % existing singleton*.Starting from the left, property value pairs are %
applied to the GUI before untitled1_OpeningFcn gets called.An % unrecognized property name or invalid value makes property application
% stop.All inputs are paed to untitled1_OpeningFcn via varargin.%
%
*See GUI Options on GUIDE's Tools menu.Choose “GUI allows only one
% instance to run(singleton)”.%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help untitled1
% Last Modified by GUIDE v2.5 22-Jun-2012 19:36:46
% Begin initialization codeDO NOT EDIT
%---Executes just before untitled1 is made visible.function untitled1_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.% hObject handle to figure % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;%------
function Untitled_2_Callback(hObject, eventdata, handles)% hObject handle to Untitled_2(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%保存图像
[sfilename ,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存图像文件','untitled.jpg');if
~isequal([sfilename,sfilepath],[0,0])
sfilefullname=[sfilepath ,sfilename];
imwrite(handles.img,sfilefullname);else
msgbox('你按了取消键','保存失败');end
%------
function Untitled_4_Callback(hObject, eventdata, handles)% hObject handle to Untitled_4(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)
%亮度调节
axes(handles.axes2);prompt={'调整倍数'};defans={''};p=inputdlg(prompt,'input',1,defans);p1=str2num(p{1});y=imadjust(handles.img,[ ], [ ],p1);%
亮度调节
imshow(y);
handles.img=y;
guidata(hObject,handles);
%
------
function Untitled_9_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_9(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%灰度变换 global T
axes(handles.axes2);
T=getimage;if isrgb(s)%对灰度图像和彩色图像分x=rgb2gray(handles.img);%灰度变换 别处理
imshow(x);a=histeq(s(:,:,1));%对每一种基色直handles.img=x;方图均衡 guidata(hObject,handles);b=histeq(s(:,:,2));c=histeq(s(:,:,3));k(:,:,1)=a;% k(:,:,2)=b;------k(:,:,3)=c;imshow(k);function Untitled_15_Callback(hObject, else eventdata, handles)y=histeq(s);%对灰度图像直方图均衡 % hObject handle to Untitled_15(see imshow(y);GCBO)handles.img=y;% eventdata reservedto be defined in guidata(hObject,handles);a future version of MATLAB
% handles structure with handles and user data(see GUIDATA)% global T------axes(handles.axes2);T=getimage;function Untitled_17_Callback(hObject, s=handles.img;eventdata, handles)if isrgb(s)%对灰度图像和彩色图像分别% hObject handle to Untitled_17(see 处理 GCBO)for k=1:3 % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%高斯噪声
axes(handles.axes2);y=imnoise(handles.img,'gauian',0,0.05);%加高斯噪声 imshow(y);handles.img=y;guidata(hObject,handles);%------
function Untitled_22_Callback(hObject, eventdata, handles)% hObject handle to Untitled_22(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%斑点噪声
axes(handles.axes2);
y=imnoise(handles.img,'speckle',0.04);%加斑点噪声 imshow(y);
handles.img=y;
guidata(hObject,handles);
%
------
function Untitled_24_Callback(hObject, eventdata, handles)% hObject handle to Untitled_24(see GCBO)% eventdata reservedto be defined in
a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%高通滤波
axes(handles.axes2);x=(handles.img);f=double(x);% 数据类型转换 k=fft2(f);% 傅里叶变换
g=fftshift(k);% 转换数据矩阵 [M,N]=size(g);nn=2;d0=5;%截止频率5 m=fix(M/2);n=fix(N/2);for i=1:M for j=1:N d=sqrt((i-m)^2+(j-n)^2);% 计算高通滤波器传递函数
if d
result(i,j)=h*g(i,j);end end
result=ifftshift(result);y2=ifft2(result);y3=uint8(real(y2));imshow(y3);handles.img=y3;guidata(hObject,handles);% 显示滤波处理后的图像
%------
function Untitled_28_Callback(hObject, eventdata, handles)% hObject handle to Untitled_28(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%上下翻转 global T
axes(handles.axes2);T=getimage;a=handles.img;
if isrgb(a)%对灰度和彩色图像分别处理 for k=1:3
y(:,:,k)=flipud(a(:,:,k));%上下翻转 end else
y=flipud(a);%上下翻转 end
imshow(y);
handles.img=y;
guidata(hObject,handles);
%------
function Untitled_44_Callback(hObject, eventdata, handles)% hObject handle to Untitled_44(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%伪彩色增强
global T
axes(handles.axes2);T=getimage;a=handles.img;
c=zeros(size(a));%a为原灰度图像矩阵
pos=find(a
b(:,:,3)=c;%变为蓝色
c=zeros(size(a));%a为原灰度图像矩阵
pos=find((a>=100)&(a
b(:,:,2)=c;%变为绿色
c=zeros(size(a));%a为原灰度图像矩阵
pos=find(a>=230);%找到灰度值大于230的c(pos)=a(pos);
b(:,:,1)=c;%变为红色
b=uint8(b);
axes(handles.axes2);imshow(b);
handles.img=b;
guidata(hObject,handles);%
------
function Untitled_40_Callback(hObject, eventdata, handles)% hObject handle to Untitled_40(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)
%------
function Untitled_35_Callback(hObject, eventdata, handles)% hObject handle to Untitled_35(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%离散余弦变换 global T
axes(handles.axes2);T=getimage;a=handles.img;gray=rgb2gray(a);
d=dct2(gray);%对图像进二维行离散余弦变换
imshow(log(abs(d)),[]);%使用对数使低频部分显示效果更明显
%
------
function Untitled_45_Callback(hObject, eventdata, handles)% hObject handle to Untitled_45(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%双线性插值法放大 global T axes(handles.axes2);T=getimage;prompt={'输入放大倍数:'};defans={''};p=inputdlg(prompt,'输入放大倍数',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'bilinear');%双线性插值法放大 imshow(y);handles.img=y;guidata(hObject,handles);
%------
function Untitled_47_Callback(hObject, eventdata, handles)% hObject handle to Untitled_47(see
GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%双线性插值法缩小 global T
axes(handles.axes2);T=getimage;
prompt={'输入放大倍数:'};defans={''};
p=inputdlg(prompt,'输入放大倍数',1,defans);
p1=str2num(p{1});
y=imresize(handles.img,p1,'bilinear');%双线性插值法缩小 imshow(y);
handles.img=y;guidata(hObject,handles);
%------
function Untitled_50_Callback(hObject, eventdata, handles)% hObject handle to Untitled_50(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%撤销
axes(handles.axes2);global T imshow(T);handles.img=T;guidata(hObject,handles);
%
------
function Untitled_54_Callback(hObject, eventdata, handles)% hObject handle to Untitled_54(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)
[sfilename ,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存图像文件','untitled.jpg');if
~isequal([sfilename,sfilepath],[0,0])
sfilefullname=[sfilepath ,sfilename];
imwrite(handles.img,sfilefullname);else
msgbox('你按了取消键','保存失败');end
%------function
uipushtool5_ClickedCallback(hObject, eventdata, handles)% hObject handle to uipushtool5(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)axes(handles.axes2);p1=str2num('5');
y=imresize(handles.img,p1,'nearest');%最近邻插值法放大 imshow(y);
handles.img=y;
guidata(hObject,handles);
%---Executes on button pre in pushbutton4.function pushbutton4_Callback(hObject, eventdata, handles)% hObject handle to pushbutton4(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)axes(handles.axes2);p1=str2num('0.2');y=imresize(handles.img,p1,'nearest');%最近邻插值法放大 imshow(y);handles.img=y;guidata(hObject,handles);
%------function
uitoggletool1_ClickedCallback(hObject, eventdata, handles)% hObject handle to uitoggletool1(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)
global S axes(handles.axes2);%还原 y=imread(S);f=imshow(y);handles.img=y;
guidata(hObject,handles);%
------
function Untitled_57_Callback(hObject, eventdata, handles)% hObject handle to Untitled_57(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%Radon变换 global T axes(handles.axes2);theta=0:1:180;%对每个角度做radon变换处理
[r,xp]=radon(T,theta);%Radon变换 imagesc(theta,xp,r);xlabel('degrees');%为x轴做标注 colorbar;%显示颜色条
%------
function Untitled_59_Callback(hObject, eventdata, handles)% hObject handle to Untitled_59(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%还原
global S axes(handles.axes2);y=imread(S);f=imshow(y);handles.img=y;
guidata(hObject,handles);
%---Executes during object creation, after setting all properties.function figure1_CreateFcn(hObject, eventdata, handles)
% hObject
handle to figure1(see GCBO)% eventdata reservedhandles not created until after all CreateFcns called
%---Executes during object creation, after setting all properties.%添加背景图片
im=axes('units','normalized','position',[0 0 1 1]);
uistack(im,'down');II=imread('9.jpg');image(II);
colormap gray;
set(im,'handlevisibility','off','visible',off);
------%------function Untitled_62_Callback(hObject, eventdata, handles)function Untitled_61_Callback(hObject, % hObject handle to Untitled_62(see eventdata, handles)GCBO)% hObject handle to Untitled_61(see % eventdata reservedto be defined in % handles structure with handles and a future version of MATLAB user data(see GUIDATA)% handles structure with handles and %马赛克 user data(see GUIDATA).pix_grp = 15;%浮雕效果 global T global T axes(handles.axes2);axes(handles.axes2);T=getimage;T=getimage;a=handles.img;a=handles.img;height = size(a,1);r=a(:,:,1);%提取红色分量表示的图像 width = size(a,2);g=a(:,:,2);%提取绿色分量表示的图像 mosaic = b=a(:,:,3);%提取蓝色分量表示的图像 imresize(a,[floor(height/pix_grp)m = size(a,1);floor(width/pix_grp)]);n = size(a,2);%B = imresize(A, [numrows numcols])将for i=3:m-2 图像A放大,numrows和numcols分别指定目for j=3:n-2 标图像的高度和宽度 rr(i,j)=0.25*r(i-1,j-1)+0.25*r(i-2,j-mosaic = imresize(mosaic,[height 2)+0.25*r(i,j)+0.25*r(i+1,j+1)-1.0*r(width],'nearest');i+2,j+2)+128;a=mosaic;gg(i,j)=0.25*r(i-1,j-1)+0.25*g(i-2,j-imshow(a);2)+0.25*g(i,j)+0.25*g(i+1,j+1)-1.0*g(i+2,j+2)+128;bb(i,j)=0.25*b(i-1,j-1)+0.25*b(i-2,j-% 2)+0.25*b(i,j)+0.25*b(i+1,j+1)-1.0*b(------i+2,j+2)+128;end function Untitled_63_Callback(hObject, end eventdata, handles)A(:,:,1)=rr;% hObject handle to Untitled_63(see A(:,:,2)=gg;GCBO)A(:,:,3)=bb;% eventdata reserved-to be defined in axes(handles.axes2);a future version of MATLAB imshow(A)% handles structure with handles and user data(see GUIDATA)
%雾化效果
global T % axes(handles.axes2);
MATLAB实践报告2016/2017学年 第一学期专 业: 电气工程及其自动化班 级: 学 号: 姓 名:2017年 2 月目录第1章 引言 ...............................................................
MATLAB实习报告MATLAB课程设计报告摘要MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数......
matlab实习报告实习总结报告;学校名称;实习类型学学软件MTLAB实习起止时间年月日至年;所在院(系);班级;学生姓名;学号;年月日;实习总结报告;2013年7月8日至7月26日,我们应数专业进行;这次......
实验一仿真条件:电机空载下,输入为阶跃信号,仿真时间为0.4S。阶跃信号,仿真时间为0.4S。图二 磁链图实验结果:开始时有摩擦转矩,在短时间内能够快速形成圆形转矩。图1 速度响应曲......
Matlab上机实习报告这两周我们进行了Matlab的上机。为了熟练掌握Matlab的各种操纵,学会使用Matlab解决复杂矩阵的运算并学会用Matlab解决平差中的实际问题,我们以书上的例7-8......