将一组索引索引到矩阵

Indexing a set of indices to a matrix

我从图像中检索了所有非白色像素:

[ii, jj] = find(BlackOnWhite < 255)

然后我尝试将这些像素坐标索引到矩阵:

image(ii, jj) = 0

但是零没有出现在预期的位置。我怎样才能只在 iijj (即 [ii(1), jj(1)], [ii(2), jj(2)] 等)的对指定的位置放置零?

一个简单的方法是使用 linear indexing。这意味着使用单个索引遍历矩阵中的所有条目(向下,然后穿过)。在你的情况下:

  • 对一个输出使用find。这给出了所需像素的线性索引。
  • 用它来索引矩阵。

所以:

ind = find(BlackOnWhite < 255);
image(ind) = 0;

您甚至可以删除 find 并使用 logical indexing。意思是直接把逻辑比较的结果作为索引:

ind = BlackOnWhite < 255;
image(ind) = 0;

您问题中显示的代码的问题是 iijj 被用作 "subscript indices"。这 selects 所有对 ii 中的任何值和 jj 中的任何值组成,这不是您想要的。

如果您的问题中有下标 iijj,您只需要 select 每个下标的对应值 (而不是所有对),您可以使用 sub2ind 转换为线性索引 :

[ii, jj] = find(BlackOnWhite < 255);
image(sub2ind(size(image), ii, jj)) = 0;

它不起作用,因为 MATLAB 将下标视为网格,这意味着大致 "set all intersection of any of ii and any of jj to zero" 而不是 "set the locations specified by these separate pairs of coordinates to zero".

在某些情况下(但不是这个)您可能需要将一组下标转换为索引,在这种情况下我建议您熟悉 sub2ind

如其他答案中所述,针对您的情况最好的做法是:

image(BlackOnWhite < 255) = 0;