Я думаю, что я действительно что-то пропустил. У меня есть изображение RGB image
как матрица M*N*3
. Я обнаружил некоторые области на этом изображении, которые я хочу стать, скажем, чистым насыщенным красным. Мои регионы от bwconncomp
плюс другие вещи; Я хранятся значения строк и столбцов в двух векторах:Обновить значения изображения RGB из индекса строки/столбца
[index_R, index_C] = ind2sub(*stuff*);
Так length(index_R) = length(index_C) < M*N
равно числу пикселей, принадлежащих к моей области, что я хочу стать красным. Как обновить значения в image
с использованием пиксельных индексов?
Единственное, что я мог бы прийти с это:
for i = 1:length(index_R)
image(index_R(i), index_C(i)) = [255 0 0];
end
, который я даже не испытываю. Это верно? Это единственная, более короткая, более элегантная формула?
В ответ на @Benoit «s ответ
Как предложил я попытался назвать image(index_R, index_C, 1)
. Тем не менее, я вижу две проблемы здесь - поправьте меня, если я ошибаюсь:
- Если мой образ, скажем, 5000 * 5000, и я хочу, чтобы выделить 1M пикселей в нем (законным, так как общее количество составляет 25M),
im(index_R, index_C, 1)
вернет матрицу 1M * 1M (с некоторыми дубликатами, я думаю), что кажется довольно плохим для производительности. Это? - В моих тестах это работает только с прямоугольными областями. I.e., если у вас есть круг, это выделит внешний квадрат.
Поэтому у меня возникает новый вопрос: я получаю index_R, index_C
от ind2sub
. Должен ли я использовать линейные индексы? Как? Это может быть способ выделить только пиксель, который мне нужен. Заранее спасибо.
Вещи, которые я пробовал
Я попытался im(linear_indices, 1) = 255
, но я получаю
Maximum variable size allowed by the program is exceeded.
Попытка разбить его, скажем, im(linear_indices(1:length(linear_indices)/2), 1) = 255
, я выхожу из памяти. Действительно застрял.
Я также пробовал im(linear_indices) = 255
, и он отлично работает (быстро и освещает только то, что мне нужно). Но он работает только на красном канале. Как я могу получить синий и зеленый, так как im(linear_indices, 2)
и im(linear_indices, 3)
дают максимальную ошибку размера переменной?
Мое окончательное решение
Учитывая, что линейные индексы должны также охватывать второй и третий каналы, я придумал
im(linear_indices) = 255 %Red
im(linear_indices+M*N) = 0 %green
im(linear_indices+2*M*N) = 0 %blue
Если у вас есть какие-либо лучшее решение, не стесняйтесь ответ.
Если это происходит в цикле, вместо того, чтобы делать «imshow» или «образ» в цикле, попытайтесь создать начальный кадр с «imgHandle = imshow (независимо)» и делает «набор (imgHandle, 'CData', newFrameData) в следующих кадрах. Этот метод не будет продолжать пульсировать окно фигуры спереди, а также быстрее. – user3528438
Спасибо, что спросил, отредактировал мой вопрос. – natario
@ user3528438 Хотелось бы, если бы вы могли мне помочь :) – natario