Индексирование набора индексов в матрицу - PullRequest
0 голосов
/ 10 октября 2018

Я получил все небелые пиксели из изображения:

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

Затем я попытался проиндексировать эти координаты пикселей в матрице:

image(ii, jj) = 0

Но нули не появляются вожидаемые места.Как можно поставить нули только в местах, указанных парами из ii и jj (то есть [ii(1), jj(1)], [ii(2), jj(2)] и т. Д.)?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Это не работает, потому что MATLAB рассматривает индексы как сетку, что означает примерно «установить все пересечения любого из ii и любого из jj в ноль» , а не »установитьместоположения, указанные этими отдельными парами координат в ноль ".

В некоторых случаях (но не в этом) вам может потребоваться преобразовать набор индексов в индексы, и в этом случае я предлагаю ознакомиться с sub2ind.

Как уже упоминалось в других ответах, лучшее, что можно сделать в вашем случае, это просто:

image(BlackOnWhite < 255) = 0;
0 голосов
/ 10 октября 2018

Простой способ сделать это - использовать линейное индексирование .Это означает использование единственного индекса, который пересекает все записи в матрице (вниз, затем поперек).В вашем случае:

  • Используйте find с одним выходом.Это дает линейные индексы желаемых пикселей.
  • Используйте это для индексации в матрице.

Итак:

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

Вы даже можете удалить find и используйте логическое индексирование .Это означает, что результат логического сравнения напрямую используется в качестве индекса:

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

Проблема с кодом, показанным в вашем вопросе, заключается в том, что ii и jj используются как " индексы индекса " .Это выбирает все пары , образованные любым значением из ii и любым значением из jj, что не является тем, что вы хотите.

Если у вас есть индексы ii и jjКак и в вашем вопросе, и вам нужно только выбрать соответствующие значения из каждого индекса (вместо всех пар), вы можете использовать sub2ind в для преобразования в линейный индекс :

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