Lokale Version von „Weißabgleich“ in GIMP, um das Foto des Dokuments zu bereinigen

Ich habe ein Foto von einem Dokument mit schwarzem Text auf weißem Hintergrund.

Das Foto hat ein paar Probleme:

  • Der Text ist etwas verschwommen.
  • Insgesamt gibt es sogar in den weißen Bereichen Rauschen.
  • Der Hintergrund erscheint nicht wirklich weiß, sondern etwas gelblich.
  • Das Wichtigste: Einige Bereiche des Bildes, sogar die Bereiche, die weiß sein sollten, sind dunkler als andere.

Ich würde dieses Bild gerne bereinigen. Ich bin auf Linux.

Der Filter „Farben > Auto > Weißabgleich“ in GIMP liefert vielversprechende Ergebnisse. Allerdings wird der Hintergrund in verschiedenen Bereichen des Bildes nicht angeglichen.

Wenn ich aber nur einen Teilbereich des Bildes auswähle, funktioniert der Filter "Weißabgleich" in diesem Bereich tatsächlich besser.

Ich stelle mir also vor, dass das schrittweise Anwenden des "Weißabgleichs" in lokalen Bereichen des Bildes wirklich großartig funktionieren würde.

Ich stelle mir vor, dass der Filter "Weißabgleich" so implementiert ist:

  1. Sammeln Sie Farbstatistiken des gesamten Bildes.
  2. Erstellen Sie eine Farbkonvertierungsmatrix und wenden Sie sie global an.

Was ich mir stattdessen wünsche:

  1. Sammeln Sie lokale Farbstatistiken für jeden Bereich von zB 100*100 px.
  2. Erstellen Sie lokale Farbkonvertierungsmatrizen.
  3. Erstellen Sie eine kontinuierliche Funktion von Konvertierungsmatrizen pro Pixel.
  4. Lokal pro Pixel auftragen.

Kennen Sie so etwas, das es entweder in GIMP oder als eigenständige Software zB für die Linux-Befehlszeile gibt?

Würde es für Sie nicht funktionieren, das Bild einfach zu entsättigen?
Oder die Belichtung erhöhen, bis alles außer dem schwarzen Druck ausgeblasen ist?
@MichaelClark Ich habe das Dokument mit meiner mobilen Kamera fotografiert, Handheld. Es hat keine Kontrolle für die Exposition. Auch die Beleuchtung ist nicht optimal. Und ich mag keinen Blitz, weil er Reflexionen und ungleichmäßige Beleuchtung erzeugt.
@junkyardsparkle Desaturate verwandelt das Bild nur in Graustufen. Das Hauptproblem, das ich nicht einfach beheben kann, ist die Variation des Hintergrunds.
Ich habe die Aufzählungsliste in der Frage korrigiert. Das Hauptproblem, um das es bei dieser Frage geht, ist, dass der Weißpegel des Hintergrunds nicht gleichmäßig verteilt ist.
@donquixote Sie können auch die Helligkeit/Belichtung in der Post erhöhen. Wenn Ihre mobile Kamera Dateien nicht im Rohformat speichert, wird es schwieriger. Aber hier ist die Sache: Sie scheinen sich zu weigern, richtig zu beleuchten, um Ihre begrenzte Kamera auszugleichen, während Sie sich gleichzeitig weigern, eine leistungsfähigere Kamera zu verwenden, um Ihre begrenzte Beleuchtung auszugleichen.
Ich hatte einige Erfolge mit der Microsoft OfficeLens-App. Ich weiß jedoch nicht, welche Filter dies intern verwendet. Und es funktioniert nur, wenn Sie das Foto direkt mit dieser App aufnehmen, es ist nicht für eine spätere Bearbeitung gedacht.
Eine andere Sache, die ich versucht habe: Verwenden Sie einen Medianfilter oder "unteren Medianfilter", um eine Schätzung für den Hintergrund zu erhalten, und subtrahieren Sie dann diesen Hintergrund vom Originalbild. Ich habe dies mit PHP-Skripten gemacht, daher ist meine Implementierung für andere nicht wirklich nützlich. Aber die Idee ist richtig. Diese Idee ähnelt der Antwort von Clabacchio.

Antworten (4)

Ich nehme an, Sie haben aufgrund ungleichmäßiger Beleuchtung einen Gradienten in der Gesamthelligkeit. Wenn dies der Fall ist, können Sie die Ebene mit dem Bild duplizieren und die beste Korrektur auf jeden Teil des Bildes auf einer anderen Ebene anwenden: Kurven für Kontrast, Farbausgleich oder Entsättigung für den Weißabgleich.

Dann können Sie mit Ebenenmasken jede Region mit sanften Farbverläufen malen, um sie miteinander zu verschmelzen. Die Entsättigung kann als letzter Schritt verwendet werden, um die verbleibenden Unterschiede etwas auszugleichen.

