2015-02-11 5 views
1

У меня есть изображение, которое я открыл в Matlab, используя imshow, и я хочу заменить цвет каждого пикселя на значение (140,50,61) новым цветом (150 , 57,80). Если кто-нибудь мог бы посоветовать, как я могу это сделать.Замените определенный цвет на изображении другим цветом Matlab

ответ

2

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

%// Initialize vectors for old and new pixels tuplets 
oldval = [140,50,61] 
newval = [150,57,80] 

%// Reshape the input array to a 2D array, so that each column would 
%// reprsent one pixel color information. 
B = reshape(permute(A,[3 1 2]),3,[]) 

%// Find out which columns match up with the oldval [3x1] values 
matches = all(bsxfun(@eq,B,oldval(:)),1) 
%// OR matches = matches = ismember(B',oldval(:)','rows') 

%// Replace all those columns with the replicated versions of oldval 
B(:,matches) = repmat(newval(:),1,sum(matches)) 

%// Reshape the 2D array back to the same size as input array 
out = reshape(permute(B,[3 2 1]),size(A)) 

Пример запуска -

>> A 
A(:,:,1) = 
    140 140 140 
    40 140 140 
A(:,:,2) = 
    50 20 50 
    50 50 50 
A(:,:,3) = 
    61 65 61 
    61 61 61 
>> out 
out(:,:,1) = 
    150 140 150 
    40 150 150 
out(:,:,2) = 
    57 20 57 
    50 57 57 
out(:,:,3) = 
    80 65 80 
    61 80 80 
+0

вы можете сказать мне, что заменить 'oldval (:) 'с? старый цвет RGB (140,50,61) – Tak

+1

@shepherd Проверьте изменения? – Divakar

+0

Спасибо :). можно ли написать некоторые комментарии, объясняющие набор строк кода, которые вы написали? :) – Tak

1

bsxfun путь я бы решил. Однако, если вы не знакомы с ним, вы можете извлечь каждый канал из своего изображения, использовать три логических маски для каждого канала и объединить их все с помощью logical AND. Выполнение AND найдет те пиксели вашего изображения, которые ищут эту конкретную тройку RGB.

Таким образом, мы соответствующим образом устанавливаем выходные сигналы каждого канала и восстанавливаем изображение для получения выходного сигнала.

Поэтому, учитывая ваше входное изображение A, можно сделать:

red = A(:,:,1); green = A(:,:,2); blue = A(:,:,3); 
mred = red == 140; mgreen = green == 50; mblue = blue == 61; 
final_mask = mred & mgreen & mblue; 
red(final_mask) = 150; green(final_mask) = 57; blue(final_mask) = 80; 
out = cat(3, red, green, blue); 
Смежные вопросы