In Mathematica versuchen wir Folgendes zu tun: RMagick entfernt den weißen Hintergrund aus dem Bild und macht es transparent .
Bei tatsächlichen Fotos sieht es jedoch mies aus (wie ein Heiligenschein um das Bild).
Folgendes haben wir bisher versucht:
unground0[img_] := With[{mask = ChanVeseBinarize[img, TargetColor->{1.,1.,1.}]},
Rasterize[SetAlphaChannel[img, ImageApply[1-#&, mask]], Background->None]]]
Hier ist ein Beispiel dafür, was das bewirkt.
Original Bild:
Bild mit weißem Hintergrund ohne Hintergrund (oder zu Demonstrationszwecken hier mit rosa Hintergrund):
Irgendwelche Ideen, um diesen Heiligenschein loszuwerden? Wenn ich Dinge wie LevelPenalty optimiere, kann ich den Heiligenschein nur auf Kosten des Verlusts eines Teils des Bildes verschwinden lassen.
BEARBEITEN: Damit ich Lösungen für das Kopfgeld vergleichen kann, strukturieren Sie bitte Ihre Lösung wie oben beschrieben, nämlich eine in sich geschlossene Funktion namens unground - etwas, das ein Bild aufnimmt und ein Bild mit transparentem Hintergrund zurückgibt.
Antworten:
Je nach Kantenqualität benötigen Sie möglicherweise:
Bearbeiten
Stealing a bit from @Szabolcs
klicken um zu vergrößern
Bearbeiten 2
Nur um eine Vorstellung vom Ausmaß der Halo- und Hintergrundfehler im Bild zu bekommen:
quelle
Diese Funktion implementiert die von Mark Ransom beschriebene umgekehrte Mischung für eine zusätzliche kleine, aber sichtbare Verbesserung:
Dies ist die Funktion zum Entfernen des Hintergrunds. Der
threshold
Parameter wird für die anfängliche Binärisierung des Bildes verwendet. ErminSizeCorrection
dient zum Optimieren der Größenbeschränkung für kleine Junk-Komponenten, die nach der Binärisierung entfernt werden sollen.Testen der Funktion:
Kurze Erklärung, wie es funktioniert:
Wählen Sie Ihre bevorzugte Binariaztion-Methode, die relativ präzise scharfe Kanten erzeugt
Wenden Sie es auf ein
mask
vergrößertes Bild an und verkleinern Sie das erhaltene Bild auf die Originalgröße. Dies gibt uns Antialiasing. Der größte Teil der Arbeit ist erledigt.Um eine kleine Verbesserung zu erzielen, mischen Sie das Bild mit der Helligkeit des Negativs als Alpha auf den Hintergrund und mischen Sie dann das erhaltene Bild in einem dünnen Bereich um die Kanten (
edgemask
) über das Original , um die Sichtbarkeit weißer Pixel an den Kanten zu verringern. Der diesen Operationen entsprechende Alphakanal wird berechnet (der etwas kryptischeImageMultiply/Add
Ausdruck).Jetzt haben wir eine Schätzung des Alphakanals, damit wir eine umgekehrte Mischung durchführen können.
Die Schritte 3 und 4 verbessern sich nicht so sehr, aber der Unterschied ist sichtbar.
quelle
Ich werde generisch sprechen, nicht speziell in Bezug auf Mathematica. Ich habe keine Ahnung, ob diese Operationen schwierig oder trivial sind.
Der erste Schritt besteht darin, einen Alpha-Pegel (Transparenzpegel) für die Pixel am Bildrand zu schätzen. Im Moment verwenden Sie einen strengen Schwellenwert, sodass das Alpha entweder zu 0% vollständig transparent oder zu 100% vollständig undurchsichtig ist. Sie sollten einen Bereich zwischen dem Gesamtweiß des Hintergrunds und den Farben definieren, die unbestreitbar Teil des Bildes sind, und einen angemessenen Anteil festlegen. Wenn die Farbe näher am Hintergrund liegt, ist das Alpha niedrig, und wenn sie näher am dunkleren Grenzwert liegt, ist dies der Fall ein hohes Alpha. Danach können Sie Anpassungen basierend auf den umgebenden Alpha-Werten vornehmen. Je mehr ein Pixel von Transparenz umgeben ist, desto wahrscheinlicher ist es, dass es selbst transparent ist.
Sobald Sie Alpha-Werte haben, müssen Sie eine umgekehrte Mischung durchführen, um die richtige Farbe zu erhalten. Wenn ein Bild über einem Hintergrund angezeigt wird, wird es gemäß dem Alpha-Wert unter Verwendung der Formel gemischt,
c = bc*(1-a)+fc*a
wobeibc
die Hintergrundfarbe undfc
die Vordergrundfarbe verwendet werden. In Ihrem Fall ist der Hintergrund weiß (255,255,255) und die Vordergrundfarbe ist unbekannt, daher kehren wir die Formel um :fc = (c - bc*(1-a))/a
. Wenna=0
die Formel eine Division durch Null erfordert, die Farbe jedoch keine Rolle spielt, verwenden Sie einfach Schwarz oder Weiß.quelle
Hier ist ein Versuch, Mark Ransoms Ansatz mit Hilfe der Maskengenerierung von Belisarius umzusetzen:
Suchen Sie die Grenze des Objekts:
Stellen Sie die Alpha-Werte ein:
Umgekehrte Farbmischung:
Beachten Sie, wie einige der Kanten weiße Flaum haben? Vergleichen Sie das mit dem roten Umriss im ersten Bild. Wir brauchen einen besseren Kantendetektor. Das Erhöhen der Erosionsmenge hilft beim Flaum, aber dann werden andere Seiten zu transparent, sodass die Breite der Kantenmaske beeinträchtigt wird. Es ist jedoch ziemlich gut, wenn man bedenkt, dass es per se keine Unschärfeoperation gibt.
Es wäre lehrreich, den Algorithmus auf einer Vielzahl von Bildern auszuführen, um seine Robustheit zu testen und festzustellen, wie automatisch er ist.
quelle
Nur als Anfänger herumspielen - es ist erstaunlich, wie viele Tools verfügbar sind.
quelle
Ich bin völlig neu in der Bildverarbeitung, aber hier ist, was ich nach einigem Spielen mit neuen morphologischen Bildverarbeitungsfunktionen von Version 8 bekomme:
quelle
Method -> "Convex"
das Es ist nicht dokumentiert.Ich empfehle, dafür Photoshop zu verwenden und als PNG zu speichern.
quelle
Mögliche Schritte, die Sie unternehmen könnten:
quelle
Ersetzen Sie einfach jedes Pixel, das "fast weiß" ist, durch ein Pixel mit derselben RGB-Farbe und einem Sigmoid-Farbverlauf auf dem Transparenzkanal. Sie können einen linearen Übergang von fest zu transparent anwenden, aber Sinus oder Sigmoid oder Tanh sehen natürlicher aus. Abhängig von der Schärfe der gesuchten Kante bewegen sie sich schnell vom Medium zu fest oder transparent, jedoch nicht schrittweise / binär Art und Weise, was Sie jetzt haben.
Denk darüber so:
Nehmen wir an, R, G, B sind jeweils 0,0-1,0, dann stellen wir Weiß als einzelne Zahl als R + G + B = 1,0 * 3 = 3,0 dar.
Wenn Sie ein wenig von jeder Farbe herausnehmen, wird es ein wenig "cremefarben", aber wenn Sie ein wenig von allen 3 herausnehmen, wird es viel mehr entfernt als ein wenig von irgendjemandem. Angenommen, Sie erlauben eine Reduzierung um 10% auf einen Kanal: 1.0 * .10 = .1. Verteilen Sie diesen Verlust nun auf alle drei und binden Sie ihn für den Alpha-Kanal zwischen 0 und 1, wenn er kleiner als .1 ist, so dass ( Verlust = 0,9) => 0 und (Verlust = 1,0) => 1:
Als Referenz:
Die einzige Gefahr (oder der einzige Nutzen?), Die Sie dabei haben, besteht darin, dass es nicht um Weiße geht, die tatsächlich Teil des Fotos sind. Es entfernt alle Weißen. Wenn Sie also ein Bild von einem weißen Auto haben, werden transparente Flecken darin sein. Aber aus Ihrem Beispiel scheint dies ein gewünschter Effekt zu sein.
quelle