MATLAB 仿射变换实现

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

你可能感兴趣的:(MATLAB 仿射变换实现)