2017-02-21 4 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 

Ich versuche, einen Algorithmus zu implementieren, die eine Bild Hautläsion liest und nach dem R-, G- und B-Werten zu extrahieren, klassifiziert es die Läsion in gesunde Haut oder nicht-gesunde Haut auf der Basis der wenn BedingungWie schreibe ich dies, wenn sonst Bedingungserklärung in MATLAB?

Wenn ich jedoch versuche, es zu implementieren, wird nur das nicht gesunde Skin-Array innerhalb der for-Schleife aktualisiert und das gesunde Skin-Array bleibt null. Ich weiß nicht, wie ich diesen Fehler überwinden kann. Bitte helfen Sie.

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

Looping keine Notwendigkeit, Schleife Es gibt. Sie können 'result = R> 90 & R> G & R>B ;' so in das Ergebnisbild schreiben, dass gesunde Haut 'wahr' und nicht gesunde Haut 'falsch' ist. – rahnema1

Antwort

0

Als Alternative vektorisiert Ansatz:

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; 

sollten Dieser Code wesentlich schneller sein als

1

Wenn Sie die Schleife ausführen, überprüfen Sie nur die gleiche Matrix jedes Mal.

Hier R, G, B alle sind eine 2-D-Matrix.

Ich denke, dass Sie die Überprüfung für jedes Pixel R, G und B-Werte tun möchten.

Also, wenn Sie

tat

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

Was es tut, ist die Überprüfung, dass alle die Elemente der R Matrix sind > 90, die für die meiste Zeit kann nicht wahr sein.

So ist die korrekte Umsetzung ist:

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

Ändern Sie diesen Code, und es sollte funktionieren. Bitte kommentieren Sie, wenn Sie weitere Erläuterungen wünschen.

+0

Das funktioniert! Aber es gibt einen kleinen Fehler. Ich verwende ein Farbbild der Größe 447x700x3double. Meine R-, G-, B-Kanäle sind alle 384 x 512 doppelt. Also, wenn ich die for-Schleife ausführen, bekomme ich eine Fehlermeldung: Versuch, auf R (1,513) zuzugreifen; Index außerhalb der Grenzen, weil Größe (R) = [384,512]. Das nicht gesunde Skin-Array wird korrekt aktualisiert, das Array mit gesunden Skins jedoch nicht. – Jennifer

+0

@AnastasiaSakshmi initialisiere 'nhs' auf die gleiche Weise wie für' hs' oder benutze den Code in der anderen Antwort, um dein Problem zu lösen –

+0

Bekam es! Vielen Dank. Aber ich kann nicht weitermachen. Ich muss die nicht gesunden Hautpixel unter Verwendung des folgenden Algorithmus in Blau-Schleier- oder Nicht-Schleier-Anordnung klassifizieren: für jedes Pixel in der extrahierten Region do wenn R> 90 und R> B und R> G dann Markiere die Pixel als gesunde Haut. sonst Ignoriere das Pixel und fahre fort. Ende wenn Ende für Stellen Sie R¯s als Mittelwert der roten Kanalwerte für Pixel ein, die mit Healthy Skin markiert sind. für jedes Pixel in dem Bild tun nB = B/R + G + B R R = R/Rs wenn nB ≥ 0,3 und ≤ -194 rR <-51 dann Klassifizieren Pixel als Schleier anderes Klassifizieren Pixel als nicht-Schleier Ende wenn Ende für – Jennifer