30 May 2010

matlab GUI资料

matlab GUI资料












































































































MATLAB GUI应用__MATLAB资料汇总
资料名称 免费下载地址
李显洪《Matlab7.x界面设计与编译技巧》PDF下载 http://www.matlabfan.com/thread-315-1-1.html
图形用户界面(GUI)制作-彩色教程(很多实例) http://www.matlabfan.com/thread-218-1-1.html
GUI演示实例:自制简易计算器 http://www.matlabfan.com/thread-114-1-1.html
MATLAB环境下使用摄像头 http://www.matlabfan.com/thread-899-1-1.html
关于Matlab GUI的课件ppt http://www.matlabfan.com/thread-576-1-1.html
GUI生成exe后,去掉执行程序时出现的dos窗口 http://www.matlabfan.com/thread-503-1-1.html
把Matlab中的GUI生成独立的应用程序(EXE文件) http://www.matlabfan.com/thread-284-1-1.html
在GUI中调用simulink模块,显示并修改参数 http://www.matlabfan.com/thread-1022-1-1.html
matlab gui实例,有很多,解释的也很详细 http://www.matlabfan.com/thread-775-1-2.html
基于Matlab GUI的贪食蛇游戏 http://www.matlabfan.com/thread-552-1-2.html
一个GUI的项目例子,希望对大家有帮助(转载) http://www.matlabfan.com/thread-551-1-2.html
GUI演示实例:主成分分析GUI代码---很经典 http://www.matlabfan.com/thread-113-1-2.html
一个实例搞定MATLAB界面编程 http://www.matlabfan.com/thread-245-1-2.html
Matlab GUI 编程(适用于Matlab的初学者) http://www.matlabfan.com/thread-95-1-2.html
强烈推荐!学习GUI的35个实例! http://www.matlabfan.com/thread-605-1-2.html
MATLAB精通GUI图形界面编程 http://www.matlabfan.com/thread-554-1-2.html
很好的GUI学习开发经验 http://www.matlabfan.com/thread-148-1-2.html
基于Matlab GUI的扫雷游戏 http://www.matlabfan.com/thread-149-1-2.html
GUI中各种控件的特征属性的意义和应用 http://www.matlabfan.com/thread-115-1-2.html
【GUI演示实例】Real-Time Stock Viewer(实时股票浏览器) http://www.matlabfan.com/thread-367-1-2.html
基于MATLAB_GUI的简易计算器源程序 http://www.matlabfan.com/thread-817-1-2.html

29 May 2010

ZT: matlab gui标准控件


三类:用户界面控件、下拉菜单、内容菜单。
1. 用户界面控件包括各种常见控件,如按钮、列表框、编辑框等;
2. 下拉菜单对象主要是各种菜单和子菜单;
3. 内容菜单主要是内容式菜单,如弹出式菜单等。


MATALB的标准图形用户界面
1. 消息对话框
msgbox函数。它不接受用户的任何输入,在用户单击OK按钮后,对话框自动关闭,然后返回程序中继续执行。
>> msgbox('欢迎使用MATLAB') % 建立一个没有标题的消息对话框
>> msgbox('欢迎使用MATLAB','MATALB','warn') %% 建立一个有标题的消息对话框

2. 错误对话框
errordlg函数。 >> errordlg %建立一个默认参数的错误对话框
>> errordlg('这是一个错误对话框','MATLAB error') %建立一个名为MATLAB error的错误对话框

3. 警告对话框
warndlg函数。 >> warndlg %建立一个默认参数的警告对话框
>> errordlg('这是一个警告对话框','MATLAB warning')

4. 帮助对话框
helpdlg函数。
>> helpdlg('你需要帮助吗?','MATLAB Help')

5. 进度条设置对话框
waitbar函数。作用是反映程序运行的完成情况。
h=waitbar(0,'请稍等......')
for i=1:10000
waitbar(i/10000)
end

6.输入对话框
inputdlg函数。
prompt={'输入梯形的上底:','输入梯形的下底','输入梯形的高'};%设置提示字符串
name='Enter trapeaia Data';%设置标题
numlines=1;%指定输入数据的行数
defAns={'20','50','40'};%设定默认值
Resize='on';%设定对话框尺寸可调节
answer=inputdlg(prompt,name,numlines,defAns,'on')%创建输入对话框

7. 列表对话框
listdlg函数。
p=path(path,'C:\MATLAB7 \work');%设置路径,若为当前目录,可以省略这一步
d=dir('C:\MATLAB7\work');%获取指针,若为当前目录,则d=dir
str={d.name};%获取目录内的文件名
[sel,ok]=listdlg('Liststring',str,'PromptString','请选择文件 ','SelectionMode','Multiple')%创建列表对话框。
文件选择成功后,单击“OK‘按钮,系统将选择好的文件序号存入相应向量sel,参数ok的值为1。

8.问题对话框
questdlg函数。提出一个问题,等待用户回答。默认下回答按钮有三个:Yes、No、Cancel。当用户单击任何一个按钮时,系统将该按钮名保存 在一个变量(ButtonName)中。如果用户关闭对话框,则系统将ButtonName置为空。
>> ButtonName=questdlg('你准备好了吗?','MATLAB quest','Yes','No','Cancel','Yes')

9.路径选择对话框
uigedir函数。用于用户查找和选择路径。
>> directoryname=uigetdir('C:\MATLAB7\work','浏览文件件')

10.选择文件对话框
uigetfile函数。用于用户选择所需的文件。
① >> [fn,pn,fi]=uigetfile('*.m','select a M-file')%打开一个选择M文件的对话框,并选择一个文件
② [fn,pn,fi]=uigetfile(...
{'*.m;*.fig;*.mat;','All MATLAB File(*.m,*.fig,*.mat,*.mdl)';
'*.m','M-file(*.m)';...
'*.fig','Figure(*.fig)';...
'*.mat','MAT-flie(*.mat)';...
'*.mdl','Models(*.mdl)';...
'*.*','All Flies(*.*)'},...
'Pick a file')
%打开一个选择多种文件的对话框,并选择一个文件

11.文件保存对话框
uiputfile函数。用于保存文件。
① >> [fn,pn,fi]=uiputfile('*.m','Save selected a M-file')
② [fn,pn,fi]=uiputfile(...
{'*.m;*.fig;*.mat;','All MATLAB File(*.m,*.fig,*.mat,*.mdl)';
'*.m','M-file(*.m)';...
'*.fig','Figure(*.fig)';...
'*.mat','MAT-flie(*.mat)';...
'*.mdl','Models(*.mdl)';...
'*.*','All Flies(*.*)'},...
'Save a file')
%建立多种保存文件的对话框,并选择一个文件

