2015-03-10 1 views
0

Я думаю, что я действительно что-то пропустил. У меня есть изображение 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). Тем не менее, я вижу две проблемы здесь - поправьте меня, если я ошибаюсь:

  1. Если мой образ, скажем, 5000 * 5000, и я хочу, чтобы выделить 1M пикселей в нем (законным, так как общее количество составляет 25M), im(index_R, index_C, 1) вернет матрицу 1M * 1M (с некоторыми дубликатами, я думаю), что кажется довольно плохим для производительности. Это?
  2. В моих тестах это работает только с прямоугольными областями. 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 

Если у вас есть какие-либо лучшее решение, не стесняйтесь ответ.

ответ

0

Вы можете избежать петли и использовать простую индексацию следующим образом:

Im(index_R,index_C,1) = 255; 

где присвоить значение пикселя 255 только красный канал. Обратите внимание, что использование image в качестве имени переменной не рекомендуется, так как его функция в Matlab.

Вот пример с использованием демо-изображения:

clear 
clc 

Im = imread('peppers.png'); 

%// Create dummy linear indices. A square in the image here... 
[row,col,ch] = size(Im); 

a = round(row/4:3*row/4); 

LinIndices = sub2ind([row col],a,a); 

[index_R,index_C] = ind2sub([row ,col],LinIndices); 

%// Forget the loop. Assign a pixel vale of 255 to the red channel. 
Im(index_R,index_C,1) = 255; 

imshow(Im) 

Выходные:

enter image description here

Если вы хотите только красные пиксели (чистый насыщенный красный, я не думаю, :) и ничего, установите другие 2 значения каналов до 0:

Im(index_R,index_C,2:3) = 0; 

Предоставление этого:

enter image description here

+0

Если это происходит в цикле, вместо того, чтобы делать «imshow» или «образ» в цикле, попытайтесь создать начальный кадр с «imgHandle = imshow (независимо)» и делает «набор (imgHandle, 'CData', newFrameData) в следующих кадрах. Этот метод не будет продолжать пульсировать окно фигуры спереди, а также быстрее. – user3528438

+0

Спасибо, что спросил, отредактировал мой вопрос. – natario

+0

@ user3528438 Хотелось бы, если бы вы могли мне помочь :) – natario

Смежные вопросы