【问题标题】:Indexing a set of indices to a matrix将一组索引索引到矩阵
【发布时间】:2019-03-15 08:51:47
【问题描述】:

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

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

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

image(ii, jj) = 0

但零不会出现在预期的位置。如何仅在 iijj(即 [ii(1), jj(1)], [ii(2), jj(2)] 等)的对指定的位置放置零?

【问题讨论】:

标签: matlab matrix mask indices matrix-indexing


【解决方案1】:

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

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

所以:

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

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

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

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

如果您的问题中有 iijj 之类的下标,并且您只需从每个下标(而不是所有对)中选择 相应的值,您可以使用 sub2ind转换为线性索引

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

【讨论】:

    【解决方案2】:

    它不起作用,因为 MATLAB 将下标视为网格,这意味着“将任何ii 和任何jj 的所有交集设置为零”而不是“设置这些单独的坐标对指定的位置为零”。

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

    正如其他答案中提到的,在您的情况下,最好的办法就是:

    image(BlackOnWhite < 255) = 0;
    

    【讨论】:

      猜你喜欢
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 2017-01-31
      • 1970-01-01
      相关资源
      最近更新 更多