12. 页面设置对话框
pagesetupdlg函数。用来设置页面的各种属性、参数。调用格式为:
dlg=pagesetupdlg(fig)
该命令创建一个页面设置对话框,在该对话框用户可以设置页面的各种属性和参数。该命令只支持单一图形窗口的页面设置,参数fig也必须是单一的图形句柄,不可以是图形句柄向量或simulink图。
>> fig=figure;
>> dlg=pagesetupdlg(fig)

13.打印设置对话框
printdlg函数。用户可以对各种打印参数进行设置。
x=[-pi:0.02:pi];
y=cos(x);
fig=figure;
plot(x,y);
printdlg(fig);%打开Windows打印对话框
printdlg('-crossplatform',fig);%打开MATLAB打印对话框

14.颜色设置对话框
uisetcolor函数。用于用户设置图形的前景色或背景色。
① >> c=uisetcolor %建立一个颜色选择对话框
② %建立一个颜色对话框,并设置对话框的初始颜色,然后选择一种颜色用于一个图形对象。
x=[0:0.02:2*pi];
y=sin(x);
h=figure;
plot(x,y);
c=uisetcolor(h,'select color')

15.字体设置对话框
uisetfont函数。用于用户设置或修改文本字体、坐标轴或设置控件对象的显示文本的字体属性。
① >> s=uisetfont % 建立一个默认字体设置对话框,并设置一种字体。
② 对控件中的文本进行设置
T1=uicontrol('style','pushbutton','string',' 确定',...
'position',[200 320 60 20]); %创建一个按钮
T2=uicontrol('style','pushbutton','string','取消',...
'position',[200 220 60 20]); %创建一个按钮
s=uisetfont(T1) %打开字体设置对话框
set(T2,s) %将T1的设置复制到T2

ZT-matlab gui笔记



1、从最简单的开始
编程最基本的目的就是——我执行一个操作,程序做出一个反应。
“一个操作”包括:点击鼠标,拖动滑块,填写数据,选择选项……
“做出一个反应”包括:计算一些东西,然后储存在哪里,或者贴个图出来,或者显示在哪里……
-------------------------------------------------------------------------------------------------------------------
编程的基本思想:

目的->当点击按钮A时, 然后执行任务C,
则->进入按钮A的回调函数callback 里,写下任务C的代码。
-------------------------------------------------------------------------------------------------------------------
a:不知道callback在哪??右键单击按钮,view callbacks->选择callback)别的控件也一样。
a:不同的回调函数啥意思??
callBack
最常用的就是它。如果控件是按钮,那点击按钮时,则按钮下的 Callback就会执行;如果是滑块,则拖动滑块时,滑块名下的callback就会执行;总之,就是对控件默认操作时,matlab后台就会自动调用它名下的的callback。正常用途,全放在callback下就够了。如果其他的,实在是想知道,了解一下也未尝不可。
ButtonDownFcn
就是鼠标在它(代指各种控件)上面点击一下,你放在这个函数名下的代码就会执行。(ps:按钮的callback也是点击,所以会覆盖掉这个 buttondownfcn。)
CreateFcn
顾名思义,在生成这个控件,显示之前,执行你放在这个函数名下的代码;
DeleteFcn
一样。在控件要销毁,但是被毁灭之前执行这个函数名下的代码。貌似“真的要退出吗”这一类就是写在这里。
KeyPressFcn
当前控件获得焦点且有按键按下时执行。(什么是焦点?就是这个控件被鼠标点了(或者是tab轮选到了)。你打开一个记事本,然后再点这个网页,再随 便按几个按键,记事本上有字不?没有对吧。因为它没获得焦点,所以你的按键它不会反应的。只有你最后再点它一下,再按几个按键,结果怎么样?有字了吧?)这里的KeyPressFcn也是一样的道理。
一般在这下面的代码还会判断下按键是什么,然后执行相应的代码。
ResizeFcn,SelectionChangeFcn 不常用。也懒得去看了。附几句,控件都有Resize的属性,好像默认是不可调整,如果要用到这个函数,去把它打开先。
SelectionChangeFcn
是在群按钮 组件中,改变选择时,所执行的函数。
哪些控件支持哪些回调函数?很简单,你在它上面右键就可以看到了,点进去就可以编辑了。
可以在property inspect中在需要的回调函数下设置%automatic 就可以自动添加相应的回调函数框架。

2、常用控件代码框架参考
---------------------------------------------------------------------
Toggle Button 的callback一般写法
toggle button是什么?设计面板上,左边那一栏图标,看到它名字了吧?没看到?File->preference->GUIDE->把那个show names那一栏勾选上。好了,可以看到了吧 。知道是什么了吧?
拖进来,双击它,看到它的属性设置表。上面各种各样的属性,以后有时间慢慢研究。
点下它时,它默认value ='Max'
不点下它时,它value='Min'
--------
代码:

functon togglebutton1_callback(hObject,eventdata,handles)
%这一句,现在不用管。自动加的。
%%%以下是一般代码
button_state = get(hObject,'Value')
%控件甲的callback下面hObject就是控件甲,同理控件乙callback下的hObject......
if button_state==get(hObject,'Max')
%则怎么怎么怎么
else if button_state==get(hObject,'Min')
%则怎么怎么怎么
end
--------
备注:button_state随便取的变量名,存放按钮的选择状态,别以为它是什么喔。
如果你的button甲是放在一个buttonGroup里面,则button甲callback下的代码就要挪到buttonGroup下面去。因为buttonGroup的回调函数会覆盖掉它成员的回调函数。
----------------------------------------
Radio Buttons
------
代码:

右键点选你的Radio按钮,进入编辑callback
function ………………略
if(get(hObject,'Value')==get(hObject,'Max'))
%被选中了,你想怎么样
else
%不被选中,你想怎么样
end
-----------------------------------------
Check Boxes
-------
代码:

if(get(hObject,'Value')==get(hObject,'Max'))
%被选中了,你想怎么样
else
%不被选中,你想怎么样
end
------------------------------------------
Edit Text
-----------
代码:

function edit1_Callback(hObject,eventdata,handles)
user_string = get(hObject,'String'); %就得到了所输入的字符
%因为matlab是把所有的输入当作字符来看待,如果你是期望的到输入的数据的话,则:
user_entry= str2double(get(hObject,'String')); 这里进行一个数据类型转换。看函数名就知道了。
if isnan(user_entry) %nan就是not a number的简写。知道这个函数意思了吧?
errodlg('You must entry a number value','Bad Input','modal') %跳出一个对话框。
end
%正确得到了数值,以下输入你的其他代码
----------
附: 'Bad Input'是指窗口样式,就像我们在操作系统下,经常会跳出一个黄色感叹号的对话框,或者一个红叉的对话框;
modal是指窗口类型,就像一些程序跳出警告对话框,我们什么也不能做了,只能把那个对话框选择一个是或者不是,才能继续做其他事情。这种对话框就是modal类型。而通常的比如浏览器的界面,我们打开后,可以不管,然后打开别的对话框,这种就是非模态对话框。
默认在点击你的界面菜单栏或者界面上的其他组件后,这个edit text的callback都回被执行一遍,所以在你点确定按钮的时候,edit callback下读到的数据会更新的了,不用担心!
---------------------------------------------------
Sliders
---------
代码:

