在MATLAB用户界面GUI上设计一个操作简单、功能齐全的数字图像处理技术的集合,对于一些对数字图像处理原理不懂的用户也能够根据自己的需求处理处自己想要的数字图像。本系统GUI界面设计两个显示界面: 一个原数据界面,一个是处理结果界面显示,能够很好的展现数字图像处理结果。每一个功能的实现都是按钮代替了每一步复杂的数字图像处理过程。
1. 主要包含两个步骤,分别如下:
GUI人机交互界面从上到下的,程序设计从下到上的原则来实现本课题的数字图像处理系统的功能集合。
实现本系统对处理图像的读取和保存、撤销和还原、图像剪切、图像反色、图像旋转等修剪。设计GUI人机交互界面实现对图像添加噪声、图像滤波、边缘检测等处理功能的程序。
2. 以下附上本科时代学习笔记
#基于matlab的图像处理系统设计
1、设计目的
利用matlab的GUI程序设计一个简单的图像处理系统,可以实现图像的简单的运算操作,实现图像的剪切、旋转、滤波、放缩等功能,进一步熟悉matlab语言。
2、设计要求
设计程序有以下基本功能:
3、设计的matlab数字图像处理系统框架
该GUI界面包含两个显示界面axes1和axes2。包含读取图像、椒盐噪声,乘性噪声,高斯噪声,保存图像,退出系统,剪切图像,图像反色,滤波,旋转,撤销和还原等按钮,构成了这个系统的框架。运行之后的界面显示如下:
4、GUI各个模块功能的实现
4.1、图像的读取
利用matlab的uigetfile获取图像的路径,msgbox窗口函数提示选择图像失败,imshow对图像的显示。
global s %定义全局变量,为了后面的还原保存数据
[filename,pathname,filterindex]=...
uigetfile({'*.*';'*.bmp';'*.tif';'*.png';'*.jpg';'*.jpeg'},'select picture'); %选择图片路径
str=[pathname filename]; %合成路径+文件名
s=str;
handles.filebig=filterindex;
if filterindex==0
msgbox('选择图像失败!','error');
return
else
im=imread(str); %读取图片
end
axes(handles.axes1); %使用第一个axes
imshow(im); %显示图片
handles.img=im;
guidata(hObject,handles);
4.2、图像的保存
图像保存利用matlab的uiputfile函数和IMwrite函数进行数据的写入。msgbox(‘参数1’,‘参数2’)实现窗口的界面。
if handles.img==0
msgbox('没有可保存的图像!','error');
return;
else
[filename,pathname,filterindex]=...
uiputfile({'*.bmp';'*.tif';'*.png';'*.jpg';'*.jpeg'},'save picture');%存储图片路径
end
if filterindex==0
return %如果取消操作,返回
else
str=[pathname filename]; %合成路径+文件名
axes(handles.axes2); %使用第二个axes
imwrite(handles.img,str); %写入图片信息,即保存图片
end
程序的主要部分是通过uiputfile函数选择图像的格式和路径,通过imwrite函数实现图像的保存,最后完成保存工作。通过之后的完善,参数handles.img=0时,表示没有图像可以保存,考虑其中的情况修复这种情况下的系统报错;另外filterindex=0时,按了保存按钮,但是没有保存这种情况,修复了保存的可能性。
4.3、系统退出
clc
clear
close(gcf)
该部分利用clc清屏指令,clear清除内存,close(gcf)就是关闭当前窗口的指令。来实现系统的退出。
4.4、图像反色
利用反色函数imcomplement()实现图像的反色,可以反色彩色和灰色图像
global T %定义全局变量,保存上一个操作数据,实现撤销操作
T=handles.img;
axes(handles.axes1);
imshow(handles.img);
mysize=size(handles.img);
I=imcomplement(handles.img);%还需要进一步修改。
axes(handles.axes2);
imshow(I);
handles.img=I;
guidata(hObject,handles);
效果图如下:
4.5、图像的剪切
利用matlab的imcrop函数实现图像的剪切。
global T
T=handles.img;
if handles.filebig==0
msgbox('处理失败,请选择图像。','error');
return;
else
axes(handles.axes1);
imshow(handles.img);
I=imcomplement(handles.img);%还需要进一步修改。
end
axes(handles.axes2);
imshow(I);
handles.img=I;
guidata(hObject,handles);
4.6、加入噪声
4.6.1、椒盐噪声
global T
axes(handles.axes1);
imshow(handles.img);
T=handles.img;
mysize=size(handles.img);
if numel(mysize)<3
msgbox('处理失败,请选择RGB图像。','error');
return;
else
prompt={'输入椒盐噪声:'};
defans={'0.02'};
p=inputdlg(prompt,'input',1,defans);%prompt是提示语,input是对话框的标题,1是输入方框的大小设置,defans是输入框的默认值
p1=str2num(p{1});
f=imnoise(handles.img,'salt & pepper',p1); %由于调试出现各种错误提示,不知道什么情况,最后发现salt&pepper之间需要空格。
end
axes(handles.axes2);
imshow(f);
handles.img=f;
guidata(hObject,handles);
4.6.2、乘性噪声
global T
T=handles.img;
axes(handles.axes1);
imshow(handles.img);
mysize=size(handles.img);
if numel(mysize)<3
msgbox('处理失败,请选择RGB图像。','error');
return;
else
prompt={'输入乘性噪声:'};
defans={'0.02'};
p=inputdlg(prompt,'input',1,defans);
p1=str2num(p{1});
f=imnoise(handles.img,'speckle',p1);%speckle
end
axes(handles.axes2);
imshow(f);
handles.img=f;
guidata(hObject,handles);
4.6.3、高斯噪声
global T
T=handles.img;
mysize=size(handles.img);
if numel(mysize)<3
msgbox('处理失败,请选择RGB图像。','error');
return;
else
axes(handles.axes1);
imshow(handles.img);
prompt={'输入高斯噪声1:','输入高斯噪声2:'};
defans={'0','0.02'};
p=inputdlg(prompt,'input',1,defans);
p1=str2num(p{1});
p2=str2num(p{2});
f=imnoise(handles.img,'gaussian',p1,p2);
end
axes(handles.axes2);
imshow(f);
handles.img=f;
guidata(hObject,handles);
4.7、边缘检测
global T
if handles.filebig==0
msgbox('请先输入图像!','error');
return;
else
T=handles.img;
axes(handles.axes1);
imshow(handles.img);
str=get(hObject,'string'); %拿到所选按钮的名称
axes(handles.axes2); %使用第二个axes
mysize=size(handles.img);
%判断读取的图像是彩色还是灰色图片,若是彩色图片进行灰度化,进一步进行边缘检测
if numel(mysize)>2
us=rgb2gray(handles.img);
else
us=handles.img;
end
switch str %选择语句
case'Graying' %点击原图按钮
BW=us;
imshow(BW); %显示原图
handles.img=BW;
guidata(hObject,handles);
case'Roberts' %点击Roberts边缘检测按钮
BW=edge(us,'roberts');
imshow(BW);
handles.img=BW;
guidata(hObject,handles);
case'Sobel' %点击Sobel边缘检测按钮
BW=edge(us,'sobel');
imshow(BW);
handles.img=BW;
guidata(hObject,handles);
case'Prewitt' %点击Prewitt边缘检测按钮
BW=edge(us,'prewitt');
imshow(BW);
handles.img=BW;
guidata(hObject,handles);
case'Log' %点击Log边缘检测按钮
BW=edge(us,'log');
imshow(BW);
handles.img=BW;
% handles.xiao=0;%........................................计数操作
guidata(hObject,handles);
case'Canny' %点击Canny边缘检测按钮
BW=edge(us,'canny');
imshow(BW);
handles.img=BW;
guidata(hObject,handles);
end;
end;
4.8、图像旋转
global T
if handles.filebig==0
msgbox('请输入函数图像!','error');
return;
else
T=handles.img;
prompt={'输入旋转角度:'};
defans={'30'};
p=inputdlg(prompt,'input',1,defans);%prompt是提示语,input是对话框的标题,1是输入方框的大小设置,defans是输入框的默认值
if ~isempty(p)%判断inputdlg是否有返回值。进一步判断
p1=str2num(p{1});
else
return;
end
end
handles.im1=imrotate(handles.img,p1,'nearest','crop');%crop
% guidata(hObject,handles);
axes(handles.axes2);
imshow(handles.im1);
handles.img=handles.im1;
guidata(hObject,handles);%需要保存数据不然后面的操作无法读取原来的数据,实现不了还原撤销操作。
4.9、图像滤波操作
4.9.1、平滑滤波
按钮可以识别系统是否含有可操作图像,可以进行提示,不会发生错误。
global T
if handles.filebig==0 %判断系统是否有处理文件
msgbox('请输入函数图像!','error');
return;
else
axes(handles.axes1);
imshow(handles.img);
T=handles.img;
axes(handles.axes2);
prompt={'请输入模板维度:'};
defans={'3'};
p=inputdlg(prompt,'input',1,defans);
p1=str2num(p{1});
h1=fspecial('average',[p1 p1]);
I=imfilter(handles.img,h1);%线性空间滤波
end
imshow(I);
handles.img=I;
guidata(hObject,handles);
4.9.2、锐化滤波
4.9.2.1、sobel滤波
global T
if handles.filebig==0
msgbox('请输入函数图像!','error');
return;
else
axes(handles.axes1);
imshow(handles.img);
T=handles.img;
axes(handles.axes2);
h=fspecial('sobel');
g2=imfilter(handles.img,h);
g3=imadd(g2,handles.img);
end
imshow(g3);
handles.img=g3;
guidata(hObject,handles);
4.9.2.2、prewitt滤波
global T
if handles.filebig==0
msgbox('请输入函数图像!','error');
return;
else
axes(handles.axes1);
imshow(handles.img);
T=handles.img;
axes(handles.axes2);
h=fspecial('prewitt');
g2=imfilter(handles.img,h);
g3=imadd(g2,handles.img);
end
imshow(g3);
handles.img=g3;
guidata(hObject,handles);
4.9.2.3、laplacian滤波
global T
if handles.filebig==0
msgbox('请输入函数图像!','error');
return;
else
axes(handles.axes1);
imshow(handles.img);
T=handles.img;
axes(handles.axes2);
h=fspecial('laplacian');
g2=imfilter(handles.img,h);
g3=imadd(g2,handles.img);
imshow(g3);
end
handlse.img=g3;
guidata(hObject,handles);
5.0、系统撤销与还原
系统的还原是通过之前定义的全局变量s,通过按钮按键,从新读取最原始的数据,显示在axes2上,实现还原功能。
global s
if handles.filebig==0
msgbox('请输入函数图像!','error');
return;
else
im=imread(s);
end
axes(handles.axes2);
imshow(im);
handles.img=im;
guidata(hObject,handles);
系统撤销实现是通过全局变量,记录上一次操作结果,对上一次操作结果的显示,实现对操作的撤销功能。
global T
if handles.filebig==0
msgbox('请输入函数图像!','error');
return;
else
handles.img=T;
end
axes(handles.axes2);
imshow(T);
guidata(hObject,handles);
6、学习总结与归纳
这次GUI图像处理系统的学习,主要是为了更好地学习matlab操作,对matlab有更好地了解。一开始确实很迷茫,不知道用matlab软件该怎么来做这个简易的系统,在查询了资料之后大概了解了怎么来处理这个问题的大概思路,就是利用matlab的GUI人机交互界面来实现这个面板,在每个按钮下面来实现每一个功能。先从上往下设计,程序是从下往上设计的思路,最后来完成这个功能集合。在实验的过程中,遇到了很多的问题,就是因为不熟悉matlab,自己有好多想法但是不知道怎么来实现,然后我自己还的去查找、复习那些调用函数。
ANSWER=inputdlg(PORMPT)创建一个对话框,对cell array名字在pormpt里面定义。弹出一个名字为potmpt的cell array,输入值返回到answer。
ANSWER = inputdlg(PROMPT,NAME) specifies the title for the dialog.
ANSWER = inputdlg(PROMPT,NAME,NUMLINES) specifies the number of lines for each answer in NUMLINES.
ANSWER = inputdlg(PROMPT,NAME,NUMLINES,DEFAULTANSWER) specifies the default answer to display for each PROMPT.Default Answer must be a cell array of strings.
下面例子是有两个输入框,名字叫‘name’,‘只有一行输入框’,初始值在defaultanswer中定义。最后全部返回到answer中,实现数据传递。
prompt={'Enter the matrix size for x^2:','Enter the colormap name:'};
name='Input for Peaks function';
numlines=1;
defaultanswer={'20','hsv'};
answer=inputdlg(prompt,name,numlines,defaultanswer);
这是一个用于很好的人机交流界面,可以让用户自己很好的调试自己的产品窗口。
在各个按钮功能完成之后,进行了程序bug的修复,当按钮没有传递数据时出现的报错进行了修复完善。之前系统不能还原和撤销,还不能对已经处理的图像再进行处理。在后面的修复中,通过全局变量T和s来分别保存上次操作变量,和最初读入图像来实现了系统操作的撤销和还原。可以重复累加的对图像进行处理。这样系统功能就更加完善。
缺陷在于系统任然有的时候会出现报错,对剪切个位元素图像矩阵时出现报错。个别情况还原出现报错,还未能找到原因。不能实现撤销多级,应该利用多个全局变量保存操作图像就能实现撤销多级功能,这还有待修复。