圖像旋轉的原理與實現
一般圖像的旋轉是以圖像的中心為原點,旋轉一定的角度,也就是將圖像上的所有像素都旋轉一個相同的角度。旋轉后圖像的的大小一般會改變,即可以把轉出顯示區域的圖像截去,或者擴大圖像范圍來顯示所有的圖像。圖像的旋轉變換也可以用矩陣變換來表示。設點逆時針旋轉
角后的對應點為
。那么,旋轉前后點
、
的坐標分別是:
寫成矩陣表達式為
其逆運算為
利用上述方法進行圖像旋轉時需要注意如下兩點:
(1)圖像旋轉之前,為了避免信息的丟失,一定要有坐標平移。
(2)圖像旋轉之后,會出現許多空洞點。對這些空洞點必須進行填充處理,否則畫面效果不好,一般也稱這種操作為插值處理。
以上所討論的旋轉是繞坐標軸原點(0,0)進行的。如果圖像旋轉是繞一個指定點(a,b)旋轉,則先要將坐標系平移到該點,再進行旋轉,然后將旋轉后的圖象平移回原來的坐標原點,這實際上是圖像的復合變換。如將一幅圖像繞點(a,b)逆時針旋轉度,首先將原點平移到(a,b),即
然后旋轉
然后再平移回來
附錄:
B=imread('image1.bmp'); %讀取原圖像 [m,n]=size(B); %獲取原圖尺寸w %參數設置 theta = pi/4; %旋轉角度 a = sin(theta); b = cos(theta); T = [cos(theta),sin(theta),; %旋轉矩陣 -sin(theta),cos(theta)]; %建立存儲空間 row=m+round((m)/2); col=n+round((n)/2); rotateima = zeros(row, col); %存儲旋轉后圖像的矩陣 %圖像旋轉 for i=1:m for j=1:n x=ceil(abs((i-round(m/2))*b-(j-round(n/2))*a+round(row/2))); %坐標平移至中心 y=ceil(abs((i-round(m/2))*a+(j-round(n/2))*b+round(col/2))); %坐標平移至中心 rotateima(x,y)=B(i,j); %未插值的圖像 end end nrotateima = uint8(rotateima); imshow(nrotateima); title('未插值的圖像') %圖像插值(近鄰插值法) for i=1:row for j=2:col-1 if(rotateima(i,j) == 0 && rotateima(i,j-1) ~= 0 && rotateima(i,j+1) ~= 0 ) rotateima(i,j) =rotateima(i,j-1) ; end end end %圖像顯示 figure(1); imshow(B) title('原始圖像'); % figure(2); % imshow(nrotateima); % title('未插值的圖像'); figure(3); imshow(rotateima/256); imwrite(rotateima/256, '旋轉后圖像.jpg', 'jpg'); title('旋轉圖');