function slider1_callback(hObject,eventdata,handles)
slide_value=get(hObject,'Value');%获取滑块当前值
%别的代码
----------
附: 它的Max Min 属性设置了滑竿的最大最小范围值。
---------------------------------------------------
List Boxes
-----------
代码:

function ........
index = get(handles.listbox1,'Value'); %listbox1是你自己的那个控件的tag名字
file_list =get(handles.listbox1,'String'); %得到了你的listBoxes的列表
file_name = file_list{index};
%得到了所选择的项目名,一下写自己的代码
-------------------
附:
此 callback在鼠标在这个控件上松开或者特定的键盘按键松开(看你怎么设置它的别的属性的了)时候执行。
默认键盘上 下 键可以改变它的值同时执行一次callback。而enter和space不改变它的值,只是执行 callback
Max-Min 差值是0的话,表示只可以单选;1的话,表示可以多选。这个可以在他的属性栏里设置
----------------------------------------------------------
Pop_up Menus
--------------
代码:

function .......
val=get(hObject,'Value')
Switch val
case 1
%
case 2
%
defualt
......
end
----------------------------------------------------
Button Groups
------------------
代码:

function .......
switch get(hObject,'Tag');
%注意这里的hObject和别的不同,并不是指这个BUtton Group,而是指在组里面,被选中的那个控件
case 'radio button1' %按钮1的tag
%。。。。。
case '按钮2的tag'
%。。。。。
。。。
end
----------
附:所以在这里,如果要拿到button groups本身的话,就用handles.它的tag名 中间一个点。
--------------------------------------------------
Axes
-------------
它是用来画图的, 可以说是一块画布。它并不算是严格意义上的控件,但可以让用户在它的区域上点击或者移动鼠标时(看你是放在什么callback下了)执行一定的代码。那就要加它自己的callback函数了。
下面用来一般功能,所以不用自己的callback,代码都是写在别的控件回调函数下。

代码:

axes(handles.youraxesname);% 选择你的一个axes,自然,用它的tag来选中它
plot(x,y); %这时,所画的图就到它上面了
set(handles.youraxesname,'XMimrFrick','on'); %顺便设置一下它的属性
grid on; %加上网格
--------------------------------------------------
Active控件
------------
还没时间去研究。这个是最好用的,因为可以借用别人的现成的东西,毕竟自己不是程序员,没有必要编写太多的代码。一些通用的比如文件存取对话框,视频放映之类的。
可惜,我还没时间去看。呵呵。
------------------------------------------------------------------------------------------------------------------

3、怎么获得和设置控件的属性
------------
通俗的说,就是我怎么获取 编辑框里的字符,滑块现在的位置,pop up里被选中的选项,如何控制 static text显示我要求的信息
控件的属性当然远不止我刚刚说的。
在你需要的地方插入以下代码:
设置:
set(handles.你控件的tag,'要设置的属性名','要设置的属性值')
获取:
get(handles.你控件的tag,'要获取的属性名')

比如:set(handles.edit1,'string','hello world');
help里可以看到所有可能有用的属性
MATLAB->Creating Graphical User Interfaces->Laying Out GUIs and Setting Properties->What Properties Do I Need to Set?


4. 数据怎么在不同的控件之间传递
知道了GUI的数据管理规则,这个就很简单了。
-------------------
先看在一个GUI界面内部的传递的数据
每一个控件的回调函数头:
function myc_Callback(hObject, eventdata, handles)

第一个参数是hObject,是跟这个callback所关联的控件的 handles,在它自己的callback下,可以用代号-> hObject 来调用它。。不用管那么麻烦的概念,只用知道,控件自己的回调函数调用自己的属性,只用hObject. 属性名 就可以了(中间一点)。
第二个参数是MATLAB的保留参数
第三个handles,是这个GUI界面的代号。可以通过它获取这个界面的所有信息。所以在控件A自己的回调函数中,要获取或者设置别的控件的属性,就用 handles.别的控件Tag.属性
------------------------------
handles hObject 都是结构体。正常的编程概念。

handles格式是一个存放数据的缸。控件的handles是小缸,它的名字叫做hObject;GUI界面的handle是一个大缸,并且这个缸名字 也叫做handles;大缸里存放了所有的小缸和所有用户数据,你只需 handles.控件A的tag 就可以存取控件A的信息。

那我怎么把自己计算出或者别的什么数据放到这个缸里呢?
^_^ 在任何地方
handles.自己的变量名 = 某些值 (其实也就是给结构体添加成员变量)
这样你就定义了自己的变量。
在任何地方
b=handles.自己的变量名 (结构名加点号来引用成员变量)
就可以得到这个变量值,同样也可以修改它。
别忘了使用
guidata(hObject, handles);(不用改,直接黏贴) 在函数末尾来保存你对handles和hObject的操作。(不然你自定义的变量就没了)

5、在不同GUI之间传递数据
--------------
*************这部分是以前写的我发现我的理解有些问题---所以我现在传递数据用的application data的方法,没用这个。可能还没理解透output的函数作用***************
传入
那就来看打开一个GUI界面时,传给他的参数有哪些。

function mygui_OpeningFcn(hObject, eventdata, handles, varargin)
所有的启动参数都是通过varargin传到它的OpeningFcn里面的。那启动参数可以是哪些呢?

