根據矩陣計算:
平移旋轉以後,還需要插值,才能顯示完整的圖像
clear?all;?close?all;?clc;img=imread('lena.bmp');
[h?w]=size(img);?
%平移旋轉參數
a?=?10;?b?=?20;
theta?=?30?/180*pi;?
%?旋轉矩陣
rot=[cos(theta)?-sin(theta)?0;
sin(theta)?cos(theta)?0; 0?01];%?平移矩陣
move?=?[?1?0?a;
0?1?b; 0?0?1];%平移加旋轉
rot?=?rot?*?move;
pix1=[a?b?1]*rot; %?左上點的坐標?
pix2=[a?w+b?1]*rot;?%?右上點的坐標?
pix3=[h+a?b?1]*rot; %?左下點的坐標?
pix4=[h+a?w+b?1]*rot; %?右下點的坐標?
height?=?round(max([abs(pix1(1)-pix4(1))?abs(pix2(1)-pix3(1))]));?%變換後圖像的高度?
width?=?round(?max([abs(pix1(2)-pix4(2))?abs(pix2(2)-pix3(2))]));?%變換後圖像的寬度?
imgn=zeros(height,width);?
delta_y?=?abs(min([pix1(1)?pix2(1)?pix3(1)?pix4(1)]));?
delta_x?=?abs(min([pix1(2)?pix2(2)?pix3(2)?pix4(2)]));?
for?i=1-delta_y:height
for?j=1-delta_x:widthpix=[i?j?1]/rot;?%用變換後圖像的點的坐標去尋找原圖像點的坐標,
float_Y=pix(1)-floor(pix(1));
float_X=pix(2)-floor(pix(2));
if?pix(1)>=1?&&?pix(2)>=1?&&?pix(1)?<=?h?&&?pix(2)?<=?w?
pix_up_left=[floor(pix(1))?floor(pix(2))];?%四個相鄰的點
pix_up_right=[floor(pix(1))?ceil(pix(2))];?
pix_down_left=[ceil(pix(1))?floor(pix(2))];
pix_down_right=[ceil(pix(1))?ceil(pix(2))];?
value_up_left=(1-float_X)*(1-float_Y);
value_up_right=float_X*(1-float_Y);?
value_down_left=(1-float_X)*float_Y;?
value_down_right=float_X*float_Y;?
imgn(i+delta_y,j+delta_x)?=?value_up_left*img(pix_up_left(1),pix_up_left(2))+...
value_up_right*img(pix_up_right(1),pix_up_right(2))+...
value_down_left*img(pix_down_left(1),pix_down_left(2))+...
value_down_right*img(pix_down_right(1),pix_down_right(2));?
end
end?
end?
imshow(uint8(imgn));title('平移旋轉並插值');