此示例显示了如何构建一个tform.
表示简单剪切变换的结构,然后将其应用于图像。我们探讨转换如何影响直线和圆圈,然后将其用作探索可用于图像填充的各种选项的车辆imtransform.
和Tformarray
。
在两个方面,一个简单的剪切变换,即映射一对输入坐标[紫外线]
到一对输出坐标[x y]
有形式
在哪里一种
是一个常数。
任何简单的剪切都是仿射变换的特殊情况。您可以轻松验证
产生价值X
和y
你从前两个方程收到。
环境一种
= 0.45,我们构建一个仿射tform.
结构使用maketform.
。
a = 0.45;t = maketform('仿射',[1 0 0;一个1 0;0 0 1]);
我们选择,读取和查看和视图和图像转换。
a = imread('足球.jpg');H1 =数字;imshow(a);标题('原始图像');
我们选择橙色的橙色作为填充值。
橙色= [255 127 0]';
我们准备使用了T.
改变一种
。我们可以打电话imtransform.
如下:
b = imtransform(a,t,'立方','fillvalues',橙色);
但这是浪费的,因为我们将沿三个列和行应用立方插值。(通过我们的纯剪切变换,我们真的需要沿着每一行插入。)改为,我们创建并使用重新取样器沿着行施加三次插值,但只需沿列沿着列使用最近的邻居插值,然后呼叫imtransform.
并显示结果。
r = makeresampler({'立方体'那'最近'},'充满');b = imtransform(a,t,r,'fillvalues',橙子);h2 =数字;imshow(b);标题('剪毛图像');
转换直线网格或圆圈数组tformfwd.
是理解转型的好方法(只要它具有前向和逆函数)。
定义覆盖原始图像的线的网格,并在图像上显示它tformfwd.
将纯剪切应用于网格中的每一行,并在剪切图像上显示结果。
[u,v] = meshgrid(0:64:320,0:64:256);[x,y] = tformfwd(t,u,v);灰色= 0.65 * [1 1];图(H1);抓住上;线(U,V,'颜色',灰色的);线(U',V','颜色',灰色的);
图(H2);抓住上;线(x,y,'颜色',灰色的);线(x',y','颜色',灰色的);
你可以用一系列圈子做同样的事情。
灰色= 0.65 * [1 1];为了U = 0:64:320为了v = 0:64:256 THETA =(0:32)'*(2 * PI / 32);UC = U + 20 * cos(θ);VC = V + 20 * SIN(θ);[XC,YC] = TFORMFWD(T,UC,VC);图(H1);线(UC,VC,'颜色',灰色的);图(H2);线(XC,YC,'颜色',灰色的);结尾结尾
当我们应用剪切转换时,imtransform.
填充在左侧和右侧的橙色三角形,没有数据。那是因为我们指定了一种垫方法'充满'
在呼唤时makeresampler.
。共有五种不同的焊盘方法选择('充满'
那'复制'
那'边界'
那'圆'
, 和'对称'
)。在这里,我们比较前三个。
首先,为了更好地了解如何'充满'
选项工作,使用'xdata'
和'ydata'
选项imtransform.
强制输出图像周围的一些额外空间。
r = makeresampler({'立方体'那'最近'},'充满');bf = imtransform(a,t,r,'xdata',[ - 49 500],'ydata',[ - 49 400],......'fillvalues',橙子);图,imshow(bf);标题('pad方法=''填充'');
现在,尝试'复制'
方法(无需在这种情况下指定填充值)。
r = makeresampler({'立方体'那'最近'},'复制');br = imtransform(a,t,r,'xdata',[ - 49 500],'ydata',[-49 400]);图,imshow(br);标题('pad方法=''复制''');
并试试吧'边界'
方法。
r = makeresampler({'立方体'那'最近'},'边界');bb = imtransform(a,t,r,'xdata',[ - 49 500],'ydata',[ - 49 400],......'fillvalues',橙子);图,imshow(bb);标题('pad方法=''绑定''');
结果'充满'
和'边界'
看起来非常相似,但仔细观察,你会看到边缘更平稳'充满'
。这是因为输入图像用填充值填充,然后在边缘,混合填充和图像值上施加立方插值。相比之下,'边界'
识别输入图像的内部和外部之间的严格边界。落在外面的积分是填补。当它们靠近边缘时,落在内部的点是内插的。近距离看起来可以更清楚地显示这一点。我们选择xdata.
和ydata.
在图像的右下角附近括起角,在输出图像空间中,调整大小'最近'
保持各个像素的外观。
r = makeresampler({'立方体'那'最近'},'充满');cf = imtransform(a,t,r,'xdata',[423 439],'ydata',[245 260],......'fillvalues',橙子);r = makeresampler({'立方体'那'最近'},'边界');cb = imtransform(a,t,r,'xdata',[423 439],'ydata',[245 260],......'fillvalues',橙子);cf = imresize(CF,12,'最近');CB = IMResize(CB,12,'最近');数字;子图(1,2,1);imshow(cf);标题('pad方法=''填充'');子图(1,2,2);imshow(cb);标题('pad方法=''绑定''');
剩下的两种垫方法是'圆'
(每个维度的循环重复)和'对称'
(具有附加镜像的图像的循环重复)。要显示更多的模式,我们将转换重新定义为减少尺度。
thalf = maketform('仿射',[1 0;一个;0 0] / 2);r = makeresampler({'立方体'那'最近'},'圆');BC = imtransform(a,thalf,r,'xdata',[ - 49 500],'ydata',[ - 49 400],......'fillvalues',橙子);图,imshow(BC);标题('pad方法=''圆形''');
r = makeresampler({'立方体'那'最近'},'对称');bs = imtransform(a,thalf,r,'xdata',[ - 49 500],'ydata',[ - 49 400],......'fillvalues',橙子);图,imshow(BS);标题('pad方法=''对称''');