基于MATLAB GUI的数字图像处理系统
摘要:基于数字信号处理原理,在数字滤波器设计理论和Matlab 编程技术及其GUI 图形用户界面设计的基础上,开发了具有交互式特点的数字图像处理GUI软件,界面操作简单方便。
MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。根据它提供的500多个数学和工程函数,工程技术人员和科学工作者可以在它的集成环境中交互或编程以完成各自的计算。
MATLAB中集成了功能强大的图像处理工具箱。由于MATLAB语言的语法特征与C语言极为相似,而且更加简单、更加符合科技人员对数学表达式的书写格式,而且可移植性好、可扩展性强,再加上其中有丰富的图像处理函数,所以MATLAB在图像处理的应用中具有很大的优势。
关键词:MATLAB GUI;数字图像处理;图形用户界面
1 MATLAB的图像处理工具概述
MATLAB提供了多种图像处理函数,涵盖了图像处理的包括近期研究成果在内的几乎所有的技术方法,图像处理工具箱函数有噪和退化图像的恢复、图形绘制、图形的代数与逻辑运算、图形几何变换、图像增强、图像复原、二值分析、小波分析和分形几何。在工程实际应用中灰度与二值图像的形态学运算;结构元素创建与处理;基于边缘的处理;色彩映射表操作;色彩空间变换;图像类型与类型转换;以及图形用户界面设计等。
2应用matlab工具箱进行图像分析处理
应用matlab的Gui文件对图片进行灰度处理,亮度处理,放大处理,翻转处理,噪声处理,图像二值化,图像直方图、频谱图,滤波器,图像腐蚀,创建索引图像,RGB转HSV,RGB转NTSC,RGB转YCBCR和图像通道处理。
图1 是GUI的最终设计界面,图2是工作时界面。
图1
图2
2.1图形处理方法介绍及其处理结果
图3是原图像,以下是实现的源程序及相关功能的部分注解:
global im; %定义全局变量
[name,path]=uigetfile({'*.jpg';'*.gif';'*.bmp'},'载入图像');
if isequal(name,0)|isequal(path,0)
errordlg('没有选中文件','出错');
return;
else
x=imread([path,name]);%读取图片
axes(handles.axes1);%使用第一个axes
imshow(x);%显示图片
handles.img=x;
end
图3
图4为图像处理方法按钮:
图4
2.2程序调试
由于RGB图像是三维图像,所以图像数据是一个三维数组,为了显示灰度图像,把三维图像降为二维,可以只取其中的二维数据,实现方法程序为:
y=(handles.img(:,:,1)); %当然也可以选择(:,:,2) 或(:,:,3)
imshow(y);
但是这样的话,根据程序所选的不同,图像数据也不同,显示也就不一样。
另一种方法就是,运用rgb2gray函数实现彩色图像到灰度图像的转换。程序为:
y=rgb2gray(handles.img);
imshow(y);
这个程序只能用于RGB图像转换灰度图像,当原始图像本来就是灰度图像时,运行该程序时就会出错,但是使用者在使用时有时并不知道这些,为了使该程序更加完善,应该在使用者原先图像时灰度图像时使用该功能时,应该要显示提示类信息。所以在开始时应该要有一个RGB图像或是灰度图像的判断过程。完整的程序如下:
if isrgb(handles.img)
y=rgb2gray(handles.img);
imshow(y);
else
msgbox('这已经是灰度图像','转换失败');
end
如果原图是RGB,执行该操作的结果如图5:
图 5
如果原图本身已经是灰度图像了,执行该操作弹出如下图所示的提示对话框
用imadjust函数,其调用格式如下:
g=imadust(f,[low_in high_in],[low_out high_out]),gamma)
gamma 表示映射性质,默认值是1 表示线性映射。
由于该函数有五个参数需要输入,为了方便用户改变,所以这里设计一个输入对话框,用户通过对话框把五个参数赋值给[low_in high_in],[low_out high_out],gamma这五个参数,如下一组命令建立了如图所示的输入对话框:
prompt={'输入参数1','输入参数2','输入gamma'};
defans={'[0 0.7]','[0 1]','1'};
p=inputdlg(prompt,'输入参数',1,defans);
执行该操作,结果如下图:
图 6
上下翻转程序:axes(handles.axes2);
x=(handles.img);
if isrgb(handles.img)
for k=1:3
y(:,:,k)=flipud(x(:,:,k));%上下翻转函数
end
imshow(y);
else
x=(handles.img);
y=flipud(x);
imshow(y);
end
左右翻转程序:axes(handles.axes2);
if isrgb(handles.img)
x=(handles.img);
for k=1:3
y(:,:,k)=fliplr(x(:,:,k));%左右翻转函数
end
imshow(y);
else
x=(handles.img);
y=fliplr(x);
imshow(y);
end
任意角度翻转程序:axes(handles.axes2);
prompt={'输入参数1:'};
defans={'30'};
p=inputdlg(prompt,'输入参数',1,defans);
p1=str2num(p{1});
y=imrotate(handles.img,p1);
imshow(y);
图 7 上下翻转
图 8 左右翻转
图 9任意角度翻转
高斯噪声程序:axes(handles.axes2);
prompt={'输入参数1:','输入参数2'};
defans={'0','0.02'};
p=inputdlg(prompt,'输入参数',1,defans);
p1=str2num(p{1});
p2=str2num(p{2}); y=imnoise(handles.img,'gaussian',p1,p2);
imshow(y);
handles.noise_img=y;
guidata(hObject,handles);
椒盐噪声程序:prompt={'输入参数1:'}; %对话框的设置,用户输入的是字符串
imshow(y);
handles.noise_img=y;
guidata(hObject,handles);
图10 高斯噪声
图11 椒盐噪声
R直方图程序:set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
x=imhist(handles.img(:,:,1)); %直方图统计
x1=x(1:10:256);
horz=1:10:256;
bar(horz,x1);
set(handles.axes2,'xtick',0:50:255);
G直方图程序:set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
B直方图程序:set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
if isrgb(handles.img)
x=imhist(handles.img(:,:,3)); %直方图统计
x1=x(1:10:256);
horz=1:10:256;
bar(horz,x1);
%axis([0 255 0 150000]);
set(handles.axes2,'xtick',0:50:255);
%set(handles.axes2,'ytick',0:2000:15000);
else
msgbox('这是灰度图像','旋转失败');
end
图12 R直方图
图13 G直方图
图14 B直方图
二值图像程序:axes(handles.axes2);
x=(handles.img);
if isrgb(x)
msgbox('这是彩色图像,不能转换为二值图像','转换失败');
else
j=im2bw(x);
imshow(j);
end
图15 彩图不可二值化
图16 二值化图像
程序:axes(handles.axes2);
x=(handles.img);
if isrgb(x)
msgbox('这是彩色图像,不能进行图像腐蚀','失败');
else
j=im2bw(x);
se=eye(5);
bw=bwmorph(j,'erode');
imshow(bw);
end
图17 图像腐蚀
程序:axes(handles.axes2);
x=(handles.img);
if isrgb(x)
msgbox('这是彩色图像,不能创建索引图像','创建失败');
else
y=grayslice(x,16);
axes(handles.axes2);
imshow(y,jet(16));
end
图18 索引图像
RGB转HSV程序:axes(handles.axes2);
x=(handles.img);
if isrgb(x)
HSV=rgb2hsv(x);
imshow(HSV);
else
msgbox('这是灰度图像,不能转换','转换失败');
end
RGB转NTSC程序:axes(handles.axes2);
x=(handles.img);
if isrgb(x)
ntsc=rgb2ntsc(x);
imshow(ntsc);
else
msgbox('这是灰度图像,不能转换','转换失败');
end
RGB转YCBCR程序:axes(handles.axes2);
x=(handles.img);
图19 RGB转HSV图像
图20 RGB转NTSC图像
图21 RGB转YCBCR程序
3 结论
在理工科的专业应用背景下,用matlab 进行相关计算与仿真编程的优势非常突出。特定的问题处理算法,我们通常都以M文件的文本形式给定最终的解决方案,自己设计的程序是在MATLAB环境下,用MATLAB语言编写的,这对于有安装MATLAB软件的计算机上运行并不存在什么问题,关键是一般的计算机很少有去安装MATLAB软件的,那么要在这些机子上运行该程序要怎么办呢,难道要先安装MATLAB软件,这显然太麻烦了,对于一个通用的,比较成熟的解决方案,我们当然期望它能应用到更多的场合,而.exe (可执行)文件可运行于所有的通用WINDOWS操作系统,为此,将M文件转换成.exe文件倒是个不错的想法。
喜欢请给安妮赞同哦~