我对MATLAB的isosurface函数有疑问。
假设我有一个表示对象A的掩码(bw体积)和一个表示对象B的表面(顶点和面)。 我们知道对象A和对象B是同一事物的不同表示。因此我们想要注册它们。
现在,配准算法从初始猜测T'开始返回某个变换T. 要手动评估初始猜测,请执行以下操作:
[f1,v2] = loadGraphicalTemplate(B);
[f2,v2] = isosurface(mask); % aka object A
v2 = transformPointsForward(InitialGuess,v2);
labels = ( zeros(length(v1),1)'; ones(length(v2),1)' );
showMesh( [f1;f2], [v1;v2], labels );
其中,初始猜测是我手动修改的仿射矩阵,直到两个曲面几乎重叠。此时,注册算法会完成其余的工作。
问题在于,当我将转换应用于点云(从对象B生成,请参阅下面的代码)时,结果没有任何意义!这就像变换矩阵是随机生成的!
%% coordinates of non zero elements
IDX = find(B);
[X,Y,Z] = ind2sub(size(B), IDX);
coords = [X,Y,Z];
%% values of non zero elements
linB = B(:);
vals = linB(IDX);
%% transformation
coords = transformPointsForward(T,coords);
答案 0 :(得分:0)
我发现了什么问题。即必须交换ind2sub的X和Y坐标。
IDX = find(B);
[X,Y,Z] = ind2sub(size(B), IDX);
coords = [Y,X,Z];