2014-02-16 26 views
4

假設我有4個角點:(x1,y1); (x2,y2);(x3,y3); (x4,y4)和矩形圖像大小(m,n) 如何顯示圖像,以便在顯示的圖像在所提及的四個點處具有其角點。 換句話說,四個角可以控制圖像旋轉的角度(請記住圖像邊緣可能不平行) 謝謝!在四個角點之間顯示圖像Matlab

回答

2

假設圖像不會被改變,只需要2個點來計算圖像旋轉。一般情況下類似於

angle = atan2(y2-y1, x2-x1)*180/pi; %angle between image and axis (in degrees) 
B = imrotate(A,angle);    %rotation 
5

您需要爲廣義解決方案翹曲圖像。你可以這樣做:

首先,閱讀圖像。

img=imread('cameraman.tif'); 
if size(img,3)==3 
    img=rgb2gray(img); 

指定一組變換後點(在你的情況,(x1,y1) ... (x4,y4)),他們是fixedPoints

movingPoints=[1 1;256 1; 256 256; 1 256] %(x,y) coordinate 
fixedPoints=[25 25;250 12;255 200;30 180]; 

然後,估計轉換。我選擇投影變換。您也可以選擇仿製品。

TFORM = fitgeotrans(movingPoints,fixedPoints,'projective'); 

因爲,你希望圖像去指定的角落,你必須指定輸出視圖。可以通過如下構建參考二維圖像來完成。

R=imref2d(size(img),[1 size(img,2)],[1 size(img,1)]); 

最後,扭曲圖像。

imgTransformed=imwarp(imread('cameraman.tif'),R,TFORM,'OutputView',R); 

顯示圖片。

imshow(imgTransformed,[]); 

你應該有你的形象在指定的點包含的圖像將是原始圖像的大小的角落和框。

2

與@Parag提出的方法非常相似的另一種方法是直接使用MATLAB的圖像轉換函數。
下面是如何:你 首先要考慮的是,如果圖像是一個「統一」的矩形內,並相應地確定初始轉化條件:

udata = [0 1]; 
vdata = [0 1]; 
fill_color = 128; 
org_rect = [0 0;1 0;1 1;0 1]; 

注意,fill_color變量表示只是用於顏色填充不會被轉換圖像覆蓋的畫布部分。然後從原始申請投影變換成表示圖像畫布新的矩形如下:

tform = maketform('projective', org_rect, new_rect); 
[out_im,xdata,ydata] = imtransform(in_im, tform, 'bicubic', 'udata', udata, 'vdata', vdata, 'size', size(in_im), 'fill', fill_color); 

大家可能注意到轉化是雙三次並返回兩個出的圖像(out_im)和所表示的新的座標系通過datadata。如果您只保留輸出圖像,那麼它將與原始座標系統中的輸入圖像具有相同的尺寸(因此它會稍微拉伸)。 爲了顯示圖像正常,你可以使用下面的命令:

imshow(out_im,'XData',xdata,'YData',ydata); 

下面是一個例子。讓我們考慮一下Lena的案例。
original Lena RGB
應用轉換後,我們可以使用如下所示的正確座標顯示。
transformed Lena within the new coordinate system
如果我們決定只顯示輸出圖像而不參考新的座標系,我們會得到如下圖所示的圖像。
transformed Lena without coordinate system
在本例中使用的輸出矩形是:[-1 -2;2 -1;3 3;-3 1]

+0

1。這也是我所做的。 – rayryeng