Wie kann ich Schatten aus einem Bild entfernen?


17

Ich habe dieses Bild

Bildbeschreibung hier eingeben

Ich möchte den Schatten vom Bild entfernen. Ich kenne viele verschiedene Methoden, wie zum Beispiel bestimmte morphologische Operationen, um Schatten zu entfernen:

Ich habe diese Maske für das gleiche Bild erstellt

Bildbeschreibung hier eingeben

Gibt es noch andere Methoden, mit denen ich versuchen könnte, diese von mir erstellte Maske zu verwenden?

EDIT :

Eingabebild und Maske in der gewünschten Größe:

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

EDIT 2: Ich habe ein 1D-invariantes Bild erzeugt, aber es ist nicht perfekt

  I = imread('shadow.jpg');
       J = im2double(I);

      R = J(:,:,1);
      G = J(:,:,2);
      B = J(:,:,3);

     [len,wid] = size(R);

     % Generation of 2-D Log Chromaticity Image.
     for i = 1:len
        for j = 1:wid
           if ((R(i,j)*G(i,j)*B(i,j))~= 0)
              c1(i,j) = R(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
              c2(i,j) = G(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
              c3(i,j) = B(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
           else
              c1(i,j) = 1;
              c2(i,j) = 1;
              c3(i,j) = 1;
        end
    end
end

rho1 = mat2gray(log(c1));
rho2 = mat2gray(log(c2));
rho3 = mat2gray(log(c3));

X1 = mat2gray(rho1*1/(sqrt(2)) - rho2*1/(sqrt(2)));                                         %(1/sqrt(2); -1/sqrt(2); 0)
X2 = mat2gray(rho1*1/(sqrt(6)) + rho2*1/(sqrt(6)) - rho3*2/(sqrt(6)));   %(1/sqrt(6); 1/sqrt(6); -2/sqrt(6))

theta = 120;

InvariantImage = cos(theta*pi/180)*X1 + sin(theta*pi/180)*X2;
imagesc(InvariantImage); colormap(gray)

Bildbeschreibung hier eingeben

Kannst du nicht verstehen, was ich hier falsch mache?


Gute Frage! Haben Sie versucht, die Helligkeit im maskierten Bereich zu erhöhen?
Dima

5
Überprüfen Sie meine Antwort hier: dsp.stackexchange.com/questions/454/…
Datageist

Einfach ausgedrückt ist das Reflexionsvermögen der beiden unterschiedlichen Oberflächen unterschiedlich, sowohl in absoluten Zahlen als auch wie sie direktes und indirektes Licht reflektieren. Sie reagieren also unterschiedlich auf Schatten und benötigen unterschiedliche Formeln zum Löschen des Schattens.
Daniel R Hicks

Es gibt andere Methoden wie die Kantendetektion mit der zweiten Ableitung unter Verwendung des Gradienten und des Laplace-Operators.

Antworten:


11

Es gibt Dutzende von Veröffentlichungen, die sich mit der Schattenerkennung, der Erzeugung von Schattenmasken und sogar mit der Entfernung von Schatten befassen - wie die in den vorherigen Beiträgen erwähnten. Ich könnte bei Bedarf einige zur Liste hinzufügen. Das Problem ist jedoch meiner Meinung nach noch lange nicht gelöst. Für einen schnellen Start mit einer Schattenmaske schlage ich die beiden folgenden Ansätze vor (und habe sie in der Vergangenheit ausprobiert). Sie reduzieren definitiv Schatten - nur nicht immer nahtlos, und ich bin sicher, dass es Veröffentlichungen gibt (nicht von mir), die sich auf ähnliche Weise mit der Schattenentfernung befassen.

  • Manipulationstechniken für Gradientendomänen wie hier beschrieben (C- und Matlab-Codes bereitgestellt): http://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html Der Ansatz der Gradientenintegration kann für eine Reihe von Bildverarbeitungen verwendet werden Probleme finden Sie in den Folien / Präsentation für weitere Beispiele.

    Die allgemeine Idee:

    1. Berechnen Sie die räumlichen Ableitungen (Gradientenbilder) für alle Farbkanäle.
    2. Verwenden Sie die Schattengrenzen aus der Schattenmaske, um eine Gewichtungsmaske zu generieren, die an den Schattengrenzen nahe Null liegt und innerhalb einer bestimmten Nachbarschaft entlang der Schattenkante, dh orthogonal zu einem bestimmten Kantenpunkt, auf eins ansteigt.
    3. Multiplizieren Sie die Gewichtsmaske aus (2.) mit allen Verlaufsbildern, um die Schattengrenzen / -kanten zu verringern / zu dämpfen.
    4. Integrieren Sie die Verlaufsbilder mit dem Code aus dem obigen Link.
    5. Berechnen Sie für RGB-Bilder aus meiner Erfahrung den Durchschnitt der getrennten Kanäle der Originalbilder und skalieren Sie die integrierten Bilder so, dass sie mit diesen Werten übereinstimmen, um "lustige" Farbartefakte zu vermeiden.
  • Helligkeitsmanipulation in der ursprünglichen Bilddomäne.

    1. Verwenden Sie die Schattenmaske, um eine Wichtungsmaske zu generieren, die eine äußere Schattenregion ist, einen glatten Übergang (nach oben) über die Schattengrenze und einen Skalierungsfaktor größer als eine innere Schattenregion aufweist. Wie in einem früheren Beitrag vorgeschlagen, kann der Skalierungsfaktor aus der unmittelbaren Umgebung eines Schattenbereichs unter Verwendung der Durchschnittshelligkeit zusammen mit der Durchschnittshelligkeit des Schattenbereichs geschätzt werden.
    2. Multiplizieren Sie die Originalbilder (pro Kanal) mit der Gewichtsmaske.

Ich habe auch versucht, verschiedene Farbmodelle zu verwenden, z. B. HSV, die direkt Luminanz oder Helligkeit anzeigen und die dann unabhängig von der Farbe (Farbton / Sättigung) geändert werden können. Dies funktioniert im Wesentlichen wie die Helligkeitsmanipulation, dh es wird eine glatte Gewichtsmaske erzeugt und mit dem Luminanzkanal multipliziert. Vielleicht können die beiden Ansätze, Gradientenintegration und Helligkeitsmanipulation, auf clevere Weise kombiniert werden, aber das hat wahrscheinlich auch schon jemand versucht.

Hoffe das hilft, liebe Grüße, Derik.



9

Ich habe dieses Bild schon einmal gesehen. Tatsächlich steht es in dem Artikel, zu dem Sie eine Lösung suchen. Es folgte ein weiterer Artikel aus derselben Forschungsgruppe an der Simon Fraser University. In beiden Fällen erhalten Sie eine gute Einführung in das Problem der Lösung von Farben für die Beleuchtungsinvarianz.


Ja, das weiß ich, aber ich habe versucht, eine andere Methode für das gleiche Problem auszuprobieren
vini

@vini: Wenn Sie gelesen haben, dass Sie wissen sollten, womit Sie es zu tun haben - einfache morphologische Operationen werden das nicht ändern. Was hast du noch gelesen und ausprobiert? Bei Bedarf kann ich andere Papiere vorschlagen.
Emre

@Emre ich versuche, die Helligkeit zu ändern, so dass die Wirkung des Schattens jedoch nicht viel Erfolg verringert. Kann eine Kantenkarte verwendet werden, um diesen Schatten irgendwie auszublenden. Ja, ich dachte, dass morphologische Operationen nicht helfen würden, ich habe versucht, zu subtrahieren (matlab) um den Schatten zu entfernen
vini

5
@vini: Dieses Problem geht über einzeilige Lösungen hinaus. Die verlinkten Artikel (und es gibt auch andere) lösen das Problem in den meisten Fällen bereits. Wenn Sie also etwas Neues tun möchten, müssen Sie ihre Schwächen finden, und das bedeutet, dass Sie sie gut verstehen. Ich fordere Sie daher auf, sie erneut zu lesen vorsichtig. Sie erwähnen normalerweise Probleme in den Abschnitten Diskussion und Schlussfolgerung. Der logarithmisch-chromatisch-beleuchtungsinvariante Projektionsansatz scheint mir am vielversprechendsten zu sein ...
Emre

4

Es gibt mehrere Methoden, die über die Schattenerkennung sprechen und im Wesentlichen vor einem bekannten Hintergrund funktionieren. Es gibt keine absolute Vorstellung davon, was Schatten ist, wenn man nur eine Pixelfarbe betrachtet. Sie müssen jedoch Schatten ohne Referenz identifizieren.

Obwohl dieses Problem schwierig ist, gibt es hier eine triviale Lösung - obwohl dies ohne weiteres nicht die beste ist, kann es Ihnen dennoch dabei helfen, eine gewisse Perspektive zu gewinnen.

Untersuchen wir die Bildkomponenten in der HSL-Domäne

Farbtonist Farbtonkomponente,
Sättigungist Sättigungskomponente und Leichtigkeitist Helligkeitskomponente

Es ist bekannt, dass die Helligkeit dem grauen Äquivalent des Bildes sehr nahe kommt und dass der Schatten im Wesentlichen ist

ein semitransparenter Bereich, in dem die Reflexion der Szene lokal gedämpft wird.

Von hier .

Daher handelt es sich um eine Überlagerung, die das Reflexionsvermögen verringert, wobei Sie im grauen Teil des Bildes die gleiche Dunkelheit identifizieren können - aber Sie werden feststellen, dass das Zusammenspiel in den Farbteilen viel geringer ist (Farbton und etwas Sättigung).

Jetzt kann ich hier zwei Bilder produzieren - wo

  1. In diesem ersten Bild haben wir die Helligkeitskomponente entfernt (ersetzt durch einen festen Durchschnittswert).
    Bildbeschreibung hier eingeben

  2. Im zweiten Bild haben wir die Sättigungskomponente auf die gleiche Weise entfernt Sättigung entfernt

Wir können sehen, dass selbst wenn die Helligkeit erhalten bleibt, aber die Sättigung beseitigt ist, die kritischen Informationen über den Schatten intakt sind - wobei die Schatteninformationen wie bei der Entfernung der Helligkeit erheblich sinken. Obwohl dies nicht perfekt ist, ist es eine wichtige Funktion, mit der Sie unterscheiden können, was wirklich ein Schatten vom Hintergrund ist.

Auf dieser Grundlage können Sie das Bild "Entfernte Helligkeit" als Hintergrund und das andere Bild als einfallendes Bild behandeln und das Bild basierend auf diesen beiden Informationen segmentieren. In Regionen, in denen der Schatten keine große Rolle spielt, kann der Unterschied viel geringer sein, da dieses Segment, wenn der Schatten vorhanden ist, einen hohen Fehler aufweist.

Alternativ können Sie auch eine unabhängige Segmentierung (z. B. Regionswachstum) auf beide Bilder anwenden. Das mit Sättigung entfernte Bild weist ein zusätzliches Segment auf, das in dem mit Helligkeit entfernten Bild, das nichts anderes als ein Schattensegment ist, nicht vorhanden ist.

Hinweis: Sie können das von der HSL-Helligkeit entfernte Bild vom Original unterscheiden. Probieren Sie auch die ähnlichen Dinge mit HSV-Farbraum sowie YCbCr.


2

Sie können ein Histogramm des maskierten Bereichs (des Schattens) erstellen und eine lineare Farbtransformation anwenden, damit das Histogramm des maskierten Bereichs und des restlichen Bilds übereinstimmt.

Ich nehme an, dass der Skalierungsfaktor in der Transformation vernachlässigbar ist, nur eine Helligkeitsanpassung erforderlich ist. Nehmen Sie also einfach die durchschnittliche Helligkeit der beiden Segmente (Schatten, Umgebungen) und wenden Sie die Differenz an.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.