matlab中提供了一个专门的函数imtransform(),可以定义参数来实现多种类型的空间变换,包括放射变换(平移,缩放,旋转,剪切),投影变换等
实际就是与矩阵做运算,而这个矩阵就决定了具体操作类型,下图为一些常用的模板
举个例子:
[I, map] = imread('lena_color_512.tif');
Ia = maketform('affine', ...
[cosd(30) -sind(30) 0; sind(30) cosd(30) 0; 0 0 1]'); %创建旋转的参数结构体
Ia = imtransform(I, Ia); %实现图像旋转
Ib = maketform('affine', [5 0 0; 0 10.5 0 ; 0 0 1]'); %创建缩放参数结构体
Ib = imtransform(I, Ib); %实现图像缩放
xform = [1 0 55; 0 1 115; 0 0 1]'; %创建图像参数平移结构体
Ic = maketform('affine', xform);
Ic = imtransform(I, Ic, 'XData', ...
[1 (size(I,2)+xform(3,1))], 'YData', ...
[1 (size(I,1)+xform(3,2))], 'FillValues', 255);
Id = maketform('affine', [1 4 0; 2 1 0; 0 0 1]'); %创建图像整体切变的参数结构体
Id = imtransform(I, Id, 'FillValues', 255);
set(0, 'defaultFigurePosition', [100, 100, 1000, 500]); %修改图像位置的默认设置
set(0, 'defaultFigureColor', [1 1 1]); %修改图形背景颜色的设置
figure(1)
subplot(121), imshow(Ia), axis on;
subplot(122), imshow(Ib), axis on;
figure(2)
subplot(121), imshow(Ic), axis on;
subplot(122), imshow(Id), axis on;
图一:
旋转操作,逆时针旋转30°,参照模板即可实现
这里也提供另一种方法
I = imread('lena_color_512.tif');
imshow(imrotate(I,30,'nearest')) %旋转30°
图三:
平移,右移55,下移115
图四:
整体切变,实际就是水平偏移和竖直偏移的结合
空间变换知道用哪个矩阵来进行操作就很简单了呢!