转载地址:http://blog.sina.com.cn/s/blog_6163bdeb0102du23.html
二维空间变换

之前看到matlab做空间变换,一直想看看,趁现在有点时间翻译一下matlab的帮助吧!
综述
1.
2.
TFORM结构体包含了执行变换需要的所有参数。你可以定义很多类型的空间变换,包括放射变换affine transformations(如平移translation,缩放scaling,旋转rotation,剪切shearing)、投影变换projective transformations和自定义的变换custom transformations。
创建结构体的方法有两种:使用maketform或者使用cp2tform。
3.
通过将要变换的图像和TFORM结构体传递给imtransform函数即可实现变换。
例子
Step 1: 导入要变换的图像
% 导入图像
cb = checkerboard;
figure
imshow(cb)
Step 2: 定义空间变换
% 定义变换矩阵
xform = [ 1
Step 3: 创建TFORM结构体
% 创建TFORM结构体
tform_translate = maketform('affine', xform);
Step 4: 执行变换
% 执行变换
[cb_trans xdata ydata]= imtransform(cb, tform_translate);
imtransform函数决定输出图像的像素值是把新位置映射回输入图像的相应位置。在平移变换中,由于图像的大小和旋转角度没有变,所以是一一映射;对于其他类型的变换,如放缩、旋转,此函数将在输入图像上插值计算输出图像的像素值。学过图像处理的这个应该很清楚。
Step 5: 观察输出图像
% 显示变换结果
figure
imshow(cb_trans)
从结果看来,貌似变换没有效果,变换后图像和原图像是一样的。但如果你检查xdata和ydata的数值,就会看到图像的空间坐标已经改变了。原始图像左上角的坐标由(1, 1)变为了(41, 41),右下角由(80, 80)变为了(120, 120),40已经被加到了每个像素的空间坐标上。
>> xdata
xdata =
>> ydata
ydata =
41
而显示结果上没有变化的原因是函数imtransform得到的输出图像足够包含了变换后的图像,但没有包含全部的坐标空间。要看到变换的效果,需要使用imtransform函数的额外输入参数来指定输出图像的大小和能包含输出图像的输出空间。
下面的代码使用了XData和YData两个额外参数来指定能包含输出图像的输出空间,而对于输出空间中不在输出图像上的像素默认为黑色,这可以通过改变imtransform函数的FillValues参数来指定。
% 修正的变换结果
cb_trans2 = imtransform(cb, tform_translate,...
figure,
imshow(cb_trans2)
定义空间变换的方式
使用变换矩阵
如使用3X3的矩阵来指定任何的仿射变换,而对于仿射变换,最后一列必须是0 0 1,所以你指定3X2的矩阵就足够了,在这种情况下,imtransform会自动添加第三列。
下面的表格列举了imtransform可以执行的仿射变换以及相应矩阵的定义方法。
使用对应点
in_points = [11 11;21 11; 21 21];
out_points = [51 51;61 51;61 61];
tform2 = maketform('affine', in_points, out_points);
创建TFORM结构体
执行空间变换
[cb_trans xdata ydata]= imtransform(cb, tform_translate);
指定填充值
对于灰度图像
cb_fill = imtransform(cb, tform_translate,...
Figure
imshow(cb_fill)
得到结果为
对于RGB图像
% 彩色图像处理
rgb = imread('onion.png');
xform = [ 1 0 0
tform_translate = maketform('affine',xform);
cb_rgb = imtransform(rgb, tform_translate,...
figure
imshow(cb_rgb)
结果如下