2015-08-28 74 views
0

在MATLAB中,我製作一個圓柱體r,並將它移到我想要的位置,即Pos。在MATLAB中,我使用affine2dimwarp,但不幸的是Octave沒有這些功能。八度中的affine2d

有沒有人知道如何在octave中做到這一點,沒有affine2dimwarp

的MATLAB代碼

% get image limits 
limX = size(image,1)/2; 
limY = size(image,2)/2; 

steps = 1; 
% add 30% to the inner diameter to make sure it covers the complete sparse area 
largeradius = 1.5*diaStart/2; 
smallradius = diaStart/2; 

% generate x/y points 
[x,y] = meshgrid(-limX:steps:limX,-limY:steps:limY); 
% calculate the radius values: 
r = sqrt(x.^2 + y.^2); 
    r(r>largeradius) = 0; 
    r(r<smallradius) = 0; 

% Shift translate circle in place 
r = im2bw(r); 
xPos = (Pos(1)-limX); 
yPos = Pos(2)-limY; 
tform = affine2d([1 0 0; 0 1 0; xPos yPos 1]); 

r_trans = imwarp(r,tform,'OutputView',imref2d(size(image))); 

回答

0

它應該是很容易做到。 affine2d不是問題,因爲它是更改數據類型的函數,但不會修改任何內容。

imwarp確定[x y 1] = [u v 1] * T(對於每個像素的仿射變換矩陣)。

所以,如果你知道你要在轉換後的圖像在某些特定位置的像素值,那麼它很容易他們知道

換句話說:你有一個像r(由[u v 1]像素組成,變換tform,你知道,你想知道如何在新的圖像由創建,新的圖像r_trans[x y 1]像素組成的,你知道[x,y,1]值。

基本上,你想獲得r(u,v)每個[u,v,1]=[x y 1]*T^(-1);

x將是1:size(r,1)y=1:size(r,2)

因此計算[u,v,1]=[x y 1]*T^(-1);不是問題。

現在,你想要訪問r(u,v)uv不會是整數,它們將是浮點值。爲了能夠獲得the r`值,您將需要插值。

爲此,您需要使用這段簡單的代碼;

[X,Y]=meshgrid(1:size(r,1),1:size(r,2)); 
value=interp2(X,Y,r,ui,vi,method); %chose method from https://www.gnu.org/software/octave/doc/interpreter/Multi_002ddimensional-Interpolation.html 

r_trans(xi,yi)=value; 

我沒有給你整個代碼,但希望你知道如何去做。