主要内容

同时填充和剪切图像

此示例显示了如何构建一个tform.表示简单剪切变换的结构,然后将其应用于图像。我们探讨转换如何影响直线和圆圈,然后将其用作探索可用于图像填充的各种选项的车辆imtransform.Tformarray

步骤1:使用简单的剪切进行转换图像

在两个方面,一个简单的剪切变换,即映射一对输入坐标[紫外线]到一对输出坐标[x y]有形式

X = + 一种 * V.

y = V.

在哪里一种是一个常数。

任何简单的剪切都是仿射变换的特殊情况。您可以轻松验证

[ X y 1 ] = [ V. 1 ] * [ 1 0. 0. 一种 1 0. 0. 0. 1 ]

产生价值Xy你从前两个方程收到。

环境一种= 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);标题('剪毛图像');

图包含轴。具有标题剪切图像的轴包含类型图像的对象。

第2步:探索转换

转换直线网格或圆圈数组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','颜色',灰色的);

图包含轴。具有标题原始图像的轴包含12个类型图像,线路。

图(H2);抓住;线(x,y,'颜色',灰色的);线(x',y','颜色',灰色的);

图包含轴。带有标题剪切图像的轴包含12个类型图像,线。

你可以用一系列圈子做同样的事情。

灰色= 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,'颜色',灰色的);结尾结尾

图包含轴。具有标题原始图像的轴包含42个类型图像,线路。

图包含轴。带有标题剪切图像的轴包含42个类型图像,线路。

第3步:比较“填充”,“复制”和“绑定”焊盘方法

当我们应用剪切转换时,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方法=''复制''');

图包含轴。具有标题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方法=''绑定''');

图包含2个轴。带标题PAD方法的轴1 ='填充'包含类型图像的对象。带标题填充方法的轴2 ='绑定'包含类型图像的对象。

第4步:锻炼“圆形”和“对称”焊盘方法

剩下的两种垫方法是'圆'(每个维度的循环重复)和'对称'(具有附加镜像的图像的循环重复)。要显示更多的模式,我们将转换重新定义为减少尺度。

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方法=''对称''');

图包含轴。具有标题PAD方法=“对称”的轴包含类型图像的对象。