2017-02-21 17 views
-1
for each pixel, do 
     if R>90 & R>G & R>B 
     classify the pixel as **Healthy** 
     else 
     classify the pixel as non-healthy 

Я пытаюсь реализовать алгоритм, который считывает поражения кожи изображения и после извлечения R, G и значения B, он классифицирует поражение в здоровую кожу или не здоровую кожу на основе если условиекак записать это условие if else в MATLAB?

Однако, когда я пытаюсь реализовать его, в цикле for обновляется только нездоровый массив, и здоровый массив скинов остается равным нулю. Я не знаю, как преодолеть этот сбой. Пожалуйста помоги.

hs=zeros(m,n); %initialising healthy skin array 
nhs=0;   %initialising non-healthy skin array 
R=colorSkin(:, :, 1); 
G=colorSkin(:, :, 2); 
B=colorSkin(:, :, 3); 
for i = 1:m 
    for j = 1:n  
     if R>90&R>B&R>G 
      hs(i, j)= colorSkin(i, j); 
     else 
      nhs(i,j)=colorSkin(i,j); 
     end 
    end 
end 
+1

Там нет необходимости в цикле быть. Вы можете написать 'result = R> 90 & R> G & R>B ;' так что в результате изображение здоровой кожи является «истиной», а нездоровая кожа «false» – rahnema1

ответ

0

В качестве альтернативы, векторизация подход:

R=colorSkin(:, :, 1); 
G=colorSkin(:, :, 2); 
B=colorSkin(:, :, 3); 
skin=repmat(R>90 & R>B & R>G,1,1,3); 

hs=colorSkin; 
hs(~skin)=0; 
nhs(skin)=0; 

Этот код должен значительно быстрее, чем цикл

1

При выполнении цикла вы просто проверяете одну и ту же матрицу каждый раз.

Здесь R, G, B все являются двумерной матрицей.

Я думаю, что вы хотите выполнить проверку значений R, G и B каждого пикселя.

Итак, когда вы сделали

if R > 90 & R > B & R > G

Что она делает это проверить, что все элементы R матрицы > 90, которая не может быть верным для большинства случаев.

Так правильная реализация:

if R(i, j) > 90 & R(i, j) > G(i, j) & R(i, j) > B(i, j)

Изменить этот код, и он должен работать нормально. Пожалуйста, сделайте комментарий, если вы хотите получить дополнительные разъяснения.

+0

Это работает! Но есть небольшая ошибка. Я использую цветное изображение размером 447x700x3double. Мои каналы R, G, B - все 384x512. Итак, когда я запускаю цикл for, я получаю сообщение об ошибке: Попытка доступа к R (1,513); индекс за пределами границ, потому что размер (R) = [384,512]. Не здоровый массив кожи обновляется правильно, но здорового массива кожи нет. – Jennifer

+0

@AnastasiaSakshmi инициализирует 'nhs' так же, как и для' hs', или используйте код в другом ответе, чтобы решить вашу проблему. –

+0

Получил! Спасибо. Но я не могу продолжать дальше. Я должен классифицировать не здоровые пиксели кожи в сине-вуаль или не-вуаль, используя следующий алгоритм: для каждого пикселя в выделенной области , если R> 90 и R> B и R> G затем Отметить пиксель как здоровая кожа. else Игнорируйте пиксель и продолжайте. end if end for Set R¯s как среднее значение красного канала для отмеченных отметок здоровой кожи. для каждого пикселя в изображении делать пВ = B/R + G + B R R = R/Rs , если пв ≥ 0,3 и ≤ -194 Rr <-51 затем Классифицировать пиксель, как вуаль остальное Классифицировать пиксель как не-вуаль конец, если конец для – Jennifer