主要内容

同时填充和剪切图像

这个例子展示了如何构建一个tform结构表示一个简单的剪切变换然后应用到一个图像。我们探索如何转换影响直线和圆,然后使用它作为一个工具来探索图像填充,可以使用的各种选项imtransformtformarray

步骤1:使用简单的剪切变换图像

在两个维度,一个简单的剪切变换映射一对输入坐标(u v)一对输出坐标(x, y)的形式

x = u + 一个 * v

y = v

在哪里一个是一个常数。

任何简单的剪切是一个仿射变换的一个特例。你可以很容易地验证

( x y 1 ] = ( u v 1 ] * ( 1 0 0 一个 1 0 0 0 1 ]

收益率的值xy你收到前两个方程。

设置一个= 0.45,我们构造一个仿射tform结构使用maketform

一个= 0.45;T = maketform (仿射的,(1 0 0;1 0;0 0 1);

我们选择,阅读,和视图和图像变换。

一个= imread (“football.jpg”);h1 =图;imshow(一个);标题(原始图像的);

图包含一个坐标轴对象。标题为原始图像的坐标轴对象包含一个类型的对象的形象。

我们选择橙色作为我们填补价值的一个影子。

橙色= (255 127 0)';

我们已经准备好使用T转换一个。我们可以叫imtransform如下:

B = imtransform (T“立方”,“FillValues”,橙色);

但这是浪费的,因为我们将应用立方插值两列和行。(与我们的纯剪切变换,我们真的只需要插入在每一行)。相反,我们创建和使用一个重新取样,应用三次插值沿行只是沿着列使用最近邻插值,然后调用imtransform并显示结果。

R = makeresampler ({“立方”,“最近的”},“填满”);B = imtransform (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 1);图(h1);持有;线(U, V,“颜色”、灰色);线(U, V,“颜色”、灰色);

图包含一个坐标轴对象。坐标轴对象与原始图像标题包含12图像类型的对象,线。

图(h2);持有;线(X, Y,“颜色”、灰色);线(X, Y ',“颜色”、灰色);

图包含一个坐标轴对象。坐标轴对象与标题剪切图像包含12图像类型的对象,线。

你可以做同样的事情与圆的数组。

灰色= 0.65 * (1 1 1);u = 0:64:320v = 0:64:256θ=(0:32)*(2 *π/ 32);加州大学= u + 20 * cos(θ);vc = v + 20 * sin(θ);(xc、yc) = tformfwd (T,加州大学,vc);图(h1);线(加州大学、vc、“颜色”、灰色);图(h2);线(xc、yc“颜色”、灰色);结束结束

图包含一个坐标轴对象。坐标轴对象与标题原始图像包含42个图片类型的对象,线。

图包含一个坐标轴对象。坐标轴对象与标题剪切图像包含42图像类型的对象,线。

步骤3:比较“填满”,“复制”,和“绑定”板的方法

当我们应用剪切变换,imtransform填充橙色三角形的左和右,没有数据。这是因为我们指定一个垫的方法“填满”当调用makeresampler。总共有五个不同的垫方法选择(“填满”,“复制”,“约束”,“圆”,“对称”)。在这里,我们比较前三。

首先,为了更好地观察“填满”选择工作,可以使用“XData”“YData”选项imtransform迫使一些额外的空间在输出图像。

R = makeresampler ({“立方”,“最近的”},“填满”);男朋友= imtransform (T, R,“XData”(-49 500),“YData”(-49 400),“FillValues”、橙);图中,imshow (Bf);标题('垫方法=“填满”);

图包含一个坐标轴对象。坐标轴对象与标题垫方法=“填补”包含一个类型的对象的形象。

现在,试着“复制”方法(在这种情况下不需要指定填充的值)。

R = makeresampler ({“立方”,“最近的”},“复制”);Br = imtransform (T, R,“XData”(-49 500),“YData”400年[-49]);图中,imshow (Br);标题('垫方法=“复制”);

图包含一个坐标轴对象。坐标轴对象与标题垫方法=“复制”包含一个类型的对象的形象。

并试着“约束”方法。

R = makeresampler ({“立方”,“最近的”},“约束”);Bb = imtransform (T, R,“XData”(-49 500),“YData”(-49 400),“FillValues”、橙);图中,imshow (Bb);标题('垫方法=“绑定”);

图包含一个坐标轴对象。坐标轴对象与标题垫方法=“绑定”包含一个类型的对象的形象。

结果与“填满”“约束”看起来非常相似,但是仔细观察,你会发现边缘是光滑的“填满”。这是因为输入图像与填充的值,然后应用立方插值在边缘,混合填充和形象价值。相比之下,“约束”承认严格的边界之间的内部和外部的输入图像。点在外面摔倒了。点落在插值,使用复制时在边缘附近。近距离观察有助于显示更清楚。我们选择XDataYData支架一个点右下角附近的图像,输出图像空间的大小“最近的”保持每个像素的外观。

R = makeresampler ({“立方”,“最近的”},“填满”);Cf = imtransform (T, R,“XData”(423 439),“YData”(245 260),“FillValues”、橙);R = makeresampler ({“立方”,“最近的”},“约束”);Cb = imtransform (T, R,“XData”(423 439),“YData”(245 260),“FillValues”、橙);Cf = imresize (Cf 12“最近的”);Cb = imresize (Cb 12“最近的”);图;次要情节(1、2、1);imshow (Cf);标题('垫方法=“填满”);次要情节(1、2、2);imshow (Cb);标题('垫方法=“绑定”);

图包含2轴对象。坐标轴对象1标题垫方法=“填补”包含一个类型的对象的形象。坐标轴对象2标题垫方法=“绑定”包含一个类型的对象的形象。

步骤4:行使“圆”和“对称”垫的方法

剩下的两个方法“圆”(在每个维度循环重复)“对称”(循环重复图像的一个附加的镜像)。显示更多的模式出现,我们重新定义转换削减规模的一半。

Thalf = maketform (仿射的,(1 0;1;0 0)/ 2);R = makeresampler ({“立方”,“最近的”},“圆”);公元前= imtransform (Thalf, R,“XData”(-49 500),“YData”(-49 400),“FillValues”、橙);图中,imshow (Bc);标题('垫方法=“循环”);

图包含一个坐标轴对象。坐标轴对象与标题垫方法=“圆形”包含一个类型的对象的形象。

R = makeresampler ({“立方”,“最近的”},“对称”);b = imtransform (Thalf, R,“XData”(-49 500),“YData”(-49 400),“FillValues”、橙);图中,imshow (Bs);标题('垫方法=“对称”);

图包含一个坐标轴对象。坐标轴对象与标题垫方法=“对称”包含一个类型的对象的形象。