1、figure,也就是窗口参数。
比如说position之类
例如:打开这个GUI时,使用这个命令 mygui('Position',[434 234 234 34])则表示打开窗口在这个位置;还有哪些可控属性可以查help。
2、自定义参数 。
如果传入的参数不是figure的属性(matlab查找不到你输入的属性名),则你输入的参数作为一个向量存放在varargin里面。
比如mygui('路人甲','80‘),那varargin{1}存放了'路人甲',varargin{2}=’80‘
那mygui中对这读取两个数据进行反应,就达到了传入参数的目的。

传出
那怎么把数据传出来呢?
将你要输出的数据存在 handles.output里面
在GUI任意地方
handles.output=数据1;
handles.secend_output=数据2;
然后在GUI的outputFcn里面加上
varaginout{1}=handles.output;
varaginout{2}=handles.secend_output;
这样就把数据传出来了。

看每一个GUI的最外层的那句
function varargout = mygui(varargin) 看输入输出,就是这样了。把GUI本身就是一个函数,
b=mygui(一些传入的参数) 就执行GUI并返回结果
则b就得到了传出来的结果。

来自http://blog.163.com/cjt_0125@yeah/blog/static/916829092009101771445748/

28 May 2010

matlab tips - 清除直线之外的点



原图


处理后



close all;

a = imread('test.jpg'); % 读取图像
a = im2bw(a); % 二值化
figure,imshow(a);

line1 = [13,168;358,55]; % 两条直线,坐标格式[row1,col1;row2,col2]
line2 = [15,280;364,437];

k1 = (line1(1,1)-line1(2,1))/(line1(1,2)-line1(2,2)); % 直线斜率1
k2 = (line2(1,1)-line2(2,1))/(line2(1,2)-line2(2,2));

[m,n] = size(a); % 尺寸

for i=1:m
    for j=1:n
        if i-line1(2,1)<k1*(j-line1(2,2)) % 清除直线1左边
            a(i,j) = 0;
        end
        if i-line2(2,1)<k2*(j-line2(2,2)) % 清除直线2右边
            a(i,j) = 0;
        end
    end
end

figure,imshow(a);

25 May 2010

sphinx简介

sphinx简介

简单来说,这是一个基于ReStructuredText的文档生成工具。方便易用,功能强大。

有很多开源工程都采用sphinx作为文档生成系统,最有名的就是 python官方文档 。 在 sphinx官方 网站 上也列出使用sphinx的项目,有将近90个左右,其中不乏大名鼎鼎的开源项目。

一些中文的翻译项目也采用了sphinx,如 pymotwcn

 



安装

1. 安装python

2. 要确认已经安装了setuptools

  • 如果已经安装,你在python安装路径下的Scripts文件夹下会找到一个easy_install.exe。
  • setuptools下载

3. 在命令行输入easy_install sphinx

  • easy_install可以自动下载并安装sphinx以及它所依赖的其他模块。

 

建立sphinx工程

建议使用sphinx自带的配置工具sphinx-quickstart。 - 建立一个工程目录,比如D\:Note。 - 在该目录启动命令行,输入sphinx-quickstart

D:\Note>sphinx-quickstart




  • 程序会提示输入一些选项,如输入根目录





    Welcome to the Sphinx quickstart utility.

    Please enter values
    for the following settings (just press Enter to
    accept a
    default value, if one is given in brackets).

    Enter the root path
    for documentation.
    > Root path for the documentation [.]:
    大部分使用默认选项,直接按回车即可。




  • 需要指定的选项



    1. 分离source和build目录,方便管理




      > Separate source and build directories (y/N) [n]: y


    2. 指定工程名、作者名、版本号





      The project name will occur in several places in the built documentation.
      > Project name: Note
      > Author name(s): LK

      Sphinx has the notion of a
      "version" and a "release" for the
      software. Each version can have multiple releases.
      For example, for
      Python the version is something like
      2.5 or 3.0, while the release is
      something like
      2.5.1 or 3.0a1.  If you don't need this dual structure,
      just set both to the same value.
      > Project version: 0.1
      > Project release [0.1]:





    3. 文档文件的后缀名,默认是.rst,个人认为用.txt更方便些。



      The file name suffix for source files. Commonly, this is either ".txt"
      or
      ".rst".  Only files with this suffix are considered documents.
      > Source file suffix [.rst]: .txt






  • 完成后,可以看到Note目录下有以下目录和文件


    • build目录 运行make命令后,生成的文件都在这个目录里面
    • source目录 放置文档的源文件
    • make.bat 批处理命令
    • makefile


  • 基本完成了,使用make html命令就可以生成html形式的文档了。



配置(conf.py)



conf.py文件包含了sphinx工程的所有配置选项,包括一些无法在sphinx-quickstart中进行设置的。



分为三部分:


  • General configuration(一般选项)
  • Options for HTML output(HTML输出选项)
  • Options for LaTeX output(Latex输出选项)

下面是一些常用的选项:





  • language (语言)


    对应于sphinx的locale目录下的文件夹,里面是本地化配置。


    官方版本只支持繁体中文(zh_TW),可以下载 sphinx简体中文包 (javaEye topman制作)


    下载后放到locale目录下,然后language选项修改为zh_CN即可



  • html_theme (输出html的主题):



    # The theme to use for HTML and HTML Help pages.  Major themes that come with
    #
    Sphinx are currently 'default' and 'sphinxdoc'.
    html_theme = 'sphinxdoc'





常用的文档格式符号


下面只是列出了一些常用的格式符号,以供大家参考,详细的教程可以参照《reStructuredText 简明教程》 (以下基本上是从该教程直接引用过来的)。



标题


ReStructuredText会根据下划线读取文档的标题,并且可以自动组织索引



=====================
文档标题
=====================

--------
子标题
--------

章节标题
========

...



列表


列表中,相同的层级使用相同的缩进。


列表中同一层级不需要空行分隔。不同层级起始处必须有空行。



列表:
 
- 条目
 
- 条目

     
- 条目
     
- 条目
 
- 条目



超链接


 


独立链接 ,自动将网址转换为链接。


例如 http://www.ubuntu.org.cn/


 



http://www.ubuntu.org.cn/ 


 


命名链接 ,为链接命名,有助记忆和减少空间占用。


在正文中使用 <链接名>_ ,注释中使用 _<链接名>: [链接目标]

例如 Ubuntu



Ubuntu_

.. _Ubuntu:  http:
//www.ubuntu.org.cn/

 



代码


sphinx对嵌入程序代码的支持很好(本来就是为了编写python文档而开发的工具)。


在段落的结尾添加符号 :: ,则表明下面的段落为代码段落。代码段落相对之前的段落要缩进一次。




文本


只要没有空行,不管换多少次行,都会处理为一行。 建议您将每行的内容控制在50个汉字或者100个字母之内, 尽量在标点符号处手动换行,以增加源文件的可读性。



其他


暂时没有发现支持ReStructuredText的Blog,不知道大家有没有知道的。如果能直接用ReStructuredText写Blog 就太好了。


22 May 2010

数学软件四大家---Maple、MATLAB、MathCAD和Mathematica


目前在科技和工程界上比较流行和著名的数学软件主要有四个,分别是Maple、MATLAB、 MathCAD和Mathematica。它们在各自针对的目标都有不同的特色。下面就让我为你一一道来。   

一、Maple V 系统   
Maple V是由Waterloo大学开发的数学系统软件,它不但具有精确的数值处理功能,而且具有无以伦比的符号计算功能。Maple V的符号计算能力还是MathCAD和MATLAB等软件的符号处理的核心。Maple提供了2000余种数学函数,涉及范围包括:普通数学、高等数学、 线性代数、数论、离散数学、图形学。它还提供了一套内置的编程语言,用户可以开发自己的应用程序,而且Maple自身的2000多种函数,基本上是用此语 言开发的。   Maple采用字符行输入方式,输入时需要按照规定的格式输入,虽然与一般常见的数学格式不同,但灵活方便,也很容易理解。输出则可以选择字符方式和 图形方式,产生的图形结果可以很方便地剪贴到Windows应用程序内。   

二、MATLAB 系统   
MATLAB原是矩阵实验室(Matrix Laboratory)在70年代用来提供Linpack和Eispack软件包的接口程序,采用C语言编写。从80年代出现3.0的DOS版本,逐渐成 为科技计算、视图交互系统和程序语言。MATLAB可以运行在十几个操作平台上,比较常见的有基于Windows 9X/NT、OS/2、Macintosh、Sun、Unix、Linux等平台的系统。   MATLAB程序主要由主程序和各种工具包组成,其中主程序包含数百个内部核心函数,工具包则包括复杂系统仿真、信号处理工具包、系统识别工具包、优 化工具包、神经网络工具包、控制系统工具包、μ分析和综合工具包、样条工具包、符号数学工具包、图像处理工具包、统计工具包等。而且5.x版本还包含一套 几十个的PDF文件,从MATLAB的使用入门到其他专题应用均有详细的介绍。   MATLAB是数值计算的先锋,它以矩阵作为基本数据单位,在应用线性代数、数理统计、自动控制、数字信号处理、动态系统仿真方面已经成为首选工具, 同时也是科研工作人员和大学生、研究生进行科学研究的得力工具。MATLAB在输入方面也很方便,可以使用内部的Editor或者其他任何字符处理器,同 时它还可以与Word6.0/7.0结合在一起,在Word的页面里直接调用MATLAB的大部分功能,使Word具有特殊的计算能力。   

三、MathCAD 系统   
MathCAD是美国Mathsoft公司推出的一个交互式的数学系统软件。从早期的DOS下的1.0和Windows下的4.0版本,到今日的 8.0版本,功能也从简单的数值计算,直至引用Maple强大的符号计算能力,使得它发生了一个质的飞跃。   MathCAD是集文本编辑、数学计算、程序编辑和仿真于一体的软件。MathCAD7.0 Professional(专业版)运行在Win9X/NT下,它的主要特点是输入格式与人们习惯的数学书写格式很近似,采用WYSWYG(所见所得)界 面,特别适合一般无须进行复杂编程或要求比较特殊的计算。MathCAD 7.0 Professional 还带有一个程序编辑器,对于一般比较短小,或者要求计算速度比较低时,采用它也是可以的。这个程序编辑器的优点是语法特别简单。   MathCAD可以看作是一个功能强大的计算器,没有很复杂的规则;同时它也可以和Word、Lotus、WPS2000等字处理软件很好地配合使 用,可以把它当作一个出色的全屏幕数学公式编辑器。   

四、Mathematica 系统   
Mathematica是由美国物理学家Stephen Wolfram领导的Wolfram Research开发的数学系统软件。它拥有强大的数值计算和符号计算能力,在这一方面与Maple类似,但它的符号计算不是基于Maple上的,而是自 己开发的。   Mathematica的基本系统主要是用C语言开发的,因而可以比较容易地移植到各种平台上,Mathematica是一个交互式的计算系统,计算 是在用户和Mathematica互相交换、传递信息数据的过程中完成的。Mathematica系统所接受的命令都被称作表达式,系统在接受了一个表达 式之后就对它进行处理,然后再把计算结果返回。Mathematica对于输入形式有比较严格的规定,用户必须按照系统规定的数学格式输入,系统才能正确 地处理,不过由于3.0版本引入输入面板,并且可以修改、重组输入面板,因此以前版本输入指令时需要不断切换大小写字符的繁琐方式得到很好的改善。3.0 版本可以用各种格式保存文件和剪贴内容,包括RTF、HTML、BMP等格式。   

五、四种软件的比较   
选用何种数学软件?如果仅仅是要求一般的计算或者是普通用户日常使用,首选的是MathCAD,它在高等数学方面所具有的能力,足够一般客户的要求, 而且它的输入界面也特别友好。如果要求计算精度、符号计算和编程方面的话,最好同时使用Maple和Mathematica,它们在符号处理方面各具特 色,有些Maple不能处理的,Mathematica却能处理,诸如某些积分、求极限等方面,这些都是比较特殊的。如果要求进行矩阵方面或图形方面的处 理,则选择MATLAB,它的矩阵计算和图形处理方面则是它的强项,同时利用MATLAB的NoteBook功能,结合Word6.0/7.0的编辑功能,可以很方便地处理科技文章.

其他开源免费数学计算软件
有很多,比如octave、scilab、rlab、freemat和maxima等等…没研究过…貌似也听不错的应该…:D

MATLAB与Microsoft Word的连接


MathCAD文字处理是非常强的,那么MATLAB的文字处理又将如何呢?MathWorks公司开发的MATLAB Notebook成功地将Microsoft Word和MATLAB结合在一起,为文字处理、科学计算和工程设计营造了一个完美的工作环境。这样MATLAB不仅兼具原有的计算能力,而且又增加了 Word软件的编辑能力,已经远远的把MathCAD抛在后面。MATLAB Notebook可以在word中随时修改计算命令,随时计算并生成图像返回,使用户能在Word环境中“随心所欲地享用”MATLAB的浩瀚科技资源。 MATLAB Notebook的工作方式是:用户在word文档中创建命令,然后送到MATLAB的后台中执行,最后将结果返回到word中。

建议撰写科技报告、论文、专著的科学工作者使用MATLAB Notebook,建议讲授、编写理工科教材的教师使用MATLAB Notebook,建议对于演算理工科习题的广大学生使用MATLAB Notebook。MATLAB Notebook的强大功能将会使你事半功倍。

1 安装MATLAB Notebook
从上面的介绍中可以看出,使用MATLAB Notebook时,你的计算机中必须有Word和MATLAB。本书以MATLAB6.5和word2000为例。MATLAB Notebook文件又称为M-book文件。MATLAB6.5的Notebook是在MATLAB环境下安装的。具体步骤如下:

(1)在系统中分别安装MATLAB6.5和word2000,并启动 MATLAB6.5命令窗口;

(2)在命令窗口中输入:

>> notebook -setup

就会得到如下提示:

Welcome to the utility for setting up the MATLAB Notebook

for interfacing MATLAB to Microsoft Word




Choose your version of Microsoft Word:

[1] Microsoft Word 97

[2] Microsoft Word 2000

[3] Microsoft Word 2002 (XP)

[4] Exit, making no changes

(3)根据安装的Word的版本选择相应的代号,本文选择如下:

Microsoft Word Version: 2

Notebook setup is complete.

这样你就可以使用MATLAB Notebook了。有两种方法可以打开一个M-book文件。



(1)直接在MATLAB命令窗口键入命令来新建或打开一个M-book文件:

>> notebook %新建一个M-book(不建议使用,在我的计算机里经常出错)

>> notebook c:\documents\mymbook.doc %打开一个已经存在的M-book

(2)先打开word2000,然后打开文件(F)/新建(不要直接点击新建按钮),弹出图11-1对话框。选中其中的m-book模板。在新建的word文档中就会出现图11-2中黑圈所在的菜单栏。

2 使用MATLAB Notebook
Notebook是通过动态链接来和MATLAB交互的。Notebook和MATLAB交互的基本单位为细胞。Notebook需要输入MATLAB中的命令组成细胞,再传到MATLAB中运行,运行输出的结果再以细胞的方式传回Notebook。

1. 在Word中执行命令的基本过程
Notebook采用输入细胞(input cell)来定义MATLAB的输入命令。步骤如下:

(1)采用文本格式输入命令,在命令结束时不要按回车和空格键;

(2)从Notebook菜单中选中“Define Input Cell”选项,用来定义输入细胞;

(3)从Notebook菜单中选中“Evaluate Cell”选项或者Ctrl+Enter。

其中输入细胞都显示为黑方括号包括的绿色字符,输出细胞都是黑方括号包括的蓝色字符,如果出现错误黑方括号包括的红色字符,其它文本都默认为黑色字符。如下:(作者注释:无专门标示的行为蓝色)

m=eye(3) (作者注释:此行为绿色)

m =



1 0 0



0 1 0



0 0 1

m/0 (作者注释:此行为绿色)

Warning: Divide by zero.



(Type "warning off MATLAB:divideByZero" to suppress this warning.)



ans =



Inf NaN NaN



NaN Inf NaN



NaN NaN Inf

m=eye(3) n=eye(4) (作者注释:此行为绿色)

??? format compact;m=eye(3) n=eye(4)



| (作者注释:此行以及上下两行为红色)



Error: Missing operator, comma, or semicolon. 绿色)



