2015-02-26 4 views
0

Я хочу скопировать конкретную область изображения1 в image2. Для этого я использую следующий код.Копирование цветного изображения в MATLAB

for i=1:m 
    for j=1:n 
     if(OD(i,j)==0) 
      result(i,j,1)=Original(i,j,1); 
      result(i,j,2)=Original(i,j,2); 
      result(i,j,3)=Original(i,j,3); 
     end 
    end 
end 

Это прекрасно и очень хорошо. enter image description here Просто, чтобы сократить время выполнения, я попытался следующий

for i=1:m 
    for j=1:n 
     if(OD(i,j)==0) 
      result(i,j)=Original(i,j); 
     end 
    end 
end 

Это дает некоторые ненужные цвета на результат изображения. Вы можете видеть розовый цвет на этом изображении. enter image description here Кроме того, когда я пытаюсь

result(OD==0)=Original; 

Я получаю следующее сообщение об ошибке.

In an assignment A(:) = B, the number of elements in A and B must be the same. 

Но оба результата и оригинальные изображения одинакового размера. Я не понимаю, почему это происходит. Может кто-нибудь скажет мне, в чем разница между ними и почему выходы такие.

+0

Во втором цикле, почему вы не установили все три измерения в ноль? – kkuilla

+0

Я тебя не понял. – Pawan

+0

Можете ли вы опубликовать вывод 'size (Original)' please? – hbaderts

ответ

1

попробовать

result(OD==0)=Original(OD==0); 

иначе вы пытаетесь скопировать весь Исходное изображение в (суб) области результирующего изображения.

+0

Это не помогает. Это также дает ненужный цвет изображения результата в интересующей области. (Тот же вывод, что и второй цикл в вопросе) – Pawan

+0

Можете ли вы предоставить небольшой набор данных? – Steffen

0

Я думаю, что одно изображение в Matlab имеет 3 пространства: R, G, B с (,, 1) (,, 2) (,, 3). Проблема вас: результат (i, j) = Original (i, j);

0

Причина в том, что вы не установили все цвета (размеры) в ноль.

Почему не vectorise это

[R,C] = find(OD==0); % // Get the coordinates where OD is zero 
result(R,C,:)=Original(R,C,:); % // copy the data over at those coordinates 

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

+----------+------------+ 
| Original | Vectorised | 
+----------+------------+ 
| 3.663 s | 0.246 (s) | 
+----------+------------+ 
+0

Этот код занимает больше времени, чем циклы. – Pawan

+0

@ Saipavan579 Я очень сомневаюсь. Тогда должны быть некоторые другие проблемы с вашим кодом. Надеюсь, ты не поместишь это в петли? Это заменяет оба ваших цикла. – kkuilla

+0

Я не хранил этот код внутри цикла. Я сравнил эти две строки с моим серийным кодом (первый фрагмент в вопросе) – Pawan