Ein alternativer Ansatz könnte darin bestehen, die Ebene zu duplizieren (ich habe ein Foto mit meiner Hand gemacht, die die Hälfte der Karte schattiert, um das Problem zu reproduzieren):

Verwischen Sie es, bis der Text verschwindet:

Geben Sie hier die Bildbeschreibung ein

Und dann subtrahieren Sie die resultierende Ebene von der ursprünglichen, wählen Sie den Mischmodus als "Kornextraktion", um die Ungleichmäßigkeit der Beleuchtung umzukehren:

Geben Sie hier die Bildbeschreibung ein

Die Tiefpassfilterung, die Sie durch Weichzeichnen erreichen, ist nur dann effektiv, wenn Änderungen in der Beleuchtung viel weicher sind als die Textdetails, und es funktioniert am besten mit dünnerem Text, da er durch Weichzeichnen verschwindet. Beachten Sie, dass in diesem Fall der fettgedruckte Text beim Verwischen einen Heiligenschein verursacht, der beim Mischen invertiert wird. Sie können es mit einem größeren Radius versuchen oder versuchen, ihn zu maskieren, bevor Sie die duplizierte Ebene unkenntlich machen.

Beachten Sie auch, dass dieser Vorgang auch den Weißabgleich festlegt, da er die Farbkurven umkehrt.

Als letzten Schliff habe ich die Einstellung „Kurven“ angewendet, um den Kontrast zu erhöhen.

Geben Sie hier die Bildbeschreibung ein

Es ist vielleicht nicht perfekt, aber ich bin tatsächlich überrascht, wie das herauskam.

Ich vermute, Ihr zweiter Ansatz würde nicht funktionieren, wenn der Text nicht sehr spärlich wäre. Aber das erste scheint eine gute Idee zu sein
@ChrisH Ich habe es ausprobiert und glaube tatsächlich, dass es effektiv sein kann. Ich stimme Ihnen zu, dass dichterer Text ein Problem sein kann, aber nicht so sehr, wenn Sie genug verwischen. Sehr fetter und spärlicher Text kann sogar noch schlimmer sein.
Sehr schön. Das ist die Art von Dingen, die ich im Vergleich zu so etwas wie einem Brief als spärlich angesehen habe.
Ja, das sieht perfekt aus! Aber anstelle der Unschärfe (von der ich annehme, dass sie nur den Durchschnitt der Pixel in der Nähe nimmt), würde ich vorschlagen, einen Medienfilter zu verwenden. Leider finde ich in Gimp keinen solchen Filter. In einer idealen Welt wäre dies natürlich bereits in einem Paket zusammengefasst, da der Anwendungsfall meiner Meinung nach ziemlich häufig ist. Aber das habe ich bisher noch nie gefunden.
Übrigens denke ich, in Ihrem Beispiel würde ich sagen, dass der Hintergrund perfekt ist, aber einige der schwarzen Kreise sehen etwas beschädigt oder zu geschrumpft aus.
@donquixote natürlich kann das Ergebnis verbessert werden, ich habe 10 Minuten gebraucht, um dorthin zu gelangen, und ich bin kein Experte. Wenn Sie mehr Qualität wünschen, könnte die Verwendung eines Klonwerkzeugs auf der zu verwischenden Ebene hilfreich sein, ebenso wie eine bessere Überblendung. Aber das Prinzip ist da, und es könnte im Batch durchgeführt werden
Ich denke, die Kreise auf der linken Seite wurden im letzten Schritt überbelichtet, sie sehen im vorherigen Bild fast OK aus. Muss es nochmal versuchen

Sie werden wahrscheinlich einige Erfolge haben, wenn Sie Ebenen in den dunkleren Kanälen ausführen (wenn das Bild gelb aussieht, den blauen Kanal aufhellen usw.). Sie können dies global tun. Dies ist wahrscheinlich zusätzlich zu (vorher) Pegeln auf dem *Wert"-Kanal. Im Wertkanal können Sie die schwarzen und weißen Eingabepunkte näher zusammenrücken und dann wahrscheinlich den Gammawert erhöhen, um das Papier aufzuhellen, das von der Unschärfe betroffen ist aus dem Druck.

Während das Entsättigen hilfreich sein kann, hinterlässt es einen grauen Hintergrund statt einen weißen, wenn es angewendet wird, bevor Sie die Hintergrundpegel anheben - es wird nützlich sein, sobald der Hintergrund weiß aussieht. Eine unscharfe Maske mit einem relativ niedrigen Wert, aber einem großen Radius kann weiße Bereiche um den Text hervorheben, während ein kleiner Radius einen Teil der Unschärfe beseitigen kann.

Ich empfehle Schwellenwerte nur , wenn Sie unbedingt Schwarzweiß bereitstellen müssen, da Graustufen einen Anti-Aliasing-Effekt haben.