2. 实例讲解
在一段文本中间执行代码

在MATLAB中,可以把输入细胞放在文本中间运行,而不影响其它文本。步骤如下:

(1)输入样本如下,将m=eye(3)放到文本中间。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

你去过《动力学与控制技术》论坛吗?m=eye(3) 那里有很多好东西。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

(2)选中命令,如下所示:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

你去过《动力学与控制技术》论坛吗?m=eye(3) 那里有很多好东西。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

(3)从Notebook菜单中选中“Evaluate Cell”选项或者Ctrl+Enter。将会出现上面例子中类似的结果。

(4)如果要将输出细胞转化为普通文本,选中要转换的细胞,然后从 Notebook菜单中选中“Undefine Cells”选项或者Alt+U。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

你去过《动力学与控制技术》论坛吗?m=eye(3) 那里有很多好东西。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

m =



1 0 0



0 1 0



0 0 1

【实例】绘制一幅图片

生成完整图形的多条图形指令必须定义在同一细胞群中

t=0:0.1:20;y=1-cos(t).*exp(-t/5);

Time=[0,20,20,0];

Amplitude=[0.95,0.95,1.05,1.05];

fill(Time,Amplitude,'g'),axis([0,20,0,2]);

xlabel('Time'),ylabel('Amplitude');

