MATLAB 完整的仿射變換

function outputIm = backward_geometry(inputIm, A, type)
% inputIm = 輸入的圖像
%       A = 仿射變換的系數(shù)挺尾,一個2x3的矩陣

% 獲取輸入圖像的大小
inputSize = size(inputIm);
if(size(inputIm, 3) == 1)
   inputSize(3) = 1; 
end
h=inputSize(1);
w=inputSize(2);

% 計算輸出圖像的畫布大小
[outputSize, deltaShift] = calcOutputSize(inputSize, A, type);
outputIm=zeros(outputSize(2),outputSize(1));

% expand the previous image
inputImEx=zeros(h+2,w+2,1);
inputImEx(2:h+1,2:w+1,1)=inputIm(:,:,1);
inputImEx(1,2:w+1,1)=inputIm(1,:,1);
inputImEx(2:h+1,1,1)=inputIm(:,1,1);
inputImEx(h+2,2:w+1,1)=inputIm(h,:,1);
inputImEx(2:h+1,w+2,1)=inputIm(:,w,1);
inputImEx(1,1,1)=inputIm(1,1,1);
inputImEx(1,w+2,1)=inputIm(1,w,1);
inputImEx(h+2,1,1)=inputIm(h,1,1);
inputImEx(h+2,w+2,1)=inputIm(h,w,1);

% 根據(jù)確定的輸出畫布大小來進(jìn)行遍歷
for i = 1 : outputSize(1)
    for j = 1 : outputSize(2)
        y = j;
        x = i;
        % 進(jìn)行逆向變換咧虎,計算當(dāng)前點(x,y)在輸入圖像中的坐標(biāo)
        A(3,:)=[0,0,1];
        vec=[x-deltaShift(1);y-deltaShift(2);1];
        vec0 = A\vec;
        x0=vec0(1); y0=vec0(2);
        % 進(jìn)行雙線性插值獲取像素點的值
        if x0>0 && x0<=w && y0>0 && y0<=h
            xf=floor(x0)+1; xc=xf+1;
            yf=floor(y0)+1; yc=yf+1;
            u=x0+1-xf; v=y0+1-yf;
            res=u*v*inputImEx(yc,xc)+u*(1-v)*inputImEx(yf,xc)+...
                    (1-u)*v*inputImEx(yc,xf)+(1-u)*(1-v)*inputImEx(yf,xf);
            outputIm(y,x,1)=round(res);
        end
    end
end
outputIm=uint8(outputIm);
end


function [outputSize, deltaShift] = calcOutputSize(inputSize, A, type)
% type 有兩種牲距,一種是 loose, 一種是crop菱皆,參考imrotate命令的幫助文件
% 需要實現(xiàn)這兩種
% 'crop'
% Make output image B the same size as the input image A, cropping the rotated image to fit
% {'loose'}
% Make output image B large enough to contain the entire rotated image. B is larger than A

% 獲取圖像的行和列的總數(shù)恤浪,其中行方向?qū)?yīng)著y方向,列方向?qū)?yīng)著x方向    
ny = inputSize(1);
nx = inputSize(2);

% 計算四個頂點的齊次坐標(biāo)
inputBoundingBox = [ 1  1 1;...
                    nx  1 1;...
                    nx ny 1;...
                     1 ny 1];
inputBoundingBox = inputBoundingBox';

% 獲取輸入圖像經(jīng)過仿射變換后在輸出圖像中的框
outputBoundingBox = A * inputBoundingBox;

% 找到輸出圖像的緊致的框
xlo = floor(min(outputBoundingBox(1,:)));
xhi =  ceil(max(outputBoundingBox(1,:)));
ylo = floor(min(outputBoundingBox(2,:)));
yhi =  ceil(max(outputBoundingBox(2,:)));

if strcmp(type,'loose')==1
    outputSize(1) = xhi-xlo+1;
    outputSize(2) = yhi-ylo+1;
    deltaShift(1) = -xlo+1;
    deltaShift(2) = -ylo+1;
elseif strcmp(type,'crop')==1
    outputSize(1) = inputSize(2);
    outputSize(2) = inputSize(1);
    deltaShift(1) = -(xlo+xhi-outputSize(1)-1)/2;
    deltaShift(2) = -(ylo+yhi-outputSize(2)-1)/2;
end
end

type為'crop'或者'loose'俏险,最終輸出灰度圖严拒。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市竖独,隨后出現(xiàn)的幾起案子裤唠,更是在濱河造成了極大的恐慌,老刑警劉巖莹痢,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件种蘸,死亡現(xiàn)場離奇詭異,居然都是意外死亡竞膳,警方通過查閱死者的電腦和手機(jī)航瞭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坦辟,“玉大人刊侯,你說我怎么就攤上這事★弊撸” “怎么了滨彻?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵藕届,是天一觀的道長。 經(jīng)常有香客問我亭饵,道長休偶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任辜羊,我火速辦了婚禮椅贱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘只冻。我一直安慰自己庇麦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布喜德。 她就那樣靜靜地躺著山橄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舍悯。 梳的紋絲不亂的頭發(fā)上航棱,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音萌衬,去河邊找鬼饮醇。 笑死,一個胖子當(dāng)著我的面吹牛秕豫,可吹牛的內(nèi)容都是我干的朴艰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼混移,長吁一口氣:“原來是場噩夢啊……” “哼祠墅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起歌径,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤毁嗦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后回铛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狗准,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年茵肃,在試婚紗的時候發(fā)現(xiàn)自己被綠了腔长。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡免姿,死狀恐怖饼酿,靈堂內(nèi)的尸體忽然破棺而出榕酒,到底是詐尸還是另有隱情胚膊,我是刑警寧澤故俐,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站紊婉,受9級特大地震影響药版,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喻犁,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一槽片、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肢础,春花似錦还栓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慨蛙,卻和暖如春辽聊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背期贫。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工跟匆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人通砍。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓玛臂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親封孙。 傳聞我的和親對象是個殘疾皇子垢揩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容