Frage

Ich habe ein Bild RGB in MATLAB, und ich möchte durch jedes Pixel in einer Schleife und prüfen, ob es hautfarben (ish) [ich wohl tun wird es in HSV-Raum zu einem späteren Zeitpunkt die Auswirkungen der Beleuchtung usw. negieren]

Weiß jemand, der beste Weg, dies zu tun? MATLAB seltsame Syntax ist verwirrend ich ein wenig!

Im Moment habe ich:

for x = 1:size(I,1)
    for y = 1:size(I,2)
            %Get the value from this x,y coordinate and check the colour.
    end
end

Aber ich denke, das ist schrecklich falsch.

Wie kann man die verschiedenen Teile der Matrix richtig zugreifen?

War es hilfreich?

Lösung

Ed,

Sie müssen nicht in einer Schleife:

>> a  = magic(5)

a =

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9


>> vi = (a > 5) & (a < 10)

vi =

     0     0     0     1     0
     0     0     1     0     0
     0     1     0     0     0
     0     0     0     0     0
     0     0     0     0     1

Sie können sehen, wie diese Aussage für RGB und so erweitert werden könnte. Ich würde eine Funktion machen


Funktion out = isFlesh (in)

%% setzt Fleisch Code Überprüfung hier


Ich vermute, Sie werden eine Reihe von diesen wollen (isCaucasian, isAsian, etc ...) Das Problem sein wird, dass es eine riesige Auswahl an Fleischfarben, so dass Sie für die Nähe überprüfen gehen zu wollen, In den Nachbarn einer ähnlichen Farbpalette.

Dieser Teil des Problems ist einfach, aber das größere Problem ist voller Gefahren.

-Doug

Andere Tipps

Eine Sache im Auge zu behalten ist, dass RGB-Bilder sind 3-D-Matrizen. Die erste "Seite" (d.h. A (:,:, 1) ) ist rot, das zweite ist grün und das dritte blau ist. Manchmal finde ich es einfacher, auf RGB-Matrizen arbeiten, indem sie in N-by-3-Matrizen Umformung, wo alle roten Pixel sind in Spalte 1, die grüne in Spalte 2 und die blauen in der Spalte 3 Dies ist, wie es geht:

A = (a 3-D RGB image);
matSize = size(A);
A = reshape(A,prod(matSize(1:2)),3);
...
% Modify or extract data from reshaped matrix
...
A = reshape(A,matSize);  % Return A to original dimensions

Nicht sicher, ob dies wird Ihnen speziell mit helfen, was Sie tun wollen, aber ich finde es oft nützlich.

Jeder Kanal Schwellwertbildung ist keine sehr robuste Art und Weise Hautfarberkennung zu tun. Eine einfache Lookup-Tabelle funktioniert viel besser. Die Nachschlagtabelle würde einen Wert für jede Farbe aufzuzeichnen, wie wahrscheinlich es ist, die Haut zu sein. Es gibt verschiedene Hautfarbe Datensätze, die Sie solche Werte zu erhalten, verwenden können. Dann können Sie die Farbe des Pixels mit dem Wert in der Tabelle vergleichen und tun, um eine Entscheidung auf der Grundlage einer Schwelle.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top