2015-04-17 5 views

ответ

3

Предполагая img как массив входного изображения, это может быть один подход с bsxfun -

oldval = [17,167,243] 
newval = [108,5,15] 

idx = find(all(bsxfun(@eq,img,permute(oldval,[1 3 2])),3)) 
idx_all = bsxfun(@plus,idx(:),[0:2]*numel(img(:,:,1))) 
img(idx_all) = repmat(newval,numel(idx),1) 

Или слегка модифицированный один с использованием logical indexing вместо метода, основанного linear indexing используемого ранее -

mask = all(bsxfun(@eq,img,permute(oldval,[1 3 2])),3) 
img(repmat(mask,1,1,3)) = repmat(newval,sum(mask(:)),1) 
+0

Могли вы скажите мне, как установить oldval? Как если бы мой старый (R, G, B) был (17,167,243)? – Tak

+1

@shepherd Проверьте изменения, пожалуйста. Я пропустил настройку значений раньше. – Divakar

+0

в решении логической индексации он дает эту ошибку «Слишком много входных аргументов» в функции repmat. – Tak

0

не самый элегантное решение: найти индексы матрицы image(:,:, 1) равной 17 (используйте find()), то же самое для image(:,:, 2) равного 167, то (:, :, 3) ... затем определить все индексы, которые находятся в списке всех три (использование ismember()). измените значения этих пикселей в матрицах (:, :, x) на соответствующие запрошенные значения RGB.

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