MATLAB:仅当条件为真时才将列添加到空矩阵

时间:2016-01-15 17:01:52

标签: matlab matrix binary mask

enter image description here我有一个图像(orig)和一个相应的二进制掩码(maskD),它由垂直条纹/值为零或一的列组成。我试图制作第三个矩阵(streakTemp),它只由图像中那些在掩码中具有1值的列组成。我使用下面的代码,由于某种原因,它给我输出了我想要的列,然后是掩码值为0的零值...所以我的输出具有相同的x长度作为我的输入图像...它应该更短,掩码值为零排除。不知道我做错了什么..有什么想法?谢谢!

streakTemp=[];
for i=1:x
    if maskD(1,i)==1
        streakTemp(:,i)=orig(:,i); 
    end
end

imtool(streakTemp);

3 个答案:

答案 0 :(得分:1)

我认为这就是你所需要的:

orig  = reshape(1 : 20, 4, 5)
maskD = [1 0 0 1 1; 1 0 0 1 1; 1 0 0 1 1; 1 0 0 1 1]
mask1D = maskD(1, :)
x = 5;

streakTemp=[];
for i=1:x
    if maskD(1,i)==1
        streakTemp(:,i)=orig(:,i); 
    end
end
streakTemp

streakTemp2 = orig(:, logical(mask1D))

输出:

orig =

     1     5     9    13    17
     2     6    10    14    18
     3     7    11    15    19
     4     8    12    16    20


maskD =

     1     0     0     1     1
     1     0     0     1     1
     1     0     0     1     1
     1     0     0     1     1


mask1D =

     1     0     0     1     1


streakTemp =

     1     0     0    13    17
     2     0     0    14    18
     3     0     0    15    19
     4     0     0    16    20


streakTemp2 =

     1    13    17
     2    14    18
     3    15    19
     4    16    20

logical indexing上有更多内容。 请注意,您的maskD根本不必是矩阵;你只需要存储第一行,这就是我使用mask1D的原因。

答案 1 :(得分:1)

您的代码的这个变体应该有效:

streakTemp=[];
j=1;
for i=1:x
   if maskD(1,i)==1
      streakTemp(:,j)=orig(:,i); 
      j=j+1;
   end
end

你遇到的问题是i索引始终对应于原始矩阵列,因此即使不满足掩码条件,它也不会跳过该列。

答案 2 :(得分:1)

你不应该在这里使用循环。直接逻辑索引完全适合您的目的:

maskD

请记住,maskD是一个与原始图片尺寸相同的面具,因此我们只需要访问第一行即可进行检查。简而言之,这会查看orig等于1的所有列,然后使用相应的位置从DB矩阵中进行子采样,以创建一个新矩阵,删除所有不需要的列。 / p>