2014-04-23 44 views
2

我有一些代碼需要魚眼圖像並將其轉換爲每個RGB通道中的矩形圖像。我遇到了輸出圖像是方形而不是矩形的問題。 (這意味着圖像失真,水平壓縮。)我試圖將輸出矩陣更改爲更合適的格式,但沒有成功。除此之外,我還發現代碼工作的輸入圖像必須是像500x500一樣的方形。任何想法如何解決這個問題?這是代碼:改變內插RGB圖像的圖像寬高比。正方形到長方形

該代碼的靈感來自Prakash Manandhar「極地/從矩形變換圖像」文件交換在mathworks。

編輯。代碼現在可用。

function imP = FISHCOLOR2(imR) 

rMin=0.1; 
rMax=1; 

[Mr, Nr, Dr] = size(imR); % size of rectangular image 
xRc = (Mr+1)/2; % co-ordinates of the center of the image 
yRc = (Nr+1)/2; 
sx = (Mr-1)/2; % scale factors 
sy = (Nr-1)/2; 

reduced_dim = min(size(imR,1),size(imR,2)); 
imR = imresize(imR,[reduced_dim reduced_dim]); 

M=size(imR,1);N=size(imR,2); 


dr = (rMax - rMin)/(M-1); 
dth = 2*pi/N; 

r=rMin:dr:rMin+(M-1)*dr; 
th=(0:dth:(N-1)*dth)'; 

[r,th]=meshgrid(r,th); 

x=r.*cos(th); 
y=r.*sin(th); 
xR = x*sx + xRc; 
yR = y*sy + yRc; 

for k=1:Dr % colors 
    imP(:,:,k) = interp2(imR(:,:,k), xR, yR);  % add k channel 
end 

imP = imresize(imP,[size(imP,1), size(imP,2)/3]); 

imP = imrotate(imP,270); 

解決

Input image < - 圖片鏈接

Output image < - 圖片鏈接

回答

1

A部分

要刪除正方形輸入圖像的要求,你可能會調整輸入圖像成正方形一個本 -

%%// Resize the input image to make it square 
reduced_dim = min(size(imR,1),size(imR,2)); 
imR = imresize(imR,[reduced_dim reduced_dim]); 

幾點,我想在此提出雖然關於這個圖像調整大小,使其成爲一個方形圖像。這是一種快速和骯髒的方法,並扭曲了非方形圖像的圖像,如果圖像不是太「方形」,則可能不需要圖像。在許多非方形圖像中,您會發現跨越圖像邊界的黑色邊框。如果您可以使用某種圖像處理算法或僅手動使用photoshoping進行刪除,那麼這將是理想選擇。之後,即使圖像不是正方形,imresize也可以被認爲是一個安全選項。

B部

現在,做在您的代碼的結束變平的魚眼圖像, 的主處理之後,它似乎是該圖像具有被旋轉 90度clockwisecounter-clockwise取決於如果魚眼 圖像分別具有對象inwardlyoutwardly

%%// Rotating image 
imP = imrotate(imP,-90); %%// When projected inwardly 
imP = imrotate(imP,-90); %%// When projected outwardly 

注意,扁平化圖像必須具有高度等於 尺寸輸入正方形圖像的的一半,即在圖像的半徑。

因此,最終的輸出圖像必須有行作爲數 - size(imP,2)/2

由於正在拉平魚眼圖像,我假定扁平圖像的寬度 必須是它2*PI倍的高度。所以,我試過 -

imP = imresize(imP,[size(imP,2)/2 pi*size(imP,2)]); 

但結果顯得太平淡了。因此,下一個合乎邏輯的實驗 值看起來像PI倍的高度,即 -

imP = imresize(imP,[size(imP,2)/2 pi*size(imP,2)/2]); 

結果在這種情況下,看起來很不錯。

+0

非常感謝你,這真的很好:) –

+0

@KristianMoesgaard非常有趣的項目,我必須說,我很想張貼一些結果。看** B部分**進行一些編輯。爲什麼不將其作爲文件交換代碼發佈,如果其他人尚未完成? – Divakar

+0

我可能會這樣做。我其實也有興趣將輸入圖像映射爲緯度經度圖像。你有沒有想過如何去做? :) –

1

我不是很在圖像處理MATLAB中的細節問題經驗豐富,但根據關於imP填充機制的確切操作,您可以通過執行以下操作來獲得要查找的內容。變化:

M = size(imR, 1); 
N = size(imR, 2); 

要:

verticalScaleFactor = 0.5; 
M = size(imR, 1) * verticalScaleFactor; 
N = size(imR, 2); 

如果我的預感是正確的,你應該能夠調整該換算係數來獲得圖像恰到好處。但是,它可能會破壞你的代碼。讓我知道它是否不起作用,並編輯您的帖子以充實每部分代碼的內容。然後,我們應該能夠再次嘗試。祝你好運!

+0

謝謝您的回答:) –

1

這是可以工作的代碼。

function imP = FISHCOLOR2(imR) 

rMin=0.1; 
rMax=1; 

[Mr, Nr, Dr] = size(imR); % size of rectangular image 
xRc = (Mr+1)/2; % co-ordinates of the center of the image 
yRc = (Nr+1)/2; 
sx = (Mr-1)/2; % scale factors 
sy = (Nr-1)/2; 

reduced_dim = min(size(imR,1),size(imR,2)); 
imR = imresize(imR,[reduced_dim reduced_dim]); 

M=size(imR,1);N=size(imR,2); 


dr = (rMax - rMin)/(M-1); 
dth = 2*pi/N; 

r=rMin:dr:rMin+(M-1)*dr; 
th=(0:dth:(N-1)*dth)'; 

[r,th]=meshgrid(r,th); 

x=r.*cos(th); 
y=r.*sin(th); 
xR = x*sx + xRc; 
yR = y*sy + yRc; 

for k=1:Dr % colors 
    imP(:,:,k) = interp2(imR(:,:,k), xR, yR);  % add k channel 
end 

imP = imresize(imP,[size(imP,1), size(imP,2)/3]); 

imP1 = imrotate(imP1,270);