2017-02-21 245 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值後,將其歸類病變成健康的皮膚或非健康皮膚基於如果條件如何在MATLAB中寫這個if語句的條件語句?

但是,當我嘗試實現它時,只有非健康的皮膚陣列在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 ;'所以在結果圖像中,健康的皮膚是'真實的',非健康的皮膚是'假的' – 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,GB都是二維矩陣。

我想你想要檢查每個像素的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);索引越界,因爲size(R)= [384,512]。 非健康的皮膚陣列得到正確更新,但健康的皮膚陣列不正確。 – Jennifer

+0

@AnastasiaSakshmi以'hs'的相同方式初始化'nhs'或使用其他答案中的代碼來解決您的問題 –

+0

明白了!謝謝。但我無法繼續前進。我必須使用以下算法將非健康皮膚像素分類爲藍色面紗或非面紗陣列: 對於提取區域中的每個像素執行 如果R> 90且R> B並且R> G則 標記像素健康的皮膚。 else 忽略像素並繼續。 end if end for 將Rs設置爲標記爲 健康皮膚的像素的紅色通道值的平均值。 對於圖像中的每個像素執行 NB = B/R + G + B R R = R/RS 如果NB≥0.3和-194≤RR <-51然後 分類像素作爲面紗 別的 分類像素作爲非面紗 結束如果 結束爲 – Jennifer