【问题标题】:Indexing a set of indices to a matrix将一组索引索引到矩阵
【发布时间】:2019-03-15 08:51:47
【问题描述】:
我从图像中检索了所有非白色像素:
[ii, jj] = find(BlackOnWhite < 255)
然后我尝试将这些像素坐标索引到矩阵:
image(ii, jj) = 0
但零不会出现在预期的位置。如何仅在 ii 和 jj(即 [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;
问题中显示的代码的问题是ii 和jj 被用作"subscript indices"。这会选择由ii 中的任何值和jj 中的任何值组成的所有对,这不是您想要的。
如果您的问题中有 ii 和 jj 之类的下标,并且您只需从每个下标(而不是所有对)中选择 相应的值,您可以使用 sub2ind 来转换为线性索引:
[ii, jj] = find(BlackOnWhite < 255);
image(sub2ind(size(image), ii, jj)) = 0;
【解决方案2】:
它不起作用,因为 MATLAB 将下标视为网格,这意味着“将任何ii 和任何jj 的所有交集设置为零”而不是“设置这些单独的坐标对指定的位置为零”。
在某些情况下(但不是这个),您可能需要将一组下标转换为索引,在这种情况下,我建议您熟悉 sub2ind。
正如其他答案中提到的,在您的情况下,最好的办法就是:
image(BlackOnWhite < 255) = 0;