同时填充和剪切图像
这个例子展示了如何构建一个tform
结构表示一个简单的剪切变换然后应用到一个图像。我们探索如何转换影响直线和圆,然后使用它作为一个工具来探索图像填充,可以使用的各种选项imtransform
和tformarray
。
步骤1:使用简单的剪切变换图像
在两个维度,一个简单的剪切变换映射一对输入坐标(u v)
一对输出坐标(x, y)
的形式
在哪里一个
是一个常数。
任何简单的剪切是一个仿射变换的一个特例。你可以很容易地验证
收益率的值x
和y
你收到前两个方程。
设置一个
= 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,“颜色”、灰色);
图(h2);持有在;线(X, Y,“颜色”、灰色);线(X, Y ',“颜色”、灰色);
你可以做同样的事情与圆的数组。
灰色= 0.65 * (1 1 1);为u = 0:64:320为v = 0:64:256θ=(0:32)*(2 *π/ 32);加州大学= u + 20 * cos(θ);vc = v + 20 * sin(θ);(xc、yc) = tformfwd (T,加州大学,vc);图(h1);线(加州大学、vc、“颜色”、灰色);图(h2);线(xc、yc“颜色”、灰色);结束结束
步骤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);标题('垫方法=“绑定”);
结果与“填满”
和“约束”
看起来非常相似,但是仔细观察,你会发现边缘是光滑的“填满”
。这是因为输入图像与填充的值,然后应用立方插值在边缘,混合填充和形象价值。相比之下,“约束”
承认严格的边界之间的内部和外部的输入图像。点在外面摔倒了。点落在插值,使用复制时在边缘附近。近距离观察有助于显示更清楚。我们选择XData
和YData
支架一个点右下角附近的图像,输出图像空间的大小“最近的”
保持每个像素的外观。
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);标题('垫方法=“绑定”);
步骤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);标题('垫方法=“对称”);