MATLAB 仿射变换实现
2018-04-26 本文已影响0人
codingcyx
function img2 = myaffine(img1,A)
%输入3*3矩阵,对应仿射矩阵
[h1,w1,p] = size(img1);
a1=A(1,1);
a2=A(1,2);
a3=A(1,3);
b1=A(2,1);
b2=A(2,2);
b3=A(2,3);
xmax=max(max(max(max(a1*1+a2*1),a1*1+a2*h1),a1*w1+a2*1),a1*w1+a2*h1);
xmin=min(min(min(min(a1*1+a2*1),a1*1+a2*h1),a1*w1+a2*1),a1*w1+a2*h1);
ymax=max(max(max(max(b1*1+b2*1),b1*1+b2*h1),b1*w1+b2*1),b1*w1+b2*h1);
ymin=min(min(min(min(b1*1+b2*1),b1*1+b2*h1),b1*w1+b2*1),b1*w1+b2*h1);
%求出变换后图像的左右范围大小和上下范围大小
deltax = round(xmax-xmin)+1;
deltay = round(ymax-ymin)+1;
%注意如果有平移分量,我们要把它加上
img2=uint8(zeros(deltay+b3, deltax+a3, p));
for x=1:deltax
for y=1:deltay
%要考虑到如果xmin,ymin为负,要把它加上才可以保证能映射到原图像中的对应点。
x1=min(xmin,0)+x;
y1=min(ymin,0)+y;
%注意此处不应包含a3和b3,因为我们已经去掉了a3和b3,在最后才需要加上。
x0=round((b2*x1-a2*y1)/(a1*b2-a2*b1));
y0=round((a1*y1-b1*x1)/(a1*b2-a2*b1));
%要考虑到可能b3和a3是负数,这样的点要排除(对应于平移出界的情况)。
if(x0>0 && x0<=w1 && y0>0 && y0<=h1 && y+b3>0 && x+a3>0)
img2(y+b3,x+a3,:) = img1(y0,x0,:);
end
end
end