一 : MATLAB图像句柄学习【转】
什么是图形句柄?如何获得?
Matlab为每个显示对象创建与之对应的句柄。通过对象句柄,我们就可以控制和调整图形的属性。如:
>> H=figure
H =
1
这条语句创建了一个图形对象,同时将图像句柄传递给变量H. matlab将一直认为显示器的句柄为0。
如果在创建时并未保存对象句柄,则需要使用一些语句来得到对象的句柄。
gcf | 获得当前图像的句柄 |
gca | 获得当前轴的句柄 |
gco | 获得当前对象的句柄 |
findobj | 查找符合某些属性的所有对象的句柄 注:当对象的HandleVisibility属性设置为off 或callback时,将不能用findobj找到。 |
上表中的当天对象是指被鼠标最后点击过的对象。
图形句柄是干什么用的?怎么用?
通过图形对象的句柄,我们可以改变图形对象的属性-几乎所有属性。get和set函数用于查询和设置句柄图形对象的属性。
Get语法如下:
get(h)
get(h,'PropertyName')
<m-by-n value cell array> =get(H,<property cell array>)
如>> h=figure;
>>get(h,'Position')
ans =
360502560 420
set的语法如下:
set(H,'PropertyName',PropertyValue,...)
如我们可以改变上面我们创建的图形的位置和大小:
>>set(h,'Position',[00800 600]);
这时,figure1的位置和大小就改变了。当然这只是一个简单的例子,set可以设置的属性远远多于这些。
回调
这部分功能使图形在接收到某些用户动作时作出反应(执行用户指定的任务)。Matlab就是将回调属性字符串传递给eval执行。Eval(Executestring containing MATLABexpression)将接收到的字符串作为函数命令运行——真是个有意思的命令。
所有的句柄图形都有默认属性ButtonDownFcn, CreateFcn,DeleteFcn(Figure更有默认属性CloseRequestFcn, KeyPressFcn , ResizeFcn,WindowButtonDownFcn , WindowButtonMotionFcn),通过修改它们的属性,matlab就将会作出相应的反应。
如:>>get(gcf,'CloseRequestFcn')
ans =
closereq
>> class(ans)
ans =
char
我们看到,'CloseRequestFcn'属性的值是字符串closereq,于是我们可以做出自己的close回调函数。
首先将如下内容存为myclosereq.m放在matlab工作目录下
selection = questdlg('Close SpecifiedFigure?',... 'Close Request Function',... 'Yes','No','Yes'); switch selection, case 'Yes', delete(gcf) case 'No' return end |
>>set(gcf,'CloseRequestFcn','myclosereq')
这时我们如果点击关闭按钮就可以看到提示是否关闭的对话框了。
当然,也可以在回调函数中加入其他更复杂的功能。
最后,这部分内容在Matlab帮助中的位置在
Matlab->Graphics->Handle GraphicsObjects
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
GUI学习笔记:
句柄式图形常用函数:
(1)get(h)返回句柄值h所指定的图形对象的所有属性名称与相对应的属性值
(2)a = get(h)返回由句柄值h所指定的图形对象的属性结构数组,并且该数组的字段名称就是该对象的属性名称。
(3)a = get(0,'factory')返回所有能由用户设置的属性的默认定义值。
(4)a =get(0,'FactoryObjectTypePropertyName1','FactoryObjectTypePropertyName2',...)返回指定对象类型指定的属性值,输入参数FactoryObjectTypePropertyName为一个关键词,由字符Factory与图形对象类型(如Figure)还有属性名称(如Color)组成。
a = get(0,'factoryFigureColor')返回Figure对象的Color属性值。
(5)a =get(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName1',...)返回句柄值为h的对象指定属性的默认值。如“DefaultFigureColor”。
(6)a = get(h,'default')列出h对象的所有属性的默认属性值
(7)a =set(h)返回句柄值h所指定的图形对象的所有属性名称对应的可设置属性值,a为结构数组,存储对象的属性名称,其字段值为相对应的属性值。属性值中用{}括起来的表示默认值。
(8)set(h,a)使用指定的属性值来设置由句柄值h所指定的对象属性,a为结构数组,其字段名称为对象的属性名称,字段值为相对应的属性值。
(9)a = set(0,'factory')返回那些用户可以设置默认值的所有对象的属性,同时显示可设置的属性值。
(10)a=set(0,'FactoryObjectTypePropertyName')返回所有对象中指定的属性名称FactoryObjectTypePropertyName的所有可能的属性值。
(11)a = set(h,'属性名','属性值')设置句柄值为h的对象的与属性名对应的属性值。
(12)set(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName2',...)对句柄值为h的对象设置特定属性名称的属性默认值。
(13)H = findobj;返回Root对象与其所有子对象的句柄值
(14)H = findobj(h);返回h变量的句柄值
(15)H = findobj(’属性名称‘,’属性值‘);依据对象的属性名称和属性值找出匹配的对象句柄值。
(16)H =findobj(ObjectHandles,’属性名称‘,’属性值‘);根据限定的对象列表找出与对象的属性名称和属性值匹配的对象句柄值
(17)gcf返回当前Figure对象的句柄值
gca返回当前axes对象的句柄值
gco返回当前鼠标单击的句柄值,该对象可以是除root对象外的任意图形对象,并且Matlab会把当前图形对象的句柄值存放在Figure的CurrentObject属性中
Figure对象的属性篇
(1).^是矩阵每个元素的幂乘,^是数的幂乘。
(2)set(handle)列出句柄值为handle的对象的所有属性
get(handle)除列出上述属性外,还列出可以设置的属性
reset(handle)将所有属性改为默认值
delete(handle)删除句柄值为handle的图形对象
(3)利用set(handle,‘属性名称’)获得句柄值为handle的对象的属性名称下所有可设置的属性值
set(gcf,'units):得到[ inches | centimeters | normalized | points |{pixels} | characters ],其中,大括号中是默认值
(4)clf reset;将窗口关闭,并重新设置其属性为默认值。
(5)Closerequestfcn,有效值为字符串或函数句柄(前加@)
当关闭绘图窗口或离开Matlab时,就会定义Closerequestfcn定义的函数
(6)createfcn,当Matlab建立一个对象时(如为figure对象,即打开一个绘图窗口),就会触发createfcn所定义的callback程序。如set(0,'defaultfigurecreatefcn','set(gcbo,''integerhandle'',''off'')');即设置了根对象的默认值,使每次建立figure对象时,都会指定一个非整数的句柄值。(在用户未指定句柄值时)
(7)将当前窗口中在键盘上按下的按键名显示出来。
set(gcf,'keypressfcn','get(gcf,''currentcharacter'')')
(8)color有效值为colorspec
colorspec表:
RGB 简称
[110] y_yellow
[101] m_magenta
[011] c_cyan
[100] r_red
[010] g_green
[001] b_blue
[111] w_white
[000] k_black
(9)linspace(a,b,c):a初始b结束c线性分段次数linspace(a,b)则默认100次
(10)CurrentObject:有效值为图形对象句柄值:返回绘图窗口内当前被鼠标选取的对象的句柄值
(11)currentPoint:有效值[x-坐标,Y-坐标]返回绘图窗口中最后单击鼠标的位置,用get(gcf,'currentpoint')就会返回当前在窗口中单击鼠标的位置
(12)DeleteFcn:有效值:字符串或函数句柄,删除对象(这里为figure)时会触发Deletefcn所定义的Callback程序。
(13)Dockcontrols:有效值为on/off,默认值on,控制窗口的嵌入效果是否可用。
(14)Hittest:有效值on/off,决定能否用鼠标选取对象为当前对象。
(15)Integerhandle:有效值on/off,决定Figure对象句柄值的类型为整数或浮点小数。
(16)Interruptible:有效值on/off,执行过程中需要中断程序而优先执行其他程序时要设该属性为on。即Interrupptible属性是用以控制当Callback执行时是否能被其他事件(如此时鼠标按下其他控制对象)而中断,on是会中断,off时会执行完当前Callback,再去执行其他Callback。
(17)Keypressfcn:有效值为字串或函数句柄。当用户在figure窗口中按下键盘的任意键时,就会执行Keypressfcn所定义的Callback程序。
figure('keypressfcn','fprintf(''当前按下键盘上的%c键\n'',get(gcf,''currentcharacter''))')在这个figure窗口中按下键盘上的按键时就会立即返回对应的字符,依据这个效果就可以决定当字符键被按下时所要执行的操作。
当这个属性指定的值是一个函数句柄时,Matlab就会将这个函数视为一个结构,包含下列字段——character(以当前键盘上按下的按键显示的字符来当作结果),modifier(包含一个或多个识别键盘上按下按键字符名称的细胞数组(如Ctrl,Alt,Shift等),key(显示被按下的键)。
(18)WindowButtonDownFcn:有效值为字符串或函数句柄
当鼠标在绘图窗口内按下鼠标任意键时,将触发WindowButtonDownFcn所定义的Callback以产生相对应的操作。
(19)WindowButtonMotionFcn:有效值为字符串或函数句柄
当鼠标在绘图窗口内按住鼠标任意键移动,将触发WindowButtonMotionFcn所定义的Callback以产生相对应的操作。
(20)WindowButtonUpFcn:有效值为字符串或函数句柄
当鼠标在绘图窗口内释放鼠标任意键时,将触发WindowButtonUpFcn所定义的Callback以产生相对应的操作。
(21)CurrentAxes有效值为当前坐标轴的句柄值,返回当前的坐标轴句柄值。假设某坐标轴句柄值为a_h,可以使用axes(a_h)或set(gcf,'currentaxes',a_h)这两种方式,制定句柄值为a_h的坐标轴为当前坐标轴。
(22)CurrentCharacter:有效值为任意字符,返回用户在绘图窗口中最后输入的一个字符,即刚在键盘上按下的字符键将存储到Currentcharacter中,一般于Keyppressfcn合用。
(23)Currentobject有效值为图形对象的句柄值,返回绘图窗口内当前被鼠标选取的对象的句柄值。
(24)有效值为两元素的向量,[X坐标,Y坐标]
返回绘图窗口中最后单击鼠标的位置,与Windowbuttonmotionfcn,Windowbuttonupfcn合用。使用get(gcf,'currentpoint')就会返回当前在窗口中单击鼠标的位置。
Axes对象的属性
(1)title('new','color','r');给坐标轴命名为new,红色
title({'this title','has 2 '});命名为两行的标题
(2)Units:有效值为pixels/normalized/inches/centimeters/points/characters
决定各种位置属性的度量单位,相对于窗口左下角为基准。当设置为Pixels时,以像素为单位;当设置为normalized时,以坐标为单位,屏幕的左下角为[0,0],右上角为[1.0,1.0]。
(3)grid on:在图像中显示网格。
(4)children:控制axes对象的子对象,即image\light\line\patch\rectangle\surface和text等对象,可通过get(gca,'children')来返回当前坐标轴的子对象构成的句柄值向量。
(5)字体属性:
Fontangle字体角度(正常normal或斜体italic/oblique)
Fontname字体名称
fontsize字体大小(单位由Fontunits决定)
fontunits字体单位(points/normalized/inches/centimeters/pixels)
fontweight字体粗细(normal/bold/light/demi)
gridlinestyle决定坐标轴网格线的样式,‘-’为实线‘- -’为虚线‘:’为点线‘-.’为点虚线
plot(1:10);gridon;set(gca,'gridlinestyle','-.');将当前坐标轴显示的网格线为点-虚线
(6)linewidth 定义X,Y和Z轴的轴线宽度(以点单位定义)
(7)NextPlot:有效值为add|replace|replacechildren,默认为replace
add表示使用当前的坐标轴,把新的图形对象加到此坐标轴中是一般保留的做法,replace表示重新设置坐标轴的所有属性(Position除外),也就是在绘图前会删除当前坐标轴和它的子对象。replacechildren表示移除当前坐标轴中所有子对象,但不重新设置坐标轴的所有属性
(8)Outerposition决定坐标轴外边界的位置。由位置向量[left,bottom,width,height]组成,其中left,bottom表示相对于绘图窗口左下角的位置,width,height表示区域尺寸,默认为[00 1 1]
(9)Position由位置向量[left,bottom,width,height]组成,决定坐标轴位置
(10)Tag定义本坐标轴的卷展栏,因为每一个对象都有自己唯一的识别码即tag,以方便findobj函数查找坐标轴句柄值。
(11)visible决定坐标轴是否可见
(12)set(gca,'xgrid','on')绘制X轴垂直网格线
set(gca,'gridlinestyle',':','linewidth',3)设置网格线线条类型和宽度
set(gca,'box','on')将图轴方框绘制出来
(13)set(gca,'xscale','linear');将X轴刻度设为线性
set(gca,'yscale','log');将Y轴刻度设为对数
(14)disp()显示一个数组,但不显示其数组名称
disp(' Corn Oats Hay')
disp(rand(5,3))
which results in
Corn Oats Hay
0.2113 0.8474 0.2749
0.0820 0.4524 0.8807
0.7599 0.8075 0.6538
0.0087 0.4832 0.4899
0.8096 0.6135 0.7741
Pause:pause, by itself, causes M-files to stop and wait for youto press any key before continuing.
实例:plot(1:10);set(gca,'yscale','log');
disp('请按下Enter键');
pause
set(gca,'Yscale','linear');本例是说按下Enter键将Y轴刻度由对数改为线性。
(16)Xtick,Ytick,Ztick:控制X,Y,Z轴坐标刻度记号的位置,即控制坐标轴上刻度记号的位置以及每隔多少值会到下一个刻度记号的位置,同时还需要配合Xticklabel、Yticklabel、Zticklabel属性来调整。详细见例程。
以下设置方式相同:
set(gca,'Xticklabel',{'1';'10';'100'})
set(gca,'Xticklabel','1|10|100')
set(gca,'Xticklabel',[1;10;100])
set(gca,'Xticklabel',['1 ';'10 ';'100'])
(17)Findobj:查找
Line对象
当用户建立一个线对象时,就会触发Createfcn所定义的Callback产生相对应的操作;同样,若删除一个线对象时,就会触发DeleteFcn所定义的Callback产生相对应的操作。以下程序建立一个线对象,并设置DeleteFcn为一个问题对话框,当删除该线对象时,就会显示其问题对话框来询问用户。
(1) clipping:有效值为on/off,默认值为on
设置坐标轴土筐是否可以剪辑,如果设为off,则绘制线对象时可超出坐标轴的图框。
(2)Linewidth:有效值为纯量(与向量相对,只有大小而无方向),点为单位。
(3)Marker:有效值为字符,决定Line对象的记号类型,有+,o,*,.,x,s,d,等
(4)Markersize:有效值为纯量,单位为点,Marker的大小。
(5)UIcontextmenu:有效值为uicontextmenu对象的句柄值,定义与线对象相关联的uicontextmenu菜单,因此当用户将该线对象的属性UicontextMenu设置为相关联的uicontextmenu对象的Tag名称时,uicontextmenu就可以在该线对象上单击鼠标右键来显示uicontextmenu菜单。
(6)Tag:有效值为字符串,定义改线对象的卷展栏(即标记)
(7)Type:有效值为字符串(只读),此处为’line‘字符串。
(8)Xdata,Ydata,Zdata:有效值为坐标数组,指定产生线条的数据点,若为2D环境则Xdata、Ydata需要有相同数目的数据,而Zdata为空矩阵;3D环境则Xdata,Ydata,Zdata三者都需要有相同数目的数据。
例:x=0:5,y=x+10;line('xdata',x,'ydata',y);
Patch对象
patch函数不想其他高级区域建立函数(fill和area),只是简单地将patch对象添加到当前坐标轴中而已。
使用:patch(X,Y,C)
在当前的坐标轴中添加二维填充的patch对象,X和Y用以定义patch对象顶点的位置,若X,Y为矩阵,则Matlab按每一行的元素来产生多个多边形。
例:x = [0 0;0 1;1 1];
y = [1 1;2 2;2 1];
z = [1 1;1 1;11];(x(1,1),y(1,1),z(1,1)为第一个面的第一个顶点,x(2,1),y(2,1),z(2,1)为第一个面的第二个顶点,以此类推)
tcolor(1,1,1:3) = [1 1 1];
tcolor(1,2,1:3) = [.7 .7 .7];
patch(x,y,z,tcolor);(tcolor是一个1*2*3的三维矩阵)
Surface对象
surface可以建立一个surface对象,surface是由矩阵数据所在的列索引值为X坐标,而行索引值为Y坐标,并且矩阵的每个元素值为Z坐标。
image对象
image(C)将矩阵C当作一个图像来显示,C的每一个元素定义一个图像中矩阵线段的颜色。
image(x,y,C)其中x与y为2元素的向量,分别指定X轴与Y轴卷展轴的范围。C为图像矩阵。
text对象
(1)text(x坐标,y坐标,'string')在图形中指定位置(x,y)显示字符串string。
(2)Editing有效值为on/off,off时,用户在执行GUI操作时无法直接在该Text对象上进行编辑,改为on后,可以进行编辑。
(3)HorizontalAlign 有效值为left/center/right决定Text对象中字符水平方向的对齐方式。
(4)Interpreter有效值为tex/none,决定Text对象中是否可用Tex字符注释,当设置为Tex时,表示允许用户能够在String属性下输入Tex字符。以下为在窗口的[.5 .5]点位置处建立一个text对象并且字体大小以16点来表示的一个方程式。(显示的是一个二重积分)
text('interpreter','latex','string','$$\int_0^x\!\int_ydF(u,v)$$','position',[.5 .5],'fontsize',16)
(5)String有效值为字符串,表示要显示出来的字符串是什么。
(6)verticalAlignme有效值为top/cap/middle/baseline/bottom决定Text对象垂直对齐的方式。
下面加载一个例子,是ilovematlab论坛一个斑竹的回复
x=0:0.5:10;
>> y1=sin(x);
>> y2=cos(x);
>> plot(x,y1,'r',x,y2,'g')
>> findobj(gca,'color','r')
不想要的曲线直接delete句柄就可以了
来源:()-matlab句柄图形学习笔记_肥猫乱舞_新浪博客%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
二 : Matlab图像处理简易入门教程
/1、图像的读取和显示 /2、图像的点运算
/3、图像的几何变换
/4、空间域图像增强 /5、频率域图像增强 /6、彩色图像处理 /7、形态学图像处理 /8、图像分割 /9、特征提取
/1、图像的读取和显示 一、图像的读取
A=imread(FILENAME,FMT)
FILENAME 指定图像文件的完整路径和文件名。如果在work工作目录下 只需提供文件名。FMT为图像文件的格式对应的标准扩展名。 I_1=imread('D:\10.06.08nir\TTC10377.BMP');%读入图像 二、图像的写入
imwrite(A,FILENAME,FMT)
FILENAME参数指定文件名。FMT为保存文件采用的格式。 imwrite(I6,'nirdilatedisk2TTC10373.bmp');
/1、图像的读取和显示 三、图像的显示
imshow(I,[low high])
I为要显示的图像矩阵。[low high]为指定显示灰度图像的灰度范围。 高于high的像素被显示成白色;低于low的像素被显示成黑色;介于 High和low之间的像素被按比例拉伸后显示为各种等级的灰色。 figure;imshow(I6);title('The Main Pass Part of TTC10373');
figure;%创建一个新的窗口 figure;subplot(m,n,p);imshow(I);
Subplot(m,n,p)含义为:打开一个有m行n列图像位置的窗口, 并将焦点位于第p个位置上。
/1、图像的读取和显示 四、图像的格式转换
im2bw(I,LEVEL);
阈值法从灰度图、RGB图创建二值图。LEVEL为指定的阈值;(0,1)。
rgb2gray;从RGB图创建灰度图,存储类型不变。
im2uint8 将图像转换成uint8类型
im2double
将图像转换成double类型
/2、图像的点运算
一、图像直方图 灰度直方图描述了一副图像的灰度级统计信息,主要应用于图像分 割和图像灰度变换等处理过程中。从数学角度来说,图像直方图描述图 像各个灰度级的统计特性,它是图像灰度值的函数,统计一幅图像中各 个灰度级出现的次数或概率。归一化直方图可以直接反映不同灰度级出 现的比率。横坐标为图像中各个像素点的灰度级别,纵坐标表示具有各 个灰度级别的像素在图像中出现的次数或概率。 图像直方图归一化
imhist(I);%灰度直方图
I=imread(‘red.bmp’);%读入图像 figure;%打开新窗口 [M,N]=size(I);%计算图像大小 [counts,x]=imhist(I,32);%计算有32个小区间的灰度直方图 counts=counts/M/N;%计算归一化灰度直方图各区间的值 stem(x,counts);%绘制归一化直方图
/2、图像的点运算
二、灰度的线性变换
DB ? f ?DA ? ? f A DA ? f B
Fa>1时,输出图像的对比度将增大;Fa<1时,输出图像对比度将减小。 Fa=1且Fb非零时,所有像素的灰度值上移或下移,使整个图像更暗或 更亮。Fa<0,暗区变亮,亮区变暗。
/2、图像的点运算
三、灰度的对数变换
t ? c log?k ? s ?
c为尺度比例常数,s为源灰度值,t为变换后的目标灰 度值。k为常数。灰度的对数变换可以增强
一幅图像 中较暗部分的细节,可用来扩展被压缩的高值图像中 的较暗像素。广泛应用于频谱图像的显示中。
Warning:log函数会对输入图像矩阵s中的每个元素进行
操作,但仅能处理double类型的矩阵。而从图像文件中得到的 图像矩阵大多是uint8类型的,故需先进行im2double数据类型 转换。
I=imread('nir.bmp');%读入图像 F=fft2(im2double(I));%FFT F=fftshift(F);%FFT频谱平移 F=abs(F); T=log(F+1);%频谱对数变换 figure;imshow(F,[]);title('未经变换的频谱'); figure;imshow(T,[]);title('对数变换后');
/2、图像的点运算
三、灰度的Gamma变换
y ? ?x ? esp?
?
其中,x、y的取值范围为[0,1]。esp为补偿系数,r则为Gamma系数。 Gamma变换是根据r的不同取值选择性的增强低灰度区域的对比度 或者高灰度区域的对比度。
J=imadjust(I,[low_in high_in],[low_out high_out],gamma)
I=imread('nir.bmp'); figure;imshow(imadjust(I,[],[],0.75)); %gamma=0.5 title('Gamma 0.5');
原 NIR Gamma 0.5 图 像
四、灰度阈值变换及二值化
Gamma 1.5
? 0 x ?T f ?x ? ? ? ?255 x ? T
T为指定阈值
BW=im2bw(I,level);%level为人工设定阈值范围为[0 ,1] thresh=graythresh(I);%自动设定所需的最优化阈值
OTSU算法:最大类间方差法自动单阈值分割。 Kapur算法:一维直方图熵阈值算法 niblack算法:局部阈值分割 阈值的计算公式是T = m + k*v,其中m为以该像素点为中心的区域的平 均灰度值,v是该区域的标准差,k是一个系数。 kittlerMet : 表示kittler 最小分类错误(minimum error thresholding)全局二 值化算法。
原 图 像
直 接 阈 值 分 割 0.25
算 法 分 割
OTSU
Niblack
算 法
算 法
自 动 阈 值 分 割
KittlerMet
Kapur
算 法
/2、图像的点运算
五、直方图均衡化
DMax DB ? f ?DA ? ? A0
?H
i ?0
DA
i
[J,T]=histeq(I);%J为输出图像,T为变换矩阵
图像易受光照、视角、方位、噪声等的影响。使得同一类图像的不同变形 体之间的差距有时大于该类图像与另一类图像之间的差距,影响图像识别、 分类。图像归一化就是将图像转换到唯一的标准形式以抵抗各种变换,从 而消除同类图像不同变形体之间的外观差异。也称为图像灰度归一化。 原 图 像 及 直 方 图
图像变暗后灰度均衡化
图像变亮后灰度均衡化
/3、图像的几何变换
一、图像平移
正变换
[ x1
y1
1] ? [ x0
y0
?1 ? 1]? 0 ?T ? x ? 1 ? 1]? 0 ??T x ?
0 1 Ty 0 1 ? Ty
0? ? 0? 1? ? 0? ? 0? 1? ?
逆变换
[ x0
y0
1] ? [ x1
y1
strel %用来创建形态学结构元素 translate(SE,[y x])%原结构元素SE上y和x方向平移 imdilate%形态学膨胀
/3、图像的几何变换
I=imread('nir.bmp'); se=translate(strel(1),[180 190]); B=imdilate(I,se); figure;subplot(1,2,1),subimage(I);title
('原图像'); subplot(1,2,2),subimage(B);title('平移后图像');
/3、图像的几何变换 二、图像镜像
B=imtransform(A,TFORM,method); TFORM=makeform(transformtype,Matrix);%空间变换结构
Method合法值 ‘bicubic’ ‘bilinear’ ‘nearest’ 含义 双三次插值 双线性插值 最近邻插值
参数transformtype指定了变换的类型,常见的’affine’为二维或 多维仿射变换,包括平移、旋转、比例、拉伸和错切等。 Matrix为相应的仿射变换矩阵。
A=imread('nir.bmp'); [height,width,dim]=size(A); tform=maketform('affine',[-1 0 0;0 1 0;width 0 1]); B=imtransform(A,tform,'nearest'); tform2=maketform('affine',[1 0 0;0 -1 0;0 height 1]); C=imtransform(A,tform2,'nearest'); figure;imshow(A); figure;imshow(B);imwrite(B,'nir水平镜像.bmp'); figure;imshow(C);imwrite(B,'nir垂直镜像.bmp');
原图像
水平镜像图像
垂直镜像图像
/3、图像的几何变换 三、图像转置
A=imread('nir.bmp'); tform=maketform('affine',[0 1 0;1 0 0;0 0 1]); B=imtransform(A,tform,'nearest'); figure;imshow(A); figure;imshow(B);imwrite(B,'nir转置后图像.bmp');
/3、图像的几何变换 四、图像中心旋转
B=imrotate(A,angle,method,’crop’);
angle为旋转角度,正值为逆时针旋转。可选参数method为imrotate函数 指定插值方法。‘crop’选项会裁减旋转后增大的图像,保持和原图像 同样大小。
A=imread('nir.bmp'); B=imrotate(A,30,'nearest','crop'); figure;imshow(B);imwrite(B,'逆时针中心旋转30度.bmp');
逆 时 针 度
30
/4、空间域图像增强
一、噪声添加
h=imnoise(I,type,parameters);
type为噪声类型,合法值如下:
‘gaussian’
‘salt&pepper’
高斯白噪声:幅度为高斯分布,功率谱均匀分 布
黑点如胡椒,白点如盐粒。由图像传感器、传 输信道、解码处理、图像切割等产生的黑白相 间的亮暗点噪声。 添 加 椒 盐 噪 声
添 加 高 斯 白 噪 声
/4、空间域图像增强
二、空间域滤波 滤波过程就是在图像f(x,y)中逐点移动模板,使模板中心和点(x,y)重合,滤波器 在每一点(x,y)的响应是根据模板的具体内容并通过预先定义的关系来计算的。 W(-1,-1) W(-1,0) W(0,-1) W(1,-1) W(0,0) W(1,0) W(-1,1) W(0,1) W(1, 1) f(x-1,y-1) f(x,y-1) f(x-1,y) f(x,y) f(x-1,y+1) f(x,y+1) f(x+1,y+1)
f(x+1,y-1) f(x+1,y)
B=imfilter(f,w,option1,option2,…);
f 为要进行滤波操作的图像。 w为滤波操作使用的模板,为一个二维数组,可自己定义。 option1……是可选项,包括: 1、边界选项(’symmetric’、’replicate’、’circular’) 2、尺寸选项(’same’、’full’) 3、模式选项(’corr’、’conv’) 原 图 像 滤 波 后 图 像
/4、空间域图像增强
三、滤波器设计
h=fspecial(type,parameters)
parameters为可选项,是和所选定的滤波器类型type相关的 配置参数,如尺寸和标准差等。 type为滤波器的
类型。其合法值如下: 合法取值 ‘average’ ‘disk’ ‘gaussian’ ‘laplacian’ ‘log’ ‘prewitt’ ‘sobel’ 功能 平均模板 圆形领域的平均模板 高斯模板 拉普拉斯模板 高斯-拉普拉斯模板 Prewitt水平边缘检测算子 Sobel水平边缘检测算子
/4、空间域图像增强
四、中值滤波
中值滤波本质上是一种统计排序滤波器。中值不同于均值,是指排序 队列中位于中间位置的元素的值。中值滤波并非线性滤波器。对于某 些类型的随机噪声具有非常理想的降噪能力。典型的应用就是消除椒 盐噪声。
h=medfilt2(I1,[m,n]);
m和n为中值滤波处理的模板大小,默认3*3
/4、空间域图像增强
五、图像锐化 图像锐化主要用于增强图像的灰度跳变部分,主要通过运算导数(梯度) 或有限差分来实现。主要方法有:Robert交叉梯度,Sobel梯度,拉普拉 斯算子,高提升滤波,高斯-拉普拉斯变换。
Robert交叉梯度
? ? 1 0? w1 ? ? ? ? 0 1?
?0 ? 1? w2 ? ? ? ?1 0 ?
w1对接近正45°边缘有较强响应,w2对接近负45°边缘有较强响应。
Sobel交叉梯度
?- 1 - 2 - 1? w1 ? ? 0 0 0 ? ? ? ?1 2 1? ? ?
对水平边缘有较大响应 拉普拉斯算子
? -1 w2 ? ?- 2 ? ? -1 ?
0 0 0
1? 2? ? 1? ?
对垂直边缘有较大响应
?0 1 0 ? ?1 1 1? ?1 4 1 ? w1 ? ?1 - 4 1? w2 ? ?1 - 8 1? w3 ? ?4 - 20 4? ? ? ? ? ? ? ?0 1 0 ? ?1 1 1? ?1 4 1 ? ? ? ? ? ? ?
Robert交叉梯度
I=imread('nir.bmp'); I=double(I);%双精度化 w1=[-1 0;0 1]; w2=[0 -1;1 0]; G1=imfilter(I,w1,‘corr’,‘replicate’);%正45°梯度 G2=imfilter(I,w2,‘corr’,‘replicate’);%负45°梯度 G=abs(G1)+abs(G2);%计算Robert梯度 figure;imshow(G,[]); figure;imshow(abs(G1),[]); figure;imshow(abs(G2),[]);
高斯-拉普拉斯锐化 I=imread('nir.bmp'); Id=double(I);%双精度化 h_1=fspecial('log',5,0.5);%大小为5,sigma=0.5的LOG算子 I_1=imfilter(Id,h_1,'corr','replicate'); figure;imshow(uint8(abs(I_1)),[]); h_2=fspecial('log',5,2);%大小为5,sigma=2的LOG算子 I_2=imfilter(Id,h_2,'corr','replicate'); figure;imshow(uint8(abs(I_2)),[]);
/5、频率域图像增强
用傅里叶变换表示的函数特征可以完全通过 傅里叶反变换进行重建而不丢失任何信息
吉布斯现象Gibbs phenomenon(又叫吉布斯效应): 将具有不连续点的周 期函数(如矩形脉冲)进行傅立叶级数展开后,选取有限项进行合成。当选 取的项数越多,在所合成的波形中出现的峰起越靠近原信号的不连续点。 当选取的项数很大时,该峰起值趋于一个常数,大约等于总跳变值的9%。 这种现象称为吉布斯现象。
幅度谱
F ?u , v ? ? Re?u , v ? ? Im ?u , v ?
2
?
2 1/ 2
?
相位谱
Im?u, v ? ? ?u, v ? ?
arg tan Re?u, v ?
F ?u, v? ? F ?u, v? e
功率谱
2
j? ?u ,v ?
P?u , v ? ? F ?u , v ? ? Re?u , v ? ? Im ?u, v ?
2
2
/5、频率域图像增强 一、傅里叶变换
I=fft2(x);%快速傅里叶变换 I=fft2(x,m,n);
x为输入图像;m和n分别用于将x的第一和第二维规整到指定的长度。 当m和n均为2的整数次幂时算法的执行速度要比m和n均为素数时快。
I1=abs(I);%计算I的幅度谱 I2=angle(I);%计算I的相位谱 Y=fftshift(I);%频谱平移
I=ifft2(x);%快速傅里叶逆变换 I=ifft2(x,m,n);
幅 度 谱
相 位 谱
平 移 后 的 相 位 谱
理想低通
function out = imidealflpf(I,freq) %imidealflpf函数 构造高斯频域低通滤波器 [M,N] = size(I); out = ones(M,N); for i=1:M for j=1:N if (sqrt(((i-M/2)^2+(j-N/2)^2))>freq) out(i,j)=0; end end end
高斯低通
function out = imgaussflpf(I,sigma) %imgaussflpf函数 构造高斯频域低通滤波器 [M,N] = size(I); out = ones(M,N); for i=1:M forj=1:N out(i,j) = exp(-((i-M/2)^2+(j-N/2)^2)/2/sigma^2); end end
/6、彩色图像处理
色彩模型:RGB模型、CMY模型、CMYK模型、HIS模型、 HSV模型、YUV模型、YIQ模型。
RGB模型
国际照明委员会(CIE) 规定以蓝(435.8nm)、 绿(546.1nm)和红 (700nm)作为主原色。
Matlab中一幅RGB图像可表示为一个M*N*3的3维矩阵。其中每一个 彩色像素都在特定空间位置的彩色图像中对应红、绿、蓝3个分量。
RGB_image=cat(3,PR,PG,PB);%将PR、PG、PB三个矩 阵在第3个维度上进行级联,进行图像合成 PR=RGB_image(:,:,1);%提取红色分量 PG=RGB_image(:,:,2);%提取绿色分量 PB=RGB_image(:,:,3);%提取蓝色分量
CMY模型
CMY模型是采用(Cyan、Magenta、Yellow)青、品红、 黄色3中基本原色按一定比例合成颜色。由于色彩的显 示是由光线被物体吸收掉一部分之后反射回来的剩余 光线产生,故CMY模型又称为减色法混色模型。当光 都被吸收时成为黑色,都被反射时为白色。
CMY模型主要用于彩色打印机和 复印机等。 CMYK模型 CMY模型在实际使用中,青、品红 和黄色等比例混合后的黑色并不纯, 为产生真正的黑色,专门加入第四 种颜色—黑色。得到CMYK模型。用 于四色打印。
? C ? ?1? ? R ? ? M ? ? ?1? ? ?G ? ? ? ?? ? ? ? Y ? ?1? ? B ? ? ? ?? ? ?
? R ? ?1? ? C ? ?G ? ? ?1? ? ? M ? ? ? ?? ? ? ? B ? ?1? ? Y ? ? ? ?? ? ?
cmy=imcomplement(rgb);%rgb转成cmy rgb=imcomplement(cmy);cmy转成rgb
HSI模型
HIS模型是从人的视觉系统出发,直接使用颜色三要素色调 (Hue)、饱和度(Saturation)和亮度(Intensity)来描述 颜色。
?亮度指人眼感觉光的明暗程度。光的能量越大,亮度越大。 ?色调由物体反射光线中占优势的波长决定。
反映颜色的本质。 ?饱和度指颜色的深浅和浓淡程度,饱和度越高,颜色越深。
HIS色彩空间比RGB彩色空间更符合人的视觉特性。亮度和色 度具有可分离特性,使得图像处理和机器视觉中大量灰度处 理算法都可在HIS彩色空间中方便使用。
色调
? ? , ?B ? G ? H ?? ?360? ? , ?B ? G ?
1 ? ? ??R ? G ? ? ?R ? B ?? ? ? 2 ? ? arccos ? 1/ 2 ? 2 ? ?R ? G ? ? ?R ? G ??G ? B ? ? ? ?
其中
?
?
饱和度
3 ?min(R, G, B)? S ? 1? ( R ? G ? B)
强度
1 I ? ( R ? G ? B) 3
/7、形态学图像处理 一、二值图像腐蚀
I2=imerode(I,SE); SE=strel(shape,parameters);
I为原始图像,可以是二值或者灰度图像。 shape指定了结构元素的形状。 parameters是和输入shape有关的参数。 合法取值 ‘arbitrary’或为空 ‘disk’ ‘square’ ‘rectangle’ ‘line’ ‘pair’ ‘diamond’ ‘octagon’ 功能描述 任意自定义结构元素 圆形结构元素 正方形结构元素 矩形结构元素 线性结构元素 包含2个点的结构元素 菱形的结构元素 8角形的结构元素
/7、形态学图像处理 二、二值图像膨胀
I2=imdilate(I,SE); SE=strel(shape,parameters);
I为原始图像,可以是二值或者灰度图像。 shape指定了结构元素的形状。 parameters是和输入shape有关的参数。 腐蚀后 原图像
膨胀后
/7、形态学图像处理 三、其他二值图像运算
SE=strel(shape,parameters); I2=imopen(I,SE);%开运算 I3=imclose(I,SE);%闭运算 Ihm=bwhitmiss(I,SE1,SE2);%击中击不中变换
四、连通分量提取
[L num]=bwlabel(Ibw,conn);
Ibw为一幅输入二值图像。 conn为可选参数,指明提取连通分量是4连通还是8连通。默认为8。 L为连通分量标注图像。 num为二值图像Ibw中连通分量个数。
/7、形态学图像处理 五、bwmorph函数 合法取值 ‘bridge’ ‘clean’ ‘diag’ ‘fill’ ‘hbreak’ ‘majority’
Iout=bwmorph(I,operation,n)
功能描述 桥接有单个像素缝隙分割的前景像素 清楚孤立的前景像素 围绕对角线相连的前景像素进行填充 填充单个像素的孔洞 去掉前景中的H形连接 如果点P的8领域中一半以上像素为前景 像素,则P为前景像素,否则为背景。
‘remove’
‘shrink’ ‘skel’ ‘spur’ ‘thicken’ ‘thin’
去除内部像素(无背景像素相邻的前景)
将物体收缩为一个点或者带洞的环形 骨骼化图像 去除“毛刺” 粗化物体 将物体细化至最低限度相连的线形
/7、形态学图像处理
六、顶帽变换 解决非均匀光照问题。顶帽变换定义为图像f与图像f的开运算之差。
h ? f ? ? f ? s?
a=imread('red.bmp'); I=rgb2gray(a); figure,surf(double(I(1:8:end,1:8:end))),zlim([0 255]), colormapgray;%显示图像I的三维可视化效果 bg=imopen(I
,strel(‘disk’,15));%开运算 Itophat=imsubtract(I,bg);%顶帽变换 figure,imshow(Itophat); figure,surf(double(Itophat(1:8:end,1:8:end))),zlim([0 255]); I2=imadjust(Itophat); figure,imshow(I2);
原 图 像 三 维 可 视 化 效 果 顶 帽 变 换 后 的 三 维 可 视 化 效 果
顶 帽 变 换 后 图 像
对 比 度 拉 伸 后 效 果
/8、图像分割 一、图像分割概述 图像分割一般采用的方法有边缘检测(edge detection)、边界跟踪 (edge tracing)、区域生长(region growing)、区域分离和聚合等。 图像分割算法一般基于图像灰度值的不连续性或其相似性。 ? 不连续性是基于图像灰度的不连续变化分割图像,如针对图像的边缘 有边缘检测、边界跟踪等算法。 ? 相似性是依据事先制定的准则将图像分割为相似的区域,如阈值分割、 区域生长等。 二、边缘检测 图像的边缘点是指图像中周围像素灰度有阶跃变化或屋顶变化的那 些像素点,即灰度值导数较大或极大的地方。 边缘检测可以大幅度的减少数据量,并且剔除不相关信息,保留图 像重要的结构属性。 边缘检测基本步骤:平滑滤波、锐化滤波、边缘判定、边缘连接。
边缘检测算法:
?基于一阶导数:Roberts算子、Sobel算子、Prewitt算子 ?基于二阶导数:高斯-拉普拉斯边缘检测算子 ?Canny边缘检测算法
Matlab实现
1)、基于梯度算子的边缘检测
BW=edge(I,type,thresh,direction,’nothinning’)
type合法取值 梯度算子
‘sobel’ ‘prewitt’
‘reberts’
sobel算子 prewitt算子
robert算子
thresh是敏感度阈值参数,任何灰度值低于此阈值的边缘将不 会被检测到。默认值为空矩阵[],此时算法自动计算阈值。
direction指定了我们感兴趣的边缘方向,edge函数将只检测direction中 指定方向的边缘,其合法值如下: direction合法值 ‘horizontal’ ‘vertical’ ‘both’ 边缘方向 水平方向 竖直方向 所有方向
可选参数’nothinning’,指定时可以通过跳过边缘细化算法来加快算法 运行的速度。默认是’thinning’,即进行边缘细化。 2)、基于高斯-拉普拉斯算子的边缘检测
BW=edge(I,’log’,thresh,sigma)
sigma指定生成高斯滤波器所使用的标准差。默认时,标准差为2。滤 镜大小n*n,n的计算方法为:n=ceil(sigma*3)*2+1。
3)、基于Canny算子的边缘检测
BW=edge(I,’canny’,thresh,sigma)
thresh是敏感度阈值参数,默认值为空矩阵[]。此处为一列向量,为 算法指定阈值的上下限。第一个元素为阈值下限,第二个元素为阈 值上限。如果只指定一个阈值元素,则默认此元素为阈值上限,其 0.4倍的值作为阈值下限。如阈值参数没有指定,则算法自行确定敏 感度阈值上下限。 b1=imread('nir.bmp'); h58=fspecial('gaussian',5,0.8); b=imfilter(b1,
h58); bw1=edge(b,‘sobel’);%sobel算子 bw2=edge(b,‘prewitt’);%prewitt算子 bw3=edge(b,‘roberts’);%roberts算子 bw4=edge(b,‘log’); %log算子 bw5=edge(b,‘canny’);%canny算子 figure;imshow(bw1);imwrite(bw1,'nirbwsobel.bmp'); figure;imshow(bw2);imwrite(bw2,'nirbwprewitt.bmp'); figure;imshow(bw3);imwrite(bw3,'nirbwroberts.bmp'); figure;imshow(bw4);imwrite(bw4,'nirbwlog.bmp'); figure;imshow(bw5);imwrite(bw5,'nirbwcanny.bmp');
log
算 子
算 子
算 子
canny 算 子
roberts
Sobel
算 子 prewitt
分析
1、边缘定位精度方面: Roberts算子和Log算子定位精度较高。Roberts算子简单直观,Log算 子利用二阶导数零交叉特性检测边缘。但Log算子只能获得边缘位置信 息,不能得到边缘方向信息。 2、边缘方向的敏感性: Sobel算子、Prewitt算子检测斜向阶跃边缘效果较好,Roberts算子 检测水平和垂直边缘效果较好。Log算子不具有边缘方向检测功能。 Sobel算子能提供最精确的边缘方向估计。 3、去噪能力: Roberts算子和Log算子虽然定位精度高,但受噪声影响大。 Sobel算子和Prewitt算子模板相对较大因而去噪能力较强,具有平 滑作用,能滤除一些噪声,去掉一部分伪边缘,但同时也平滑了真正 的边缘,降低了其边缘定位精度。
总体来讲,Canny算子边缘定位精确性和抗噪声能力效果较好, 是一个折中方案。
/8、图像分割
三、Hough变换直线检测
步骤:
1. 利用hough()函数执行霍夫变换,得到霍夫矩阵; 2. 利用houghpeaks()函数在霍夫矩阵中寻找峰值点; 3. 利用houghlines()函数在之前两步结果的基础上得到原二值图像 中的直线信息。
1、霍夫变换(针对二值图像)
[H,theta,rho]=hough(BW,param1,val1,param2,val2)
Param合法值 ‘ThetaResolution’ ‘RhoResolution’ 含义 Hough矩阵中a轴方向上单位区间长度,[0,90] Hough矩阵中p轴方向上单位区间长度,[0,norm(size(BW))]
2、寻找峰值—houghpeaks
peaks=houghpeaks(H,numpeaks,param1,val1,param2,val2)
Param合法值 ‘Threshold’ ‘NHoodSize’ 含义 峰值的阈值,默认为0.5*max(H(:)) 在每次检测出一个峰值后,NHoodSize指出了在该峰值周 围需要清零的邻阈信息。以向量[M N]形式给出,其中M、 N均为正奇数。默认为大于等于size(H)/50的最小奇数
peaks是一个Q*2的矩阵,每行的两个元素分别为某一峰值点在Hough矩阵中 的行、列索引,Q为找到的峰值点的数目。 3、提取直线段—houghlines
lines=houghlines(BW,theta,rho,peaks,param1,val1,param2,val2)
Param合法值 ‘FillGap’ ‘MinLength’
含义 线段合并的阈值:如果对应于Hough矩阵某一个单元格(相同 的a和p)的2个线段之间的距离小于FillGap,则合并为1个直线 段。默认值为20 检测的直线段的最小长度阈值:如果检测出的直线线段长度 大于MinLength,
则保留,否则丢弃。默认值为40。 返回值lines的结构
域 point1 point2 theta rho
含义 直线段的端点1 直线段的端点2 对应在霍夫矩阵中的a 对应在霍夫矩阵中的p
I1=imread('004.jpg'); I=rgb2gray(I1); %旋转图像并寻找边缘 rotI=imrotate(I,33,'crop'); BW=edge(rotI,'canny'); %执行Hough变换并显示Hough矩阵 [H,T,R]=hough(BW); figure;imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit'); xlabel('\theta'),ylabel('\rho'); axis on,axis normal,hold on;
%在Hough矩阵中寻找前5个大于Hough矩阵中最大值0.3倍的峰值 P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:)))); x=T(P(:,2));y=R(P(:,1));%由行、列索引转换成实际坐标 plot(x,y,'s','color','white');%在Hough矩阵图像中标出峰值位置 %找出并绘制直线 lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);%合并距离小于5的线段,丢弃所有 长度小于7的直线段 figure,imshow(rotI),hold on max_len=0;
for k = 1:length(lines)%依次标出各条直线段 xy=[lines(k).point1;lines(k).point2]; plot(xy(:,1),xy(:,2),'x','LineWidth',2,'Color','green'); %绘制线段端点 plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red'); %确定最长的线段 len=norm(lines(k).point1-lines(k).point2); if(len>max_len) max_len=len; xy_long=xy; end end %高亮显示最长线段 plot(xy_long(:,1),xy_long(:,2), 'LineWidth',2,'Color','cyan');
原 图 像
Hough矩阵 旋 转 并 检 测 最 长 直 线 段
/9、特征提取
特征提取的一般原则:
选择在同类图像之间差异较小(较小的类内距),在不同类别的图像之间差异 较大(较大的类间距)的图像特征。
一、简单区域描绘子
?周长:区域边界上的像素数目。 ?面积:区域中像素数目。 ?致密性:(周长)^2/面积。 ?区域的质心。 ?灰度均值:区域中所有像素的平均值。 ?灰度中值:区域中所有像素的排序中值。 ?包含区域的最小矩形。 ?最小或最大灰度级。 ?大于或小于均值的像素数。 ?欧拉数:区域中的对象数减去这些对象的孔洞数。
D=regionprops(L,properties);
L为一个标记矩阵,通过连通1区域标注函数bwlabel得到。
Properties合法值 ‘Area’ ‘BoundingBox’ ‘Centroid’ ‘ConvexHull’ ‘EquivDiameter’ ‘EulerNumber’ 含义 区域内像素总数 包含区域的最小矩形 区域的质心 包含区域的最小凸多边形 和区域有着相同面积的圆的直径 区域中的对象数减去这些对象的孔洞数
二、主成分分析(Principal Component Analysis,PCA)
[COEFF,SCORE,latent]=pincomp(X);
? X为原始样本组成n*d的矩阵,其每一行是一个样本特征向量,每一 列表示样本特征向量的一维。 ? COEFF:主成分分量,也是样本协方差矩阵的本征向量。 ? SCORE:主成分,X的低维表示。 ? latent:一个包含着样本协方差
矩阵本征值的向量。
X=[1,2;3,3;3,5;4,5;5,6;6,5;8,7;9,3;7,6]; X [COEFF,SCORE,latent]=princomp(X);%主成分分 析 COEFF%主成分分量 SCORE%主成分 latent%X样本协方差矩阵的本征值
三 : Matlab图像处理小结
转载▼61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1