图像处理之图像基本变化(平移、缩放、旋转)(Octave实现)

在模式识别及计算机视觉中,要经常进行图像的变化。

例如:在识别手写数字中,我们可能在广泛应用中要求所有的图片都是20*20这么好的规格。所以,我们就需要进行缩放来达到目的。

今天来总结下学到的图像的基本变换。

首先我们计 (w,v) 为源图像的像素点位置, (x,y) 为目标像素点的位置。我们当前有一个变化因子记为 T ,这三者之前存在着这样的映射关系:

(x,y,1)=(w,v,1)T(0)

T 是一个 3×3 的矩阵
T=100010001(1)

相信用过java&android中图像变化的对Matrix这个对象有所了解。想再了解下可以看这位博主写的博客,非常详细!
http://www.cnblogs.com/qiengo/archive/2012/06/30/2570874.html

这里我介绍octave以此来实现图像变化的方法。

我们以尺度变化为例

变换名称 仿射矩阵 坐标公式
恒等变换 100010001 x=wy=v
尺度变换 Cx000Cy0001 x=Cxwy=Cyv
旋转变换 cosθsinθ0sinθcosθ0001 x=wcosθvsinθy=vsinθ+cosθ
平移变换 10tx01ty001 x=w+txy=v+ty
偏移变换 1sv0sh10001 x=wsv+vy=wsh+v

实际上可以按照两种方式使用上表格:
- 前向映射
按照上述0式直接进行计算,不过存在一个问题:输入图像中的两个和多个像素可被映射到同一个位置;还可能产生某些像素根本没有赋值的情况
- 反响映射
定义:扫描输出像素的位置,并在每一个位置 (x,y) 使用 (w,v)=T1(x,y) 计算输入图像的相应位置,然后内插法
以下为代码实现大小变化函数

function [Image] = scale (img, scal)
T = [1,0,0;0,1,0;0,0,1];
tT = T.*scal;
tT(3,3) = 1;
flag = sign(scal);
[x,y,z] = size(img);
tx = ceil(x*scal);
%ceil为向上取整函数
ty = ceil(y*scal);
Image = zeros(tx,ty);
for i=1:tx
  for j=1:ty
    temp = ceil((tT^-1)*[i;j;1]);
    Image(i,j) = img(temp(1),temp(2));
end;
end;

endfunction

结果图片不太明显,不过,可以看红框,变化成功,图像基本没有失真。
图像处理之图像基本变化(平移、缩放、旋转)(Octave实现)_第1张图片

你可能感兴趣的:(图像处理)