Sobald Ihr Hintergrund weiß ist (rgb 255.255.255) und weit vom Text entfernt ist, kann eine lokale Fleckenentfernung erforderlich sein.

Obwohl ich weiß, dass ich Beispiele habe, um dies zu untermauern, habe ich die Zwischenschritte nicht gespeichert.
Es gibt einen Kompromissansatz für den Schwellenwert: Posterisieren Sie auf eine kleine ungerade Zahl (normalerweise experimentiere ich mit 3 bis 15 und wähle am Ende 3 oder 5). Es gibt weitgehend die Sauberkeit der Schwelle mit ein wenig Anti-Aliasing.
@PeterTaylor Ich muss das einige Zeit ausprobieren und sehen, wie es mit meinem Ansatz für steile Ebenen verglichen wird.
@ChrisH Danke für die Antwort. Aber es löst nicht wirklich das Hauptproblem, dass der Hintergrund ungleichmäßig ausgeleuchtet ist.
@donquixote IME (und ich habe das ziemlich oft gemacht) es behebt dieses Problem. Obwohl ich denke, dass es keine großartige Antwort auf Ihre Frage ist, denke ich, dass es eine anständige Antwort auf Ihr Problem ist. Könntest du ein (ggf. geschwärztes) Bild posten?
... es sei denn, die Variation ist so groß, dass Schwarz in einem Bereich nahe an Weiß in einem anderen liegt.
Ja, ich fürchte, das wird passieren. Es wird die Buchstaben in den helleren Bereichen möglicherweise nicht beseitigen, aber ich vermute, es wird sie verkleinern. Ich stelle mir vor, dass ein Algorithmus mit einem "lokalen" Weißabgleich dies universell verhindern würde.

...Mischart als "Getreideextrakt"

Der "Teilungs"-Modus erzeugt auch schöne Effekte für Dokumente (kontrastreicher)

Hey Laskus, willkommen auf der Seite. Können Sie weitere Einzelheiten zur Verwendung des „Division“-Modus und seiner Funktion angeben? Dies können vielversprechende Informationen für das sein, was das OP zu tun versucht, aber es ist von begrenztem Wert ohne eine Erklärung, wie es verwendet wird.
Ich habe es gerade versucht; der Ebenenüberblendungsmodus „Teilen“ hat eine unmittelbarere Wirkung als „Körnung extrahieren“; Das Ergebnis ähnelt dem direkten Sprung zum letzten Schritt in der Antwort von @clabacchio. Durch Herumspielen bekomme ich jedoch manchmal sauberer aussehenden Text von der Grain Extract / Curve-Methode, also hängt es wahrscheinlich vom Eingabebild ab. Wie auch immer, die Schritte dafür sind: Duplizieren Sie die Basisebene, verwischen Sie, stellen Sie den Mischmodus auf "Teilen". Was genau es tut, finden Sie unter docs.gimp.org/en/gimp-concepts-layer-modes.html .

Hier eine Idee ohne konkrete Umsetzungshinweise. Wenn jemand dies in einer neuen Antwort konkretisieren kann, machen Sie weiter!

Zuerst macht man eine Kopie des Bildes, zB in einer neuen Ebene - je nach verwendetem Werkzeug.

In dieser Kopie glätten Sie zuerst ein wenig mit einem kleinen Radius. Das bedeutet, dass jeder Pixel ein gewichteter Durchschnitt seiner lokalen Umgebung wird.

Dann wenden Sie einen Median oder einen "unteren Median" mit einem Radius an, der größer als das durchschnittliche Zeichen ist. Das bedeutet für jeden Pixel (und jeden Farbkanal):

  • Sammeln Sie alle Pixel in der Nähe, zB 100 = 10x10 Pixel.
  • Sortieren Sie sie nach Helligkeit.
  • Verwenden Sie den 50. hellsten Farbwert als neuen Farbwert für das zentrale Pixel. Oder der 10. dunkelste Farbwert, für "unterer Median".

Dies gibt Ihnen eine Schätzung des Hintergrunds. Aufgrund der Funktionsweise von Medianen wird es jedoch wahrscheinlich "Stufen" in den Farben enthalten. Vielleicht gibt es etwas noch Klügeres als diese Mediane.

Verwenden Sie optional etwas Glättung (großer Radius), um diese Schritte zu eliminieren.

Subtrahieren Sie nun diese Ebene vom Originalbild.

Verwenden Sie optional "Weißabgleich" für das Ergebnis (wenn Sie mit GIMP arbeiten).

Ich weiß nicht, welches Tool ich wählen soll, wenn ich das alles umsetzen möchte. Bisher habe ich PHP verwendet, bin aber nicht davon überzeugt, dass dies überhaupt die beste Lösung ist.