该示例通过将不同的变换应用于棋盘图像来显示几何变换的许多属性。
二维几何变换是一个映射,其将欧几里德平面中的每个点与欧几里德平面中的另一个点相关联。在这些示例中,几何变换由一个规则定义,该规则讲述了如何将带有笛卡尔坐标(x,y)与笛卡尔坐标(u,v)的另一点映射的点。棋盘模式有助于可视化输入图像平面中的坐标网格和每个变换引入的失真类型。
棋盘
生成具有矩形瓦片和四个独特角的图像,这使得可以轻松看看棋盘图像如何被几何变换变形。
运行此示例后,尝试更改图像我
到你最喜欢的形象。
sqsize = 60;i =棋盘(SQSIZE,4,4);nrows = size(i,1);ncols =尺寸(i,2);填充= 0.3;imshow(i)标题('原来的')
非脱模相似性变换可以包括旋转,缩放和转换。形状和角度被保留。平行线保持平行。直线保持直线。
对于非反射相似性,
T
是一个3×3矩阵,取决于4个参数。
尝试改变这4个参数。规模= 1.2;%比例因子角度= 40 * pi / 180;%旋转角tx = 0;% x翻译ty = 0;% y翻译sc =规模* cos(角);党卫军=规模* sin(角);T = [sc -ss 0;ss sc 0;tx泰1];
由于非反射相似之处是仿射变换的子集,因此创建一个affine2d
对象使用:
t_nonsim = acfine2d(t);i_nonreflective_simarility = imwarp(i,t_nonsim,“FillValues”、填);imshow (I_nonreflective_similarity);标题('非反射相似之处')
如果你改变其中一个tx
或者泰
对于非零值,您会注意到它对输出图像没有影响。如果要查看与转换相对应的坐标,包括翻译,包括空间引用信息:
[i_nonreflective_similarity,ri] = imwarp(i,t_nonsim,“FillValues”、填);imshow (I_nonreflective_similarity RI)轴在标题('非反射相似性(空间引用)')
请注意,传递输出空间引用对象国际扶轮
从imwarp.
揭示了翻译。控件中的“OutputView”名称-值对指定想要查看的输出图像的哪一部分imwarp.
功能。
在相似变换中,相似三角形映射到相似三角形。非反射相似变换是相似变换的一个子集。
对于相似性,等式与非反射相似度相同:
T
是一个3×3矩阵,取决于4个参数加上可选的反射。
%尝试改变这些参数。Scale = 1.5;%比例因子角度= 10 * pi / 180;%旋转角tx = 0;% x翻译ty = 0;% y翻译a = -1;% -1 ->反射,1 ->无反射sc =规模* cos(角);党卫军=规模* sin(角);T = [sc -ss 0;一个* * ss sc 0;tx泰1];
由于相似性是仿射变换的子集,因此创建一个affine2d
对象使用:
t_sim = acfine2d(t);
与上面的翻译示例一样,检索输出空间引用对象国际扶轮
来自imwarp.
功能和通过国际扶轮
来imshow.
露出倒影。
[I_similarity, RI] = imwarp (t_sim,我“FillValues”、填);imshow (I_similarity RI)轴在标题('相似')
在仿射变换中,x维和y维可以独立缩放或剪切,可以有平移、反射和/或旋转。平行线保持平行。直线保持直线。相似性是仿射变换的子集。
对于仿射变换,方程与相似和非反射相似相同:
T
是3 × 3矩阵,其中第一列和第二列的所有6个元素都可以是不同的。第三列必须是[0;0;1]。
尝试改变T的定义。t = [1 0.3 0;1 1 0;0 0 1];t_aff = actifine2d(t);i_affine = imwarp(i,t_aff,“FillValues”、填);imshow(i_affine)标题('仿射')
在投影转换中,四边形地图到四边形。直线保持直线但平行线不一定保持平行。仿射变换是投影转换的一个子集。
对于投影转换:
T是一个3 × 3矩阵,其中9个元素都是不同的。
上述矩阵方程相当于这两个表达式:
尝试改变任何九个要素T
.
t = [1 0 0.002;1 1 0.0002;0 0 1];t_proj = projective2d(t);i_projective = imwarp(i,t_proj,“FillValues”、填);imshow (I_projective)标题('投影')
在分段线性变换中,仿射变换分别应用于图像的各个区域。在本例中,棋盘的左上、右上和左下点保持不变,但图像右下的三角形区域被拉伸,因此转换后的图像右下角比原始坐标远了50%,比原始坐标低20%。
移动点= [0 0;0 nrows;ncols 0;ncols nrows;];固定点= [0 0;0 nrows;ncols 0;ncols * 1.5 nrows * 1.2];t_piecewise_linear = fitgeokotrans(移动点,固定点,“pwl”);I_piecewise_linear = imwarp (t_piecewise_linear,我“FillValues”、填);imshow(i_piecewise_linear)标题('分段线性')
此示例和以下两个示例示出了如何创建一个显式映射,以将常规网格(xi,yi)中的每个点关联,其中包含不同的点(UI,VI)。此映射存储在a中geometricTranform2d
对象,由imwarp.
转换图像。
在这种正弦变换中,每个像素的X坐标不变。每行像素的Y坐标在正弦图案之后向上或向下移动。
a = ncols / 12;%尝试改变正弦曲线的幅度ifcn = @ (xy) [xy (: 1), xy(:, 2) +一个*罪(2 *π* xy (: 1) / nrows)];tform = geometricTransform2d (ifcn);I_sinusoid = imwarp (tform,我“FillValues”、填);imshow (I_sinusoid);标题(正弦曲线的)
桶形失真从其中心径向向外渗透图像。畸变从中心更远,导致凸面。
首先,定义一个函数,将像素索引映射到到中心的距离。使用meshgrid.
功能要创建每个像素的x坐标和y坐标的阵列,其中左上角的原点在图像的左上角。
[xi,yi] = meshgrid(1:ncols,1:nrows);
将原点移动到图像的中心。然后,将笛卡尔坐标的x和y坐标转换为柱面角(θ
)及半径(r
)使用的坐标Cart2pol.
功能。r
从中心像素的距离增加线性变化。
xt = xi - ncols / 2;yt = yi - nrows / 2;[Theta,R] = Cart2pol(XT,YT);
定义的振幅,一个
,立方体术语。此参数可调。然后,添加三次术语r
这r
随着距中心像素的距离而变化为非线性。
= 1;%尝试改变立方术语的幅度。rmax = max(r(:));s1 = r + r。^ 3 *(a / rmax。^ 2);
转换回笛卡尔坐标系。将原点移回图像的右上角。
[ut,vt] = pol2cart(theta,s1);UI = UT + NCols / 2;vi = vt + nrows / 2;
存储(xi.
,义
)和(用户界面
,6
)geometricTranform2d
目的。用imwarp.
根据像素映射转换图像。
ifcn = @(c)[ui(:) vi(:)];tform = geometricTransform2d (ifcn);i_barrel = imwarp(i,tform,“FillValues”、填);imshow (I_barrel)标题('桶')
针垫失真是桶变形的逆,因为立方术语具有负幅度。失真仍然远远进一步远离中心,但失真看起来像凹面。
你可以以相同的方式开始θ
和r
值为桶转换。定义一个三次项的振幅b。此参数可调。然后,减去一个立方项r
这r
随着距中心像素的距离而变化为非线性。
b = 0.4;%尝试改变立方术语的幅度。S = r - r.^3*(b/rmax.^2);
转换回笛卡尔坐标系。将原点移回图像的右上角。
[ut,vt] = pol2cart(theta,s);UI = UT + NCols / 2;vi = vt + nrows / 2;
存储(xi.
,义
)和(用户界面
,6
)geometricTranform2d
目的。用imwarp.
根据像素映射转换图像。
ifcn = @(c)[ui(:) vi(:)];tform = geometricTransform2d (ifcn);i_pin = imwarp(i,tform,“FillValues”、填);imshow(i_pin)标题('针垫')
图形子图(3,3,1),imshow(i),标题('原来的')子图(3,3,2),imshow(i_nonreflective_similarity),标题('非反射相似之处')子图(3,3,3),imshow(i_similarity),标题('相似')子图(3,3,4),imshow(i_affine),标题('仿射')子图(3,3,5),imshow(i_projective),标题('投影')子图(3,3,6),imshow(i_piecewise_linear),标题('分段线性')子图(3,3,7),imshow(i_sinusoid),标题(正弦曲线的)子图(3,3,8),imshow(i_barrel),标题('桶')子图(3,3,9),imshow(i_pin),标题('针垫')
注意子图
改变显示的图像的比例。
affine2d
|localweightedmeantransformation2d.
|PiewiselinearTransformation2d.
|polynomialTransformation2d.
|Projective2d.