hold on

plot(t,y,'r','LineWidth',2)

hold off

ymax=min(y)

将以上程序写到Word当中,然后全部选上,然后选择【Notebook|Define Input Cell】,最后从Notebook菜单中选中【Evaluate Cell】选项,或者Ctrl+Enter。得到如下结果

t=0:0.1:20;y=1-cos(t).*exp(-t/5);



Time=[0,20,20,0];



Amplitude=[0.95,0.95,1.05,1.05];



fill(Time,Amplitude,'g'),axis([0,20,0,2]),xlabel('Time'),ylabel('Amplitude');



hold on



plot(t,y,'r','LineWidth',2)



hold off



ymax=min(y)




ymax =

0

20 May 2010

python实现请按任意键结束


python实现请按任意键结束...

# it works on Windows
# we can also find the corresponding system command on Linux
import os
os.system("pause")

12 May 2010

霍夫变换(Hough Transform)

霍夫变换(Hough Transform)

霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。

设已知一黑白图像上画了一条直线,要求出这条直线所在的位置。

直线的方程可以用y=k*x+b 来表示,其中k和b是参数,分别是斜率和截距。过某一点(x0,y0)的所有直线的参数都会满足方程y0=kx0+b。即点(x0,y0)确定了一族直线。方程y0=kx0+b在参数k--b平面上是一条直线,(你也可以是方程b=-x0*k+y0对应的直线)。这样,图像x--y平面上的一个前景像素点就对应到参数平面上的一条直线。我们举个例子说明解决前面那个问题的原理。设图像上的直线是y=x, 我们先取上面的三个点:A(0,0), B(1,1), C(22)。可以求出,过A点的直线的参数要满足方程b=0, 过B点的直线的参数要满足方程1=k+b, 过C点的直线的参数要满足方程2=2k+b, 这三个方程就对应着参数平面上的三条直线,而这三条直线会相交于一点(k=1,b=0)。

同理,原图像上直线y=x上的其它点(如(3,3),(4,4)等) 对应参数平面上的直线也会通过点(k=1,b=0)。这个性质就为我们解决问题提供了方法:

1. 首先,对参数平面,将其所有数据置为0.
2. 对于图像上每一前景点,求出参数平面对应的直线,把这直线上的所有点的值都加1。
3. 最后,找到参数平面上最大点的位置,这个位置就是原图像上直线的参数。

上面就是霍夫变换的基本思想。就是把图像平面上的点对应到参数平面上的线,最后通过统计特性来解决问题。假如图像平面上有两条直线,那么最终在参数平面上就会看到两个峰值点,依此类推。

在实际应用中,y=k*x+b形式的直线方程没有办法表示x=c形式的直线(这时候,直线的斜率为无穷大)。所以实际应用中,是采用参数方程 p=x*cos(theta)+y*sin(theta)。这样,图像平面上的一个点就对应到参数p---theta平面上的一条曲线上。其它的还是一样。

要从一副图像中检测出半径以知的圆形来。这个问题比前一个还要直观。我们可以取和图像平面一样的参数平面,以图像上每一个前景点为圆心,以已知的半径在参数平面上画圆,并把结果进行累加。最后找出参数平面上的峰值点,这个位置就对应了图像上的圆心。在这个问题里,图像平面上的每一点对应到参数平面上的一个圆。

把上面的问题改一下,假如我们不知道半径的值,而要找出图像上的圆来。这样,一个办法是把参数平面扩大称为三维空间。就是说,参数空间变为x--y--R 三维,对应圆的圆心和半径。图像平面上的每一点就对应于参数空间中每个半径下的一个圆,这实际上是一个圆锥。最后当然还是找参数空间中的峰值点。不过,这个方法显然需要大量的内存,运行速度也会是很大问题。

