我有一个图像(orig)和一个相应的二进制掩码(maskD),它由垂直条纹/值为零或一的列组成。我试图制作第三个矩阵(streakTemp),它只由图像中那些在掩码中具有1值的列组成。我使用下面的代码,由于某种原因,它给我输出了我想要的列,然后是掩码值为0的零值...所以我的输出具有相同的x长度作为我的输入图像...它应该更短,掩码值为零排除。不知道我做错了什么..有什么想法?谢谢!
streakTemp=[];
for i=1:x
if maskD(1,i)==1
streakTemp(:,i)=orig(:,i);
end
end
imtool(streakTemp);
答案 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>