美文网首页
MATLAB 仿射变换实现

MATLAB 仿射变换实现

作者: codingcyx | 来源:发表于2018-04-26 22:05 被阅读0次
    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 仿射变换实现

          本文链接:https://www.haomeiwen.com/subject/uvcvlftx.html