MATLAB 仿射變換實現(xiàn)

function img2 = myaffine(img1,A)
%輸入3*3矩陣,對應(yīng)仿射矩陣
[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為負(fù),要把它加上才可以保證能映射到原圖像中的對應(yīng)點。
        x1=min(xmin,0)+x;
        y1=min(ymin,0)+y;
        %注意此處不應(yīng)包含a3和b3,因為我們已經(jīng)去掉了a3和b3,在最后才需要加上。
        x0=round((b2*x1-a2*y1)/(a1*b2-a2*b1)); 
        y0=round((a1*y1-b1*x1)/(a1*b2-a2*b1));
        %要考慮到可能b3和a3是負(fù)數(shù),這樣的點要排除(對應(yīng)于平移出界的情況)。
        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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容