2013-09-12 4 views
2

Я новичок в Matlab и программировании. У меня есть RGB-образ размером [640 780]. Теперь позвольте сказать, что мне нужны только те пиксели, чье красное значение больше 100 и меньшее количество пикселей, которые я конвертирую в 255. Теперь я хотел бы знать, как я могу хранить нужные пиксели в другой матрице, чтобы я мог использовать эти значения напрямую перейдите в исходное изображение RGB для рисования ROI ???Сохранение изображений в разных матрицах в Matlab?

a = 1; b = 1; 
maybe_red = RGB; 
for i = 1:sizeim(1) 
    for j = 1:sizeim(2) 
if RGB(i,j,1) > 100 
     red_trace_x(a) = i; 
     red_trace_y(b) = j; 
     b = b+1; 
    else 
     maybe_red(i,j,:) = 1; 
    end 
end 
a = a+1; 
end 

В настоящее время я храню x и y в отдельных массивах. Но я хотел бы знать, как хранить значения x,y в одной матрице.

спасибо.!

ответ

2

В следующем генерирует маску (логический массив того же размера, что и исходное изображение), где пиксели с красным каналом значением, большим, чем 100 хранятся в 1s и другие пиксели, как 0s:

img= imread('peppers.jpg'); 
mask=img(:,:,1)>100; 

Вы можете использовать маску для индексирования исходного изображения и внести в него изменения с помощью find для определения линейных индексов гр исследование соответствующей для маскировки пикселей со значением 1:

indlin=find(mask); 
img2 = img; 

Вы можете использовать линейные индексы непосредственно, например, для насыщения красного канала:

img2(indlin) = 255; 

или зеленый канал:

n = numel(img)/3; 
img2(indlin+n) = 255; 

Слева направо, исходное изображение, маска, синяя красная и синяя зеленые:

enter image description here

редактировать

Вы можете получить массив подстрочные ix и iy из линейных индексов с

[ix iy]=ind2sub(size(mask),indlin); 
+0

как бы вы извлекали строки n cols из indlin ?? – fastlearner

+0

@Vinoth Я добавил объяснение, как это сделать ... –

1

Как насчет того, если вы просто сохраните индекс элемента?

%% Load a sample image 
RGB = imread('football.jpg'); 

b = 1; 
maybe_red = RGB; 
red = RGB(:,:,1); % Get the red component 

% i will represent the index of the matrix 
for i = 1:length(red(:)) % length(red(:)) = rows*cols 
    if red(i) > 100 
     red_trace(b) = i; 
     b = b+1; 
    else 
     [r,c] = ind2sub(size(red),i); % Convert the index to rows and cols 
     maybe_red(r,c,:) = 1; 
    end 
end 

imshow(maybe_red); 

, но это может быть просто легче сделать

red = RGB(:,:,1); % Get the red component of the image 
[r,c] = find(red>100); 
coord = [r c]; 
+0

длина (красный) 780 теперь в соответствии с упомянутой резолюцией. поэтому цикл идет 780 раз вместо 640 * 780 раз .. ?? но он должен пройти через все строки n col для фильтрации желаемого значения. – fastlearner

+0

Если ваши строки = 640 и cols = 780, для i = 1: длина (красный) будет проходить 640 * 780 раз. Ваш код проходит через первые два измерения. Это намерение или вы намерены пройти через все размеры, то есть 640 * 780 * n? Второе решение является предпочтительным, так как это будет намного быстрее. – kkuilla

+0

Когда я пробовал в matlab, петли идут в 780 раз не более того .. Я сделал точно так же, как вы упомянули выше. но все равно это не работает .. что-то не так, что я делаю .. ?? – fastlearner

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