首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >八度音阶中的affine2d

八度音阶中的affine2d
EN

Stack Overflow用户
提问于 2015-08-28 17:31:19
回答 1查看 660关注 0票数 0

在MATLAB中,我做了一个柱面r,然后把它移到我想要的位置,也就是Pos。在MATLAB中,我使用affine2dimwarp,但不幸的是Octave没有这些功能。

有人知道在没有affine2dimwarp的情况下如何在Octave中做到这一点吗

MATLAB代码是

代码语言:javascript
复制
% 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)));
EN

回答 1

Stack Overflow用户

发布于 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)uv将不是整数,它们将是浮点值。为了能够得到ther‘值,你需要插值。

为此,您需要使用这段简单的代码;

代码语言:javascript
复制
[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;

我没有给你完整的代码,但希望你能理解如何去做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32267772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档