>> tform1=maketform('affine',t1);
>> vistformfwd(tform1,[0 100], [0 100]); >> t2=[1 0 0; .2 1 0; 0 0 1]; >> tform2=maketform('affine',t2);
>> figure,vistformfwd(tform2,[0 100], [0 100]); >> tscale=[1.5 0 0;0 2 0; 0 0 1]; >> trotation=[cos(pi/4) sin(pi/4) 0 -sin(pi/4) cos(pi/4) 0 0 0 1];
>> tshear=[1 0 0; .2 1 0; 0 0 1]; >> t3=tscale* trotation* tshear; >> tform3=maketform('affine', t3);
>> figure,vistformfwd(tform3, [0 100],[0 100]);
3.2.12 图像空间变换。利用函数checkerboard和imtransform来实现。如图所示,测试板图像的仿射变换:(a)原图像;(b)使用默认内插(双线性)方法的线性等角变换后的图像;(c)使用最近邻内插方法后的图像;(d)指定另一个填充值后的图像;(e)纯平移得到的成效和图a一致;(f)操纵输出空间位置,以便平移可见。请写出实验步骤。
>> f= checkerboard(50); >> s=0.8; >> theta=pi/6;
>> t=[ s*cos(theta) s*sin(theta) 0 -s*sin(theta) s*cos(theta) 0
0 0 1];
>> tform=maketform('affine',t); >> g=imtransform(f,tform); >> figure,imshow(g); >> figure,imshow(f);
>> g2=imtransform(f, tform,'nearest'); >> figure,imshow(g2);
>> g3= imtransform(f,tform,'fillvalue',0.5); >> figure,imshow(g3);
>> t2=[1 0 0;0 1 0;50 50 1]; >> tform2=maketform('affine',t2); >> g4=imtransform(f, tform2); >> figure,imshow(g4);
>> g5=imtransform(f, tform2,'xdata', [1 400], 'ydata', [1 400], 'fillvalue',0.5);
>> figure,imshow(g5);
实验6 图像分割
分割是将一幅图像细分为其组成区域或对象。细分的程度取决于要解决的咨询题。单色图像的分割算法通常基于图像亮度值的两个差不多特性:不连续性和相似性。
6.1 实验原理 6.1.1 点检测
点检测在MATLAB中可用函数imfilter来实现,当掩模的中心位于一个孤立点时,掩模必须最强,而在亮度不变的区域中响应为零。
若T差不多给出,则如下命令可用实现刚才讨论的点检测方法: >> g= abs(imfilter(double(f),w)) > =T
其中f是输入图像,w是一个合适的点检测掩模,g是结果图像。abs操作不同意整数数据,则我们可在滤波操作中使用double(f)来防止过早的截断。
-1 -1 -1 -1 8 -1 -1 -1 -1 上图即是点检查模板。
6.1.2 线检测
下面4个图是对4种线性检测的模板,分不为水平、+45°、垂直和-45°。
-1 2 -1 -1 2 -1 -1 2 -1
-1 -1 2 -1 2 -1 2 -1 -1
-1 -1 -1 2 2 2 -1 -1 -1
2 -1 -1 -1 2 -1 -1 -1 2 令R1、R2、R3、R4代表上图从左到右的掩模的响应,假定这4个掩模将分不被用于图像,若图像上的某个点满足Ri?Rj,j?i,则可讲该点与掩模i的该方向中一条线更可能有关。
6.1.2 使用edge函数的边缘检测
边缘检测最通用的方法是检测亮度值的不连续性,能够使用一阶和二阶导数检测。
一阶导数是利用梯度的有关概念。梯度向量的差不多性质是它指向f在(x, y)处的最大变化率方向。
二阶导数利用拉普拉斯算子来运算,如下式所示:
图像的边缘检测确实是在图像中找到亮度快速变化的地点,其遵循以下2个准则:
找到亮度的一阶导数在幅度上比指定阈值大的地点。 找到亮度的二阶导数有零交叉的地点。
IPT函数edge基于上面谈论的准侧,提供了记得导数估量器,语法为: [g, t]=edge(f, ‘method’, parameters)
其中,f为输入图像,method是下表列出的一种方法,parameters是后面会讲明的另一个参数。g是一个逻辑数组,其值由如下决定:在f检测到的边缘的位置为1,在其他位置为0。参数t可选,它给出edge使用的阈值,以便确定哪个梯度值足够大到能够称为边缘点。
边缘检测器 Sobel Prewitt Roberts 差不多特性 如下图(b)所示。 如下图(c)所示。 如下图(d)所示。 Laplacian of 在使用高期滤波器对f(x,y)滤波之后,通过查找零交叉查找边缘。 Gaussian (LoG) Zero crossings(零交叉) Canny 使用一个自定义的滤波器对f(x,y)滤波之后,通过查找零交叉查找边缘。 通过查找f(x,y)的梯度的最大值来查找边缘。梯度有高斯滤波器的导数来运算。该方法使用两个阈值检测边缘和弱边缘,若它们连接到了强边缘,则输出中只包含弱边缘。因此,这种方法更适合用于检测真正的弱边缘。
Sobel检测器调用语法为: [g, t]=edge(f, ‘sobel’, T, dir)
T为指定的阈值,dir指定检测边缘的方向:’horizontal’、’vertical’或’both’(默认值)。
Prewitt检测器调用语法为: [g, t]=edge(f, ‘prewitt’, T, dir) Roberts检测器调用语法为: [g, t]=edge(f, ‘roberts’, T, dir)
Laplacian of Gaussian (LoG)检测器调用语法为: [g, t]=edge(f, ‘log’, T, sigma) sigma是标准偏差,默认值为2。 零交叉检测器调用语法为: [g, t]=edge(f, ‘zerocross’, T, H) 卷积是使用指定的滤波函数H执行的。 Canny检测器调用语法为:
[g, t]=edge(f, ‘canny’, T, sigma)
其中,T是一个向量,T=[T1,T2];sigma是平滑滤波器的标准偏差,默认为1。
6.1.3 全局阈值处理。
利用函数graythresh运算直方图,找到最大化的阈值,语法为: T=graythresh(f)