在MATLAB中我制作一个圆柱r
并将其移动到我想要的位置Pos
。在MATLAB中,我使用affine2d
和imwarp
但不幸的是,Octave没有这些功能。
有人知道如何在没有affine2d
和imwarp
的情况下在八度音中执行此操作吗?
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 :(得分: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)
,u
和v
不是整数,它们将是浮点值。为了能够获得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;
我没有给你完整的代码,但希望你明白该怎么做。