在Matlab中改变CT体积体素值

时间:2014-07-14 00:27:20

标签: image matlab image-processing

我试图改变 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它就能完美地工作。

错误出现的任何线索?

2 个答案:

答案 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;

无需循环。