资源描述
《图像处理演示系统课程设计》
院、系(部)
专业及班级
学 号
姓 名
日 期
摘要
数字图像处理的目的在于改善图像的质量,主要以改善人的视觉效果为目的。目前,图像处理技术应用领域广泛医学、军事、科研、商业等领域。因为数字图像处理技术易于实现非线性处理,处理程序和处理参数可变,故是一项通用性强,精度高,处理方法灵活,信息保存、传送可靠的图像处理技术。
本图像处理演示系统以数字图像处理理论为基础,对部分常用功能进行可视化设计,简洁大方,方便用户操作。本文使用MATLAB设计良好的用户界面,从加载、显示、输出及图像的几何变换(平移、缩放、旋转、翻转)与图像增强(空间域的平滑滤波与锐化滤波)等方面提供了简单但实用的基本图像处理功能。
1.主要内容
1.1 图像处理演示系统设计要求
1)能加载和显示原始图像,显示和输出处理后的图像;
2)实现各部分功能且便于维护和具备可扩展性;
3)界面美观并且便于操作;
1.2图像处理演示系统设计任务
数字图像处理演示系统应该具备图像的图像增强(空间域的平滑滤波与锐化滤波)、几何变换(平移、缩放、旋转、翻转)、绘制直方图的简单处理功能。
1.2.1图像增强
图像增强是数字图像处理的基本内容之一,其目的是根据应用需要突出图像中的某些“有用”的信息,削弱或去除不需要的信息,以达到扩大图像中不同物体特征之间的差别,使处理后的图像对于特定应用而言,比原始图像更合适,或者为图像的信息提取以及其他图像分析技术奠定了基础。一般情况下,经过增强处理后,图像的视觉效果会发生改变,这种变化意味着图像的视觉效果得到了改善,某些特定信息得到了增强。
1.2.2几何变换
几何变换又称为几何运算,它是图像处理和图像分析的重要内容之一。通过几何运算,可以根据应用的需要使原图像产生大小、形状、和位置等各方面的变化。简单的说,几何变换可以改变像素点所在的几何位置,以及图像中各物体之间的空间位置关系,这种运算可以被看成是将各物体在图像内移动,特别是图像具有一定的规律性时,一个图像可以由另外一个图像通过几何变换来产生。实际上,一个不受约束的几何变换,可将输入图像的一个点变换到输出图像中的任意位置。几何变换不仅提供了产生某些特殊图像的可能,甚至还可以使图像处理程序设计简单化。从变换性质来分可以分为图像的位置变换、形状变换等
2.设计思想:
2.1 图像处理演示系统实现工具的选择
使用MATLAB软件进行界面设计及程序编写。
2.2 系统结构框图
3.图形用户界面设计
GUI是实现人机交互的中介,可以通过它实现数据输入、处理和输出。MATLAB提供了一个专门的GUI设计工具——图形用户界面开发环境(GUIDE),使用该工具,可以快速完成GUI设计任务。利用MATLAB提供的有关数据,还可以创建工具栏控件和多种对话框。
3.1启动GUIDE
在命令窗口输入GUIDE,则显示如下的“GUIDE Quick Start”对话框。
打开“GUIDE Quick Start”对话框,利用GUIDE模板创建新的GUI,选择一个模板后,
点击OK按钮,在输出编辑器中打开GUI。添加菜单以及选择模板后点击运行显示如下:
4.图像处理演示系统各功能的实现
4.1文件的打开与保存
4.1.1文件的打开
在主菜单“文件”的下拉菜单中,有个“打开”选项,在其回调函数中添加打开某个文件的相关代码:
[filename, pathname] = uigetfile( ...
{'*.bmp;*.jpg;*.gif;','Files (*.bmp,*.jpg,*.gif)';
'*.bmp', '位图文件(*.bmp)'; ...
'*.jpg','Figures (*.jpg)'; ...
'*.gif','MAT-files (*.gif)'; ...
'*.*', 'All Files (*.*)'}, ...
'Open a file');
global w h img xx;
L=length(filename);
if filename < 5 return
end
V=strcat(pathname,filename);
xx=imfinfo(V);
handles.my_data1=V;
guidata(hObject,handles);
axes(handles.axes1);
img = imread(V);
[w,h,l]=size(img);
imshow(img);
filename为将要打开文件的文件名,pathname为将要打开文件的路径。Uigetfile函数中主要有两部分参数'*.bmp;*.jpeg;*.gif…'是想要打开文件的格式,’Open the file’是生成文件选择打开对话框的标题,载入一幅位图,其运行效果如下:
4.1.2文件的保存
在主菜单“文件”的下拉菜单中,有个“保存”选项,在其回调函数中添加保存某个文件的相关代码:
[newfile,newpath]=uiputfile( ...
{'*.bmp;*.jpg;*.gif;','MATLAB Files (*.bmp,*.jpg,*.gif)';
'*.bmp', '位图文件(*.bmp)'; ...
'*.jpg','Figures (*.jpg)'; ...
'*.gif','MAT-files (*.gif)'; ...
'*.*', 'All Files (*.*)'}, ...
'Save a file');
global img;
imwrite(img,strcat(newpath,newfile));
把当前文件保存到用户选择的保存路径下,文件保存对话框中列出当前目录下的所有文件,保存的文件名和路径名保存到newfile和newpath中。
4.2 图像的增强
4.2.1 图像的平滑滤波处理
1)平滑滤波的作用:
对图像的高频分量进行消弱或消除,增强图像的低频分量。平滑滤波一般用于消除图像中的随即噪声,从而起到图像平滑的作用
2)平滑滤波原理:
(1)邻域平均滤波法
邻域平均滤波法是将一个像素点及其邻域中的所有像素点的平均值赋给输出图像中相应的像素点,从而达到平滑的目的,又称均值滤波法。最简单的邻域平均滤波法是所有模板系数都取相同的值.
邻域平均滤波法的运算公式为:
g(x,y)=1/N ∑ f(i.j) x,y=0,1,2,…,N-1
j=∈M
其中,M是以(x,y)为中心的邻域像素点的集合,N是该邻域内像素点的总个数,对每个像素点按该公式进行计算即可得到增强图像中所有像素点的灰度值。
(2)中值滤波法
尽管邻域平均滤波法可以起到平滑图像的作用,但在消除噪声的同时会使图像中的一些细节变得模糊。中值滤波法则在消除噪声的同时还能保持图像中的细节部分,防止图像的边缘部分模糊。
与邻域平均法不同,中值滤波是将邻域内所有的像素点值按从小到大的顺序排列,取中间值作为中心像素点的输出值。其原理是利用一个奇数点的移动窗口,将窗口中心点的值用窗口各点的中间值代替,与均值滤波不同,它不是通过对邻域内的所有像素点求平均值来消除噪声的,而是让与周围像素点灰度值的差比较大的像素点改取近似于周围像素点灰度值的值。从而达到消除噪声的目的。
3)实现方法:
这里主要以采用中值滤波法对图像进行处理(平滑处理)为例,其实现方法如下:
global w h img;
img2 = img;
for i=2:w-1
for j=2:h-1
for m=1:3
for n=1:3
hhh((m-1)*3+n)=img(i+m-2,j+n-2);
end
end
for p=1:9
for q=p+1:9
if(hhh(p)>hhh(q))
temp=hhh(p);
hhh(p)=hhh(q);
hhh(q)=temp;
end
end
end
img2(i,j)=hhh(5);
end
end
img = img2;
imshow(img);
中值滤波处理(平滑处理)后的结果为:
4.2.2图像的锐化滤波处理
1) 锐化滤波的作用:
图像的平滑处理会使图像的边缘纹理信息受到损失,图像变得比较模糊。如果需要突出图像的边缘纹理信息,则可以通过锐化滤波器实现,它可以消除或减弱图像的低频分量从而增强图像中物体的边缘轮廓信息,使得除边缘以外的像素点的灰度值趋向于零。
2)锐化滤波原理
锐化滤波器是以对图像的微分运算或差分运算为基础。微分运算是求像素点灰度值的变化率,而图像内不同物体边缘处的像素点的灰度值往往变化比较明显,因此微分运算或差分运算可以起到增强边缘信息的作用。
锐化算子:
0 -1 0
H = -1 4 -1
0 -1 0
3)实现方法:
global w h img;
img1=im2double(img);
a=img1(:,:,1);
b=img1(:,:,2);
c=img1(:,:,3);
img2=img1;
for i=2:w-1
for j=2:h-1
img2(i,j)=abs(4*img1(i,j)-img1(i-1,j)-img1(i+1,j)-img1(i,j-1)-img1(i,j+1));
end
end
img = im2uint8(img2);
imshow(img);
其锐化处理结果为:
4.3 图像的几何变换
4.3.1 对图像进行平移
1)图像平移的作用:
将图像中的某点从一个位置(X,Y)移动到另外一个位置(X0,Y0),而使平移后的图像与原始图像完全相同。
2)图像平移原理:
图像的平移是图像变换中最简单的变换之一,其特点是平移后的图像与原图像完全相同,平移后新图像上的每一个点都可以在原图像中找到对应的点。
若点A0(X0,Y0)进行平移后,被移到A(X,Y),其中X方向的平移量为△X.Y方向的平移量为△Y,那么点A(X,Y)的坐标为:
X=X0+△X
Y=Y0+△Y
实现方法:
global w h img;
prompt={'请输入横向平移量'}; title='';
ansa=inputdlg(prompt,title);
x1=str2num(ansa{1});
handles.my_data4=x1;
prompt={'请输入纵向平移量'}; title='';
ansa=inputdlg(prompt,title);
y1=str2num(ansa{1});
handles.my_data5=y1;
guidata(hObject,handles) %上段代码中的x1,y1即为需要输入的横向平移量与纵向平移量
for x=1:w
for y=1:h
PosSourceX=uint16(x+x1);
PosSourceY=uint16(y+y1);
if((PosSourceX<1) || (PosSourceX>w) || (PosSourceY<1) || (PosSourceY>h))
if (xx.BitDepth==24) Transfor(x, y,1:3) = uint8(1);
else Transfor(x, y) = uint8(1);end
else if (xx.BitDepth==24)
img(x,y,1:3) = BmpImage(PosSourceX,PosSourceY,1:3);
else img(x,y) = BmpImage(PosSourceX,PosSourceY);
end end end end
imshow(img)%(PosSourceX和 PosSourceY是平移后坐标点,Transfor为平移后图片)
4.3.2 对图像进行缩放
1)图像缩放的作用:
对图像进行缩小和放大的处理,可分别对其宽和高的缩放量进行设置。
2)图像缩放原理:
通常情况下,数字图像的比例缩放是将给定的图像在X方向和Y方向按相同比例缩放a倍。从而获得一副新的图像,如果X方向和Y方向缩放的比例不同,则图像的比例缩放会改变原始图像像素之间的相对位置,产生几何畸变。设原始图像中的点A0(X0,Y0)比例缩放后,在新图像中的对应点为A1(X1,Y1),则坐标关系可表示为:
X1=aX0
Y1=bX0
若比例缩放所产生的图像中的像素在原图像中没有相对应的像素点时,就需要进行灰度值的插值运算,一般有以下两种插值处理方法。
(1) 直接赋值为和它最相近的像素灰度值,这种方法称为最邻近插值法,该方法的主要特点是简单、计算量很小、但可能会产生马赛克现象;
(2) 通过其他数学插值算法来计算相应像素点的灰度值,这类方法处理效果好,但运算量会有所增加
3)实现方法:
prompt={'请输入X向缩放倍数:'};
title='';
ansa=inputdlg(prompt,title);
sx=str2num(ansa{1});
handles.my_data3=sx;
guidata(hObject,handles)
m=xx.Width;
n=xx.Height;
m1=m*sx;n1=n*sy; %设置Y向缩放倍数sy.
for h=1:m1;
for w=1:n1;
b(h,w)=i(round(h/sx),round(w/sy));%round 取最邻近整数
end
end
(m,n为原始图像的二维数据,m1,n1为缩放后的图像二维数据,xx为读取的原始图像信息)
缩放处理结果显示如下:
4.3.3 对图像进行旋转
1)图像旋转的作用:
对图像进行任意角度的旋转。
2)图像旋转原理:
图像的旋转变换是几何学中研究的重要内容之一,一般情况下,图像的旋转变换是指以图像的中心为原点,将图像上的所有像素都旋转同一个角度的变换。图像经过旋转变换之后,图像的位置发生了改变,但旋转后,图像的大小一般会改变。和平移变换一样,在图像旋转变换中既可以把转出显示区域的图像截去,又可以扩大显示区域的图像范围以显示图像的全部。
设原始图像的任意点A0(X0,Y0)经过旋转β角度以后到新的位置A(X,Y),为表示方便,采用极坐标形式表示,原始点的角度为а。如下图所示
P
r A(X,Y)
r A0(X0,Y0)
根据极坐标与二维垂直坐标的关系,原始图像的点A0(X0,Y0)的X0和Y0坐标如下:
X0=rcosа
Y0=rsinа
旋转到新位置以后点A(X,Y)的坐标如下:
X=rcos(а-β)=rcosаcosβ+rsinаsinβ=X0cosβ+Y0sinβ
Y=rsin(а-β)=rsinаcosβ-rcosаsinβ=-X0sinβ+Y0cosβ
图像的旋转变换用矩阵形式表示如下:
X cosβ sinβ 0 X0
Y = -sinβ cosβ 0 Y0
1 0 0 1 1
对图像进行旋转操作时需要输入旋转(该题中旋转角为90度)角度,相关实现代码如下:
global w h img;
prompt={'请输入旋转角度:'};
title='Angle Degrees';
ansa=inputdlg(prompt,title);
n=str2num(ansa{1});
i=im2double(img);
pai=3.14;
n=pai*n/180; %将角度转换为直观的表示方法,便于直接输入度数。
img1=zeros(w,h);
for i=1:(w-1)
for j=1:(h-1)
img1(int32(i*cos(n)+sin(n)*j),int32(j*cos(n)-i*1*sin(n)))=i(i,j);
end
end
img=im2unit8(img1);
imshow(img);
旋转处理如下图所示:
4.3.4对图像进行翻转
1)图像翻转的作用:
实现图像的水平翻转
2)图像翻转原理:
垂直方向:y′=h-y+1
水平方向:x′=w-x+1
其中为h图像高,w为图像宽
3)实现方法:
global xx img w h;
img1=img;
for i=1:w
for j=1:h
img1(i,j,1:3)=img(w-i+1,h-j+1,1:3);
end
end
img=img1;
imshow(img);
其结果如下显示:
对翻转后的图像锐化所显示的图像为:
4.4 图像直方图的绘制
1) 图像直方图绘制的作用:
实现图像直方图的均衡化。
2)图像直方图均衡原理:
直方图均衡化是将原图像的直方图通过变换函数修正为均匀的直方图,然后按均衡直方图修正原图像。
图像均衡化处理后,图像的直方图是平直的,即各灰度级具有相同的出现频数,那么由于灰度级具有均匀的概率分布,图像看起来就更清晰了。
首先假定连续灰度级的情况,推导直方图均衡化变换公式,令r代表灰度级,P ( r ) 为概率密度函数。 (注:r值已归一化,最大灰度值为1)。
3)实现方法:
global xx img w h;
img1=rgb2gray(img);
img1 = double(img1);
%img1 = uint8(255 * img1 * 0.5 + 0.5);
grey_grade=2^8;
for i=1:grey_grade
grey_friq(i)=0;
end
for y=1:w
for x=1:h
grey_friq(img1(y,x)+1)= grey_friq(img1(y,x)+1)+1;
end
end
bar(1:256,grey_friq);
该图像的直方图显示如下:
5.小结
从通常意义上讲,数字图像处理技术更加普遍、可靠和准确,比起模拟方法,它们也更容易实现,专用的硬件被用于数字图像处理。今天,硬件解决方案被广泛的用于视频处理系统,但商业化的图像处理任务基本上仍以软件形式实现,运行在通用个人电脑上,掌握进一步的图像处理技能对今后的学习和工作生活也都有其积极的影响!
通过这个阶段的努力本图像处理演示系统已基本完成了对文件的打开保存,以及对图像的平移、图像的旋转、翻转、图像的缩放、图像的增强等功能的实现,由于个人水平和时间的有限,此次课程设计还存在许多想法没有很好的实现,扩展功能上也有一定的局限性,希望能在今后的学习中逐渐弥补和改善!
6.源程序
function varargout = graph(varargin)
% GRAPH M-file for graph.fig
% GRAPH, by itself, creates a new GRAPH or raises the existing
% singleton*.
%
% H = GRAPH returns the handle to a new GRAPH or the handle to
% the existing singleton*.
%
% GRAPH('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in GRAPH.M with the given input arguments.
%
% GRAPH('Property','Value',...) creates a new GRAPH or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before graph_OpeningFunction gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to graph_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 graph
% Last Modified by GUIDE v2.5 10-Jul-2014 13:33:34
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
global w h img xx;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @graph_OpeningFcn, ...
'gui_OutputFcn', @graph_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin & isstr(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
Else gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before graph is made visible.
function graph_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to graph (see VARARGIN)
% Choose default command line output for graph
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes graph wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = graph_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to 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 file_Callback(hObject, eventdata, handles)
% hObject handle to file (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --------------------------------------------------------------------
function openFile_Callback(hObject, eventdata, handles)
% hObject handle to openFile (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[filename, pathname] = uigetfile( ...
{'*.bmp;*.jpg;*.gif;','MATLAB Files (*.bmp,*.jpg,*.gif)';
'*.bmp', '位图文件(*.bmp)'; ...
'*.jpg','Figures (*.jpg)'; ...
'*.gif','MAT-files (*.gif)'; ...
'*.*', 'All Files (*.*)'}, ...
'Open a file');
global w h img xx;
L=length(filename);
if filename < 5
return
end
V=strcat(pathname,filename); xx=imfinfo(V);
handles.my_data1=V; guidata(hObject,handles);
axes(handles.axes1); img = imread(V);
[w,h,l]=size(img); imshow(img);
% --------------------------------------------------------------------
function save_Callback(hObject, eventdata, handles)
% hObject handle to save (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[newfile,newpath]=uiputfile( ...
{'*.bmp;*.jpg;*.gif;','MATLAB Files (*.bmp,*.jpg,*.gif)';
'*.bmp', '位图文件(*.bmp)'; ...
'*.jpg','Figures (*.jpg)'; ...
'*.gif','MAT-files (*.gif)'; ...
'*.*', 'All Files (*.*)'}, ...
'Save a file');
global img;
imwrite(img,strcat(newpath,newfile));
% --------------------------------------------------------------------
function strength_Callback(hObject, eventdata, handles)
% hObject handle to strength (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --------------------------------------------------------------------
function smooth_Callback(hObject, eventdata, handles)
% hObject handle to smooth (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global w h img;
img2 = img;
for i=2:w-1
for j=2:h-1
for m=1:3
for n=1:3
hhh((m-1)*3+n)=img(i+m-2,j+n-2);
end
end
for p=1:9
for q=p+1:9
if(hhh(p)>hhh(q))
temp=hhh(p);
hhh(p)=hhh(q);
hhh(q)=temp;
end
end
end
img2(i,j)=hhh(5);
end
end
img = img2; imshow(img);
% --------------------------------------------------------------------
function sharping_Callback(hObject, eventdata, handles)
% hObject handle to sharping (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global w h img;
img1=im2double(img);
a=img1(:,:,1);
b=img1(:,:,2);
c=img1(:,:,3);
img2=img1;
for i=2:w-1
for j=2:h-1
img2(i,j)=abs(4*img1(i,j)-img1(i-1,j)-img1(i+1,j)-img1(i,j-1)-img1(i,j+1));
展开阅读全文