我试图改变 Matlab 中的一些体素值。
我使用以下代码:
for p=1:100
Vol(Vol(:,:,p) > 0) = 65535; %altering voxel values in the volume to 65535 if value > 0.
end
不幸的是,我发现所有的值都被改变了,好像条件不起作用,尽管如果我在命令行中立即写Vol(Vol(:,:,1)>0)= 65535
它就能完美地工作。
错误出现的任何线索?
答案 0 :(得分:3)
原因是您没有在卷中正确索引每个切片。当您执行此for
循环时,将会发生Vol
中提供的布尔条件正在修改仅第一个频道。
考虑这个小例子。让我们创建一个3 x 3 x 3的所有1的矩阵。
A = ones(3,3,3)
A(:,:,1) =
1 1 1
1 1 1
1 1 1
A(:,:,2) =
1 1 1
1 1 1
1 1 1
A(:,:,3) =
1 1 1
1 1 1
1 1 1
根据您的条件设置第一个切片全部为65535:
A(A(:,:,1) > 0) = 65535
A(:,:,1) =
65535 65535 65535
65535 65535 65535
65535 65535 65535
A(:,:,2) =
1 1 1
1 1 1
1 1 1
A(:,:,3) =
1 1 1
1 1 1
1 1 1
这肯定会像我们期望的那样有效。现在让我们尝试进入第二个频道:
A(A(:,:,2) > 0) = 65535
A(:,:,1) =
65535 65535 65535
65535 65535 65535
65535 65535 65535
A(:,:,2) =
1 1 1
1 1 1
1 1 1
A(:,:,3) =
1 1 1
1 1 1
1 1 1
哦不!它没有用!它只适用于第一个频道....为什么?原因是因为A(:,:,1)
或任何其他渠道提供了 2D矩阵。如果您提供单个2D矩阵,它只会修改卷的第一个切片。因此,随着循环不断进展,只有第一个通道被修改(如果有的话)。如果要修改第二个通道,则必须创建 3D矩阵,其中第一个切片将具有所有逻辑false
,而第二个切片包含来自{{的布尔掩码1}}。
3D切片的东西可能很复杂,特别是对于初学MATLAB的人。因此,我建议你这样做,以使事情更简单。如果要修改每个切片,请考虑将每个二进制掩码作为临时变量放置,修改该临时变量,然后手动将其分配回每个切片。换句话说:
Vol(:,:,2) > 0
我不想使用for p=1:100
temp = Vol(:,:,p); %//Extract p'th channel
temp(temp > 0) = 65535; %// Find non-zero pixels and set to 65535
Vol(:,:,p) = temp; %// Set back to p'th channel.
end
循环,而是建议使用这个简单的单行程序:
for
这将自动创建一个将Vol(Vol > 0) = 65535;
索引的Boolean
矩阵,它将找到大于0的位置,并将所有这些位置设置为65535.这样就无需任何不必要的Vol
循环。这个单行基本上执行上面for
循环正在做的事情,但速度要快得多......而且我敢于阅读更容易。
答案 1 :(得分:1)
对于你的问题,我会这样做:
Vol(Vol(:,:,1:100) > 0) = 65535;
无需循环。