我们前面假定的图像都是黑白图像(2值图像),实际上这些2值图像多是彩色或灰度图像通过边缘提取来的。我们前面提到过,图像边缘除了位置信息,还有方向信息也很重要,这里就用上了。根据圆的性质,圆的半径一定在垂直于圆的切线的直线上,也就是说,在圆上任意一点的法线上。这样,解决上面的问题,我们仍采用2维的参数空间,对于图像上的每一前景点,加上它的方向信息,都可以确定出一条直线,圆的圆心就在这条直线上。这样一来,问题就会简单了许多。

图象处理中的边缘检测

边缘提取以及边缘增强是不少图像处理软件都具有的基本功能,它的增强效果很明显,在用于识别的应用中,图像边缘也是非常重要的特征之一。图像边缘保留了原始图像中相当重要的部分信息,而又使得总的数据量减小了很多,这正符合特征提取的要求。在以后要谈到的霍夫变换(检测图像中的几何形状)中,边缘提取就是前提步骤。


既然边缘提取是要保留图像的灰度变化剧烈的区域,从数学上,最直观的方法就是微分(对于数字图像来说就是差分),在信号处理的角度来看,也可以说是用高通滤波器,即保留高频信号。这是最关键的一步,在此之前有时需要对输入图像进行消除噪声的处理。

用于图像识别的边缘提取往往需要输出的边缘是二值图像,即只有黑白两个灰度的图像,其中一个灰度代表边缘,另一个代表背景。此外,还需要把边缘细化成只有一个像素的宽度。总的说来边缘提取的步骤如下:
1,去噪声
2,微分运算
3,2值化处理
4,细化

第二步是关键,有不少书把第二步就直接称为边缘提取。实现它的算法也有很多,一般的图像处理教科书上都会介绍好几种,如拉普拉兹算子,索贝尔算子,罗伯特算子等等。这些都是模板运算,首先定义一个模板,模板的大小以3*3的较常见,也有2*2,5*5或更大尺寸的。运算时,把模板中心对应到图像的每一个像素位置,然后按照模板对应的公式对中心像素和它周围的像素进行数学运算,算出的结果作为输出图像对应像素点的值。模板运算是图像的一种处理手段--邻域处理,有许多图像增强效果都可以采用模板运算实现,如平滑效果,中值滤波 (一种消除噪声的方法),油画效果,图像的凹凸效果等等。

这里对拉普拉兹算子和索贝尔算子补充两句。拉普拉兹算子是
2阶微分算子,也就是说,相当于求取2次微分,它的精度还算比较高,但对噪声过于敏感(有噪声的情况下效果很差)是它的重大缺点,所以这种算子并不是特别常用。索贝尔算子是最常用的算子之一(它是一种一阶算子),方法简单效果也不错,但提取出的边缘比较粗,要进行细化处理。另外,索贝尔算子也可提取出图像边缘的方向信息来,有文章论证过,在不考虑噪声的情况下,它取得的边缘信息误差不超过7度。

下面介绍几种高级算法。首先是马尔(Marr)算子,马尔是计算机视觉这门学问的奠基人,很了不起,但这些理论很难懂。他提出的边缘提取方法可以看成两个步骤,一个是平滑作用来消除噪声,另一个是微分提取边缘,也可以说是由两个滤波器组成,低通滤波去除噪声,高通滤波提取边缘。人们也称这种方法为LOG滤波器,这也是根据它数学表达式和滤波器形状起的名字。也可以采用模板运算来实现这种算法,但模板的大小一般要在7*7以上,所以运算复杂程度比索贝尔算子等要大不少,运算时间当然也长许多。

另外一种非常重要的算法是坎尼(Canny)算子,这是坎尼在1986年写的一篇论文里仔细论述的。他给出了判断边缘提取方法性能的指标。而坎尼算子也是图像处理领域里的标准方法,也可以说是默认的方法。比较奇怪的是,国内的图像处理教科书中,介绍坎尼算子的很少。郑南宁的‘计算机视觉与模式识别’(1998年),算是介绍的比较详细的。坎尼算子在使用时要提供给一些参数,用于控制算法的性能,实际上,对于不同的图像或不同的边缘提取目的,应该提供不同的参数,以达到最佳效果。它也有模板运算方法,模板的大小也比较大,和提供的参数有关,标准的大小差不多是17*17,可以根据算子的可分离性用快速算法(否则就会慢的一塌糊涂),坎尼算子的2值化也很有特色,具有一定的智能性。

还有一种算法:Shen-Castan算子,效果和坎尼算子不相上下,这种算法在对边缘提取好坏的判别标准上有些不同。在实际的图像处理与识别应用中,有时需要根据被处理图像的种类以及实际目的,量身定做算法,边缘提取也是一样,但是基本原理都是一样的。

10 May 2010

Matlab 的fspecial函数用法


fspecial函数用于建立预定义的滤波算子,其语法格式为:
h = fspecial(type)
h = fspecial(type,para)
其中type指定算子的类型,para指定相应的参数;
type的类型有:
1、'average'
averaging filter
为均值滤波,参数为hsize代表模板尺寸,默认值为[3,3]。
H = FSPECIAL('average',HSIZE) returns an averaging filter H of size

HSIZE. HSIZE can be a vector specifying the number of rows and columns in

H or a scalar, in which case H is a square matrix.
The default HSIZE is [3 3].
2、 'disk'
circular averaging filter
为圆形区域均值滤波,参数为radius代表区域半径,默认值为5.
H = FSPECIAL('disk',RADIUS) returns a circular averaging filter

(pillbox) within the square matrix of side 2*RADIUS+1.

The default RADIUS is 5.
3、'gaussian'
Gaussian lowpass filter

为高斯低通滤波,有两个参数,hsize表示模板尺寸,默认值为【3 3】,sigma为滤波器的标准值,单位为像素,默认值为0.5.
H = FSPECIAL('gaussian',HSIZE,SIGMA) returns a rotationally

symmetric Gaussian lowpass filter
of size HSIZE with standard

deviation SIGMA (positive). HSIZE can be a vector specifying the

number of rows and columns in H or a scalar, in which case H is a

square matrix.

The default HSIZE is [3 3], the default SIGMA is 0.5.
4、'laplacian' filter approximating the 2-D Laplacian operator
为拉普拉斯算子,参数alpha用于控制算子形状,取值范围为【0,1】,默认值为0.2.

H = FSPECIAL('laplacian',ALPHA) returns a 3-by-3 filter

approximating the shape of the two-dimensional Laplacian

operator. The parameter ALPHA controls the shape of the

Laplacian and must be in the range 0.0 to 1.0.

The default ALPHA is 0.2.
5、'log'
Laplacian of Gaussian filter
为拉普拉斯高斯算子,有两个参数,hsize表示模板尺寸,默认值为【3 3】,sigma为滤波器的标准差,单位为像素,默认值为0.5.
H = FSPECIAL('log',HSIZE,SIGMA) returns a rotationally symmetric

Laplacian of Gaussian filter of size HSIZE with standard deviation

SIGMA (positive). HSIZE can be a vector specifying the number of rows

