在Octave中的affine2d

时间:2015-08-28 09:31:19

标签: matlab octave

在MATLAB中我制作一个圆柱r并将其移动到我想要的位置Pos。在MATLAB中,我使用affine2dimwarp但不幸的是,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)));

1 个答案:

答案 0 :(得分: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;

我没有给你完整的代码,但希望你明白该怎么做。