在MATLAB中,我做了一个柱面r,然后把它移到我想要的位置,也就是Pos。在MATLAB中,我使用affine2d和imwarp,但不幸的是Octave没有这些功能。
有人知道在没有affine2d和imwarp的情况下如何在Octave中做到这一点吗
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)));发布于 2015-08-28 20:54:31
这应该很容易做到。affine2d不是问题,因为它是一个可以更改数据类型的函数,但不会修改任何内容。
imwarp对每个像素执行[x y 1] = [u v 1] * T (T是仿射变换矩阵)。
因此,如果您知道需要转换图像中某些特定位置的像素值,那么就很容易知道它们。
换句话说:你有一个图像r (由[u v 1]像素组成),一个转换tform,你知道你想知道一个新图像是如何由它创建的。新的图像r_trans由[x y 1]像素组成,并且您知道[x,y,1]的值。
基本上,您希望为每个[u,v,1]=[x y 1]*T^(-1);获取r(u,v)。
x将是1:size(r,1)和y=1:size(r,2)。
因此,计算[u,v,1]=[x y 1]*T^(-1);不是问题。
现在,你想访问r(u,v),u和v将不是整数,它们将是浮点值。为了能够得到ther‘值,你需要插值。
为此,您需要使用这段简单的代码;
[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;我没有给你完整的代码,但希望你能理解如何去做。
https://stackoverflow.com/questions/32267772
复制相似问题