and columns in H or a scalar, in which case H is a square matrix.

The default HSIZE is [5 5], the default SIGMA is 0.5.
6、'motion'
motion filter
为运动模糊算子,有两个参数,表示摄像物体逆时针方向以theta角度运动了len个像素,len的默认值为9,theta的默认值为0;
H = FSPECIAL('motion',LEN,THETA) returns a filter to approximate, once

convolved with an image, the linear motion of a camera by LEN pixels,

with an angle of THETA degrees in a counter-clockwise direction. The

filter becomes a vector for horizontal and vertical motions.
The

default LEN is 9, the default THETA is 0, which corresponds to a

horizontal motion of 9 pixels.
7、'prewitt'
Prewitt horizontal edge-emphasizing filter
用于边缘增强,大小为【3 3】,无参数
H = FSPECIAL('prewitt') returns 3-by-3 filter that emphasizes

horizontal edges by approximating a vertical gradient. If you need to

emphasize vertical edges, transpose the filter H: H'.


[1 1 1;0 0 0;-1 -1 -1].
8、'sobel'
Sobel horizontal edge-emphasizing filter
用于边缘提取,无参数
H = FSPECIAL('sobel') returns 3-by-3 filter that emphasizes

horizontal edges utilizing the smoothing effect by approximating a

vertical gradient. If you need to emphasize vertical edges, transpose

the filter H: H'.


[1 2 1;0 0 0;-1 -2 -1].
9、'unsharp'
unsharp contrast enhancement filter
为对比度增强滤波器。参数alpha用于控制滤波器的形状,范围为【0,1】,默认值为0.2.
H = FSPECIAL('unsharp',ALPHA) returns a 3-by-3 unsharp contrast


enhancement filter. FSPECIAL creates the unsharp filter from the

negative of the Laplacian filter with parameter ALPHA. ALPHA controls

the shape of the Laplacian and must be in the range 0.0 to 1.0.

The default ALPHA is 0.2.

7 May 2010

matlab数字图像小波分解(2)


更新:
指定function name和N,可以做n级小波分解

%% wavelet study demo2
% xenoszhATgmail.com
% 2010-05-06

function nWaveletTest(wname,n)

close all;

% get input image
[filename,pathname] = uigetfile('*.jpg;*.jpeg;*.bmp;*.png','Please pick up a picture:');
if ~filename
 disp('No input file.');
 return;
end
img = imread(strcat(pathname,filename));

% get grayscale image
img = rgb2gray(img); 

figure;
imshow(waveRec(img,n,wname));

end

%% sub function to reconstruct n level image
function recimage = waveRec(img,n,wname)
if nargin==3
 % get wavelet decomposition filter coefficients, using haar function
 [lod,hid] = wfilters(wname,'d'); 

 % n level wavelet decomposition
 [c,s] = wavedec2(img,n,lod,hid);
 
 % get the top level approximate signal
 an = appcoef2(c,s,wname,n);
 an = double2uint8(an);
 
 % reconstruct image recursively
 a = an;
 for i=n:-1:1
  curimg = curRec(a,c,s,i);
  a = curimg;
 end
 
 % return recontruct image
 recimage = curimg;
else
 error('please check the input');
end
end

%% sub function to get current level reconstruct image
function curRecimg = curRec(a,c,s,n)
if nargin==4
 h = detcoef2('h',c,s,n);
 v = detcoef2('v',c,s,n);
 d = detcoef2('d',c,s,n);
 a = imresize(a,size(h));
 curRecimg = [a,h; v,d];
else
 error('please check the input');
end
end
%% sub function to convert double image to uint8 image
function uint8image = double2uint8(dblimage)
if nargin==1 && isa(dblimage,'double')
 uint8image = 255*(dblimage-min(min(dblimage)))/(max(max(dblimage))-min(min(dblimage)));
 uint8image = uint8(uint8image);
else
 error('input image must be double');
end
end

6 May 2010

matlab数字图像小波分解



小波的定义和原理随便找本书都有讲解,简言之,小波就是将信号X

分解为近似信号A(Approximate signal)和细节信号D(Details signal)的

过程.matlab中的小波工具箱内置了丰富的函数,让复杂的小波处理

变得非常简单.(鉴于数字图像都是2维,只记录下2维相关的函数)

分解过程如:


wfilters: 指定小波函数,有很多.具体help
wavedec2: N级二维小波分解
appcoef2: 获得指定级别的近似信号A
detcoef2: 获得指定级别的细节(高频)信号h,v,或者d.具体与第一个参数有关. (得到某个高频分量,注意和下一个函数区别)
wrcoef2: 利用某个高频分量重建图像(与原图像图等大小)

测试如下:
%% wavelet study demo
% xenoszhATgmail.com
% 2010-05-06

function waveletTest()

% get input image
[filename,pathname] = uigetfile('testPics\*.jpg;*.jpeg;*.bmp;*.png','Please pick up a picture:');
if ~filename
 disp('No input file.');
 return;
end
img = imread(strcat(pathname,filename));

% get grayscale image
img = rgb2gray(img); 

size(img)

% get wavelet decomposition filter coefficients, using haar function
[lod,hid] = wfilters('haar','d'); 

% 2 level wavelet decomposition
[c,s] = wavedec2(img,2,lod,hid);

% get 2nd level approximate signal
a2 = appcoef2(c,s,'haar',2);
% convert it convert it to uint8 image in [0 255]
a2 = double2uint8(a2);

% get 2nd level horizontal high frequency signal
h2 = detcoef2('h',c,s,2);
h2 = double2uint8(h2);

% get 2nd level vertical high frequency signal
v2 = detcoef2('v',c,s,2);
v2 = double2uint8(v2);

% get 2nd level digonal high frequency signal
d2 = detcoef2('d',c,s,2);
d2 = double2uint8(d2);

% compose 2nd level 
wave2 = [a2,h2;v2,d2];

% get 1st lavel horizontal high frequency signal
h1 = detcoef2('h',c,s,1);
h1 = double2uint8(h1);

% get 1st level vertical high frequency signal
v1 = detcoef2('v',c,s,1);
v1 = double2uint8(v1);

% get 1st level digonal high frequency signal
d1 = detcoef2('d',c,s,1);
d1 = double2uint8(d1);

% make sure they have the same size
wave2 = imresize(wave2,size(h1));

% compose 1st level (original size)
wave1 = [wave2, h1; v1, d1];

% show image
figure; imshow(img);

% show wavelet decomposition
figure; imshow(wave1);

end

%% sub function to convert double image to uint8 image
function uint8image = double2uint8(dblimage)
if nargin==1 && isa(dblimage,'double')
 uint8image = 255*(dblimage-min(min(dblimage)))/(max(max(dblimage))-min(min(dblimage)));
 uint8image = uint8(uint8image);
else
 error('input image must be double');
end
end



结果为: