61阅读

matlab图像处理-MATLAB图像句柄学习【转】

发布时间:2017-10-03 所属栏目:matlab数字图像处理

一 : MATLAB图像句柄学习【转】

什么是图形句柄?如何获得?

Matlab为每个显示对象创建与之对应的句柄。通过对象句柄,我们就可以控制和调整图形的属性。如:

>> H=figure

H =

1

这条语句创建了一个图形对象,同时将图像句柄传递给变量H. matlab将一直认为显示器的句柄为0。

如果在创建时并未保存对象句柄,则需要使用一些语句来得到对象的句柄。

gcf

获得当前图像的句柄

gca

获得当前轴的句柄

gco

获得当前对象的句柄

findobj

查找符合某些属性的所有对象的句柄

注:当对象的HandleVisibility属性设置为off 或callback时,将不能用findobj找到。

上表中的当天对象是指被鼠标最后点击过的对象。

图形句柄是干什么用的?怎么用?

通过图形对象的句柄,我们可以改变图形对象的属性-几乎所有属性。getset函数用于查询和设置句柄图形对象的属性。

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图像处理小结

转载▼

标签:高斯

台中

函数

图像数据

图像文件

分类:图像处理

经常做做图像处理的东西,时间长了,有些函数就忘了,看到网上有人总结,收藏了。

1. 图像和图像数据

缺省情况下,MATLAB将图像中的数据存储为双精度类型(double),64位浮点数,所需存储量很大;MATLAB还支持另一种类型无符号整型(uint8),即图像矩阵中每个数据占用1个字节。

在使用MATLAB工具箱时,一定要注意函数所要求的参数类型。另外,uint8与double两种类型数据的值域不同,编程需注意值域转换。

从uint8到double的转换

---------------------------------------------

图像类型 MATLAB语句

---------------------------------------------

索引色 B=double(A)+1

索引色或真彩色 B=double(A)/255

二值图像 B=double(A)

---------------------------------------------

从double到uint8的转换

---------------------------------------------

图像类型 MATLAB语句

---------------------------------------------

索引色 B=uint8(round(A-1))

索引色或真彩色 B=uint8(round(A*255))

二值图像 B=logical(uint8(round(A)))

---------------------------------------------

2. 图像处理工具箱所支持的图像类型

2.1 真彩色图像

R、G、B三个分量表示一个像素的颜色。如果要读取图像中(100,50)处的像素值,可查看三元数据(100,50,1:3)。

真彩色图像可用双精度存储,亮度值范围是[0,1];比较符合习惯的存储方法是用无符号整型存储,亮度值范围[0,255]

2.2 索引色图像

包含两个结构,一个是调色板,另一个是图像数据矩阵。调色板是一个有3列和若干行的色彩映象矩阵,矩阵每行代表一种颜色,3列分别代表红、绿、蓝色强度的双精度数。

注意:MATLAB中调色板色彩强度[0,1],0代表最暗,1代表最亮。

常用颜色的RGB值

--------------------------------------------

颜色 R G B 颜色 R G B

--------------------------------------------

黑 0 0 1 洋红 1 0 1

白 1 1 1 青蓝 0 1 1

红 1 0 0 天蓝 0.67 0 1

绿 0 1 0 橘黄 1 0.5 0

蓝 0 0 1 深红 0.5 0 0

黄 1 1 0 灰 0.5 0.5 0.5

--------------------------------------------

产生标准调色板的函数

-------------------------------------------------

函数名 调色板

-------------------------------------------------

Hsv 色彩饱和度,以红色开始,并以红色结束

Hot 黑色-红色-黄色-白色

Cool 青蓝和洋红的色度

Pink 粉红的色度

Gray 线型灰度

Bone 带蓝色的灰度

Jet Hsv的一种变形,以蓝色开始,以蓝色结束

Copper 线型铜色度

Prim 三棱镜,交替为红、橘黄、黄、绿和天蓝

Flag 交替为红、白、蓝和黑

--------------------------------------------------

缺省情况下,调用上述函数灰产生一个64×3的调色板,用户也可指定调色板大小。索引色图像数据也有double和uint8两种类型。当图像数据为double类型时,值1代表调色板中的第1行,值2代表第2行……如果图像数据为uint8类型,0代表调色板的第一行,,值1代表第2行……

2.3 灰度图像

存储灰度图像只需要一个数据矩阵。

数据类型可以是double,[0,1];也可以是uint8,[0,255]

2.4 二值图像

二值图像只需一个数据矩阵,每个像素只有两个灰度值,可以采用uint8或double类型存储。

MATLAB工具箱中以二值图像作为返回结果的函数都使用uint8类型。

2.5 图像序列

MATLAB工具箱支持将多帧图像连接成图像序列。图像序列是一个4维数组,图像帧的序号在图像的长、宽、颜色深度之后构成第4维。

分散的图像也可以合并成图像序列,前提是各图像尺寸必须相同,若是索引色图像,调色板也必须相同。

可参考cat()函数 A=cat(4,A1,A2,A3,A4,A5)

3. MATLAB图像类型转换

图像类型转换函数

---------------------------------------------------------------------------

函数名 函数功能

---------------------------------------------------------------------------

dither 图像抖动,将灰度图变成二值图,或将真彩色图像抖动成索引色图像

gray2ind 将灰度图像转换成索引图像

grayslice 通过设定阈值将灰度图像转换成索引色图像

im2bw 通过设定亮度阈值将真彩色、索引色、灰度图转换成二值图

ind2gray 将索引色图像转换成灰度图像

ind2rgb 将索引色图像转换成真彩色图像

mat2gray 将一个数据矩阵转换成一副灰度图

rgb2gray 将一副真彩色图像转换成灰度图像

rgb2ind 将真彩色图像转换成索引色图像

----------------------------------------------------------------------------

4. 图像文件的读写和查询

4.1 图形图像文件的读取

利用函数imread()可完成图形图像文件的读取,语法:

A=imread(filename,fmt)

[X,map]=imread(filename,fmt)

[...]=imread(filename)

[...]=imread(filename,idx) (只对TIF格式的文件)

[...]=imread(filename,ref) (只对HDF格式的文件)

通常,读取的大多数图像均为8bit,当这些图像加载到内存中时,Matlab就将其存放在类uint8中。此为Matlab还支持16bit的PNG和TIF图像,当读取这类文件时,Matlab就将其存贮在uint16中。

注意:对于索引图像,即使图像阵列的本身为类uint8或类uint16,imread函数仍将颜色映象表读取并存贮到一个双精度的浮点类型的阵列中。

4.2 图形图像文件的写入

使用imwrite函数,语法如下:

imwrite(A,filename,fmt)

imwrite(X,map,filename,fmt)

imwrite(...,filename)

imwrite(...,parameter,value)

当利用imwrite函数保存图像时,Matlab缺省的方式是将其简化道uint8的数据格式。

4.3 图形图像文件信息的查询imfinfo()函数

5. 图像文件的显示

5.1 索引图像及其显示

方法一:

image(X)

colormap(map)

方法二:

imshow(X,map)

5.2 灰度图像及其显示

Matlab 7.0 中,要显示一副灰度图像,可以调用函数 imshow 或 imagesc (即imagescale,图像缩放函数)

(1) imshow 函数显示灰度图像

使用imshow(I)或使用明确指定的灰度级书目:

imshow(I,32)

由于Matlab自动对灰度图像进行标度以适合调色板的范围,因而可以使用自定义大小的调色板。其调用格式如下:

imshow(I,[low,high]) 其中,low 和 high 分别为数据数组的最小值和最大值。

(2) imagesc 函数显示灰度图像

下面的代码是具有两个输入参数的 imagesc 函数显示一副灰度图像

imagesc(1,[0,1]);

colormap(gray);

imagesc 函数中的第二个参数确定灰度范围。灰度范围中的第一个值(通常是0),对应于颜色映象表中的第一个值(颜色),第二个值(通常是1)则对应与颜色映象表中的最后一个值(颜色)。灰度范围中间的值则线型对应与颜色映象表中剩余的值(颜色)。

在调用 imagesc 函数时,若只使用一个参数,可以用任意灰度范围显示图像。在该调用方式下,数据矩阵中的最小值对应于颜色映象表中的第一个颜色值,数据矩阵中的最大值对应于颜色映象表中的最后一个颜色值。

5.3 RGB 图像及其显示

(1) image(RGB)

不管RGB图像的类型是double浮点型,还是 uint8 或 uint16 无符号整数型,Matlab都能通过 image 函数将其正确显示出来。

RGB8 = uint8(round(RGB64×255)); % 将 double 浮点型转换为 uint8 无符号整型

RGB64 = double(RGB8)/255; % 将 uint8 无符号整型转换为 double 浮点型

RGB16 = uint16(round(RGB64×65535)); % 将 double 浮点型转换为 uint16 无符号整型

RGB64 = double(RGB16)/65535; % 将 uint16 无符号整型转换为 double 浮点型

(2) imshow(RGB) 参数是一个 m×n×3 的数组

5.4 二进制图像及其显示

(1) imshow(BW)

在 Matlab 7.0 中,二进制图像是一个逻辑类,仅包括 0 和 1 两个数值。像素 0 显示为黑色,像素 1 显示为白色。

显示时,也可通过NOT(~)命令,对二进制图象进行取反,使数值 0 显示为白色;1 显示为黑色。

例如: imshow(~BW)

(2) 此外,还可以使用一个调色板显示一副二进制图像。如果图形是 uint8 数据类型,则数值 0 显示为调色板的第一个颜色,数值 1 显示为第二个颜色。

例如: imshow(BW,[1 0 0;0 0 1])

5.5 直接从磁盘显示图像

可使用一下命令直接进行图像文件的显示:

imshow filename

其中,filename 为要显示的图像文件的文件名。

如果图像是多帧的,那么 imshow 将仅显示第一帧。但需注意,在使用这种方式时,图像数据没有保存在Matlab 7.0 工作平台。如果希望将将图像装入工作台中,需使用 getimage 函数,从当前的句柄图形图像对象中获取图像数据,命令形式为:

rgb = getimage;

1、图像的变换

① fft2:fft2函数用于数字图像的二维傅立叶变换,如:

i=imread('104_8.tif');

j=fft2(i);

②ifft2::ifft2函数用于数字图像的二维傅立叶反变换,如:

i=imread('104_8.tif');

j=fft2(i);

k=ifft2(j);

2、模拟噪声生成函数和预定义滤波器

① imnoise:用于对图像生成模拟噪声,如:

i=imread('104_8.tif');

j=imnoise(i,'gaussian',0,0.02);%模拟高斯噪声

② fspecial:用于产生预定义滤波器,如:

h=fspecial('sobel');%sobel水平边缘增强滤波器h=fspecial('gaussian');%高斯低通滤波器

h=fspecial('laplacian');%拉普拉斯滤波器h=fspecial('log');%高斯拉普拉斯(LoG)滤波器

h=fspecial('average');%均值滤波器

3、图像的增强

①直方图:imhist函数用于数字图像的直方图显示,如:

i=imread('104_8.tif');

imhist(i);

②直方图均化:histeq函数用于数字图像的直方图均化,如:

i=imread('104_8.tif');

j=histeq(i);

③对比度调整:imadjust函数用于数字图像的对比度调整,如:

i=imread('104_8.tif');

j=imadjust(i,[0.3,0.7],[]);

④对数变换:log函数用于数字图像的对数变换,如:

i=imread('104_8.tif');

j=double(i);

k=log(j);

⑤基于卷积的图像滤波函数:filter2函数用于图像滤波,如:

i=imread('104_8.tif');

h=[1,2,1;0,0,0;-1,-2,-1];

j=filter2(h,i);

⑥线性滤波:利用二维卷积conv2滤波, 如:

i=imread('104_8.tif');

h=[1,1,1;1,1,1;1,1,1];

h=h/9;

j=conv2(i,h);

⑦中值滤波:medfilt2函数用于图像的中值滤波,如:

i=imread('104_8.tif');

j=medfilt2(i);

⑧锐化

(1)利用Sobel算子锐化图像, 如:

i=imread('104_8.tif');

h=[1,2,1;0,0,0;-1,-2,-1];%Sobel算子

j=filter2(h,i);

(2)利用拉氏算子锐化图像, 如:

i=imread('104_8.tif');

j=double(i);

h=[0,1,0;1,-4,0;0,1,0];%拉氏算子

k=conv2(j,h,'same');

m=j-k;

3、图像边缘检测

①sobel算子 如:i=imread('104_8.tif');j = edge(i,'sobel',thresh)

②prewitt算子 如:i=imread('104_8.tif');j = edge(i,'prewitt',thresh)

③roberts算子 如:i=imread('104_8.tif');j = edge(i,'roberts',thresh)

④log算子 如:i=imread('104_8.tif');j = edge(i,'log',thresh)

⑤canny算子 如:i=imread('104_8.tif');j = edge(i,'canny',thresh)

⑥Zero-Cross算子 如:i=imread('104_8.tif');j = edge(i,'zerocross',thresh)

4、形态学图像处理

①膨胀:是在二值化图像中“加长”或“变粗”的操作,函数imdilate执行膨胀运算,如:

a=imread('104_7.tif'); %输入二值图像

b=[0 1 0;1 1 1;0 1 0];

c=imdilate(a,b);

②腐蚀:函数imerode执行腐蚀,如:

a=imread('104_7.tif'); %输入二值图像

b=strel('disk',1);

c=imerode(a,b);

③开运算:先腐蚀后膨胀称为开运算,用imopen来实现,如:

a=imread('104_8.tif');

b=strel('square',2);

c=imopen(a,b);

④闭运算:先膨胀后腐蚀称为闭运算,用imclose来实现,如:

a=imread('104_8.tif');

b=strel('square',2);

c=imclose(a,b);

转自:

下列表格中除了个别函数外,其余函数都是图像处理工具箱提供的关于图像处理的函数,现摘录到此以备查找。

表1 图像显示函数名功能说明函数名功能说明

colorbar颜色条显示montage按矩形剪辑方式显示多帧图像

getimage从坐标系中获取图像数据immovie从多帧索引图像中制作电影

image建立显示图像movie播放电影

subimage在同一图像窗口显示多个图像trueszie调整图像显示大小

imagesc调整数据并显示图像warp显示图像为纹理映射表面

imshow图像显示zoom二维图形放大或缩小

表2 图像文件输入/输出函数名功能说明函数名功能说明

imread图像文件读入load将以mat为扩展名的图像文件调入到内存

imwrite图像写出save将内存变量中图像保存到mat文件中

dicomread读取DICOM图像dicomwrite输出DICOM图像

iminfo查看图形信息

表3 图像像素值及其统计函数名功能说明函数名功能说明

impixel返回选定图像像素颜色值imcontour画图像数据轮廓(等高线,等值线)

improfile图像中沿一个路径的数据值计算imhist求图像数据直方图

mean2求均值corr2求相关系数

std2求标准差

表4 图像分析函数名功能说明函数名功能说明

edge灰度图像边缘检测qtgetblk获得四叉树分解块值

qtecomp执行四叉树分解qtsetblk设置四叉树分解块值

表5 图像增强及平滑函数名功能说明函数名功能说明

imadjust对比度调整medfilt2二维中值滤波器

histeq直方图均衡ordfilt2顺序统计滤波器

imnoise给图像增加噪声wiener2二维自适应除噪滤波器

表6 图像线性滤波及二维线性滤波器设计函数名功能说明函数名功能说明

conv2二维卷积freqz2计算二维频率响应

convmtx2计算二维卷积矩阵fsamp2用频率抽样设计二维FIR滤波器

convn多维卷积ftrans用频率抽样转换二维FIRlbq

filter2二维线性数字滤波器fwind1用一维窗口方法设计二维FIR滤波器

fspecial产生预定义滤波器fwind2用二维窗口方法设计二维FIR滤波器

frespace确定二维频率响应间隔

表7 图像变换函数名功能说明函数名功能说明

fft计算一维快速Fourier变换dct计算离散余弦变换

ifft计算一维FFT的逆变换idct计算离散反余弦变换

fft2计算二维FFTdct2计算2D离散余弦变换

ifft2计算二维逆FFTidct2计算2D反离散余弦变换

fftn计算多维FFTdctmtx计算TCT矩阵

ifftn计算多维逆FFTradon计算Radon变换

fftshift直流分量移到频谱中心

表8 图像领域及操作函数名功能说明函数名功能说明

bestblk选择块处理的块大小colfilt使用列方向函数进行领域运算

blkproc对图像实行不同的块处理im2col重排图像块为矩阵列

col2im重排矩阵列成图像块nlfilter进行一般领域计算

表9 二值图像操作函数名功能说明函数名功能说明

applylut使用查找表进行领域操作bwperim确定二值图像中的目标边界

bwarea计算二值图像中的目标区域bwselect选择二值图像中的目标

bweuler计算二值图像中的欧拉数dilate对二值图像进行膨胀计算

bwfill二值图像背景区域填充erode对二值图像进行寝蚀运算

bwlabel标识二值图像中的连接成分makelut构造查找表(applylut)使用

bwmorph二值图像形态运算

表10 基于区域的图像处理函数名功能说明函数名功能说明

roicolor根据颜色选择要处理的区域roifilt2对要处理区域滤波

roifill在任意区域内平滑差值roipoly选择要处理的多边形区域

表11 图像几何运算函数名功能说明函数名功能说明

imcrop图像剪裁imrotate图像旋转

imresize图像大小调整interp2二维数据差值

表12 图像颜色图操作函数名功能说明函数名功能说明

brighten颜色图像变亮或变暗colormap设置获取图

cmpermute重新排列颜色图中的颜色imapprox由颜色较少的图像近似索引图像

cmunique寻找唯一的颜色图及相应的图像rgbplot绘制RGB颜色图

表13 颜色控件转换函数名功能说明函数名功能说明

hsv2rgb将HSV颜色转化为RGB颜色值mtsc2rgb将NTSC值转换为RGB颜色空间值

rgb2hsv将RGB颜色值转换为HSV颜色值rgb2ntsc将RGB值转换为NTSC颜色空间值
本文标题:matlab图像处理-MATLAB图像句柄学习【转】
本文地址: http://www.61k.com/1084976.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1