So erhalten Sie Magic Color-Effekte wie Cam Scanner mit OpenCV

Lesezeit: 10 Minuten

Benutzer-Avatar
mihirjoshi

Dies ist das Originalbild.

Originalbild

Cam Scanner Magischer Farbeffekt.Cam-Scanner-Effekt

Mein Filter auf dem Bild.

Mein Filter

Ich ändere den Kontrast des Bildes.

dst.convertTo(dst, -1, 2, 0);

Verwenden Sie dann die Gaußsche Unschärfe zum Glätten.

cv::GaussianBlur(dst,result,cv::Size(0,0),3);
cv::addWeighted(dst, 1.5, result, -0.5, 0, result);

Was sollte ich tun, um diese Art von Effekt auf mein Bild zu erzielen?

AKTUALISIEREN

Nach Histogrammausgleich –

vector<Mat> channels;
Mat img_hist_equalized;
cvtColor(dst, img_hist_equalized, CV_BGR2YCrCb);
split(img_hist_equalized,channels);
equalizeHist(channels[0], channels[0]);
merge(channels,img_hist_equalized);
cvtColor(img_hist_equalized, img_hist_equalized, CV_YCrCb2BGR);

Histogramm-Ausgleich

  • Eine SW- oder Graustufenpalette?

    – Wetterfahne

    2. Oktober 2015 um 18:28 Uhr

  • Es scheint eine adaptive Schwelle zu sein

    – Michi

    2. Oktober 2015 um 18:52 Uhr

  • Ich mache so etwas nach dem Trail-and-Error-Prinzip und lege Schwellenwerte von Hand fest. In diesem Fall müsste das Ziel BW oder Graustufen sein. Ich sehe eine Gelegenheit für a floodtest – ähnliche Idee wie floodfill – was die maximale Fläche von “weißen” Pixeln von Nachbarn analysieren würde.

    – Wetterfahne

    2. Oktober 2015 um 19:16 Uhr


  • Können Sie das Originalbild ohne Azure-Zeug bereitstellen? Oder wir haben kein Bild zum Testen.

    – Michi

    6. Oktober 2015 um 12:30 Uhr

  • @Miki Sorry für die späte Antwort. Bitte schön

    – mihirjoshi

    7. Oktober 2015 um 5:43 Uhr

Benutzer-Avatar
ZdaR

Die Camscanner-Anwendung verwendet möglicherweise einen komplexen Algorithmus, um verschiedene Blitzfälle usw. zu behandeln. Aber ich werde versuchen, einen grundlegenden Ansatz für ein solches Problem zu beschreiben. Die Grundidee hier ist Binarisierung des gegebenen Eingangsbildes, Oder genauer können wir sagen Halten ein bestimmtes Bild, Wenn Sie sich die OpenCV-Dokumentation ansehen, gibt es viele Verweise auf die Schwellenwertbildung für ein bestimmtes Bild. Fangen wir also mit dem an Dokumentation.

  • Globale Schwellenwerte: Bei diesem Ansatz gehen wir davon aus, dass der Intensitätswert des Vordergrunds immer unter einem bestimmten Wert liegt. Im Zusammenhang mit bedruckten Blättern gehen wir davon aus, dass die Tintenfarbe immer schwarz und die Papierfarbe gleichmäßig ist und die Intensität größer ist als die Intensität der Tintenfarbe , also nehmen wir sicher einen Schwellenwert an (sagen wir 40) (max. ist 255) und setzen das Eingabebild als Schwellenwert:

     ret, thresh1 = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
    

Geben Sie hier die Bildbeschreibung ein

    ret, thresh1 = cv2.threshold(img, 130, 255, cv2.THRESH_BINARY)

Geben Sie hier die Bildbeschreibung ein

There are many disadvantages to this method, First of all it is **NOT** independent of intensity variance, So there is a very less chance that you can accurately estimate  a threshold value which segments text from the given image, It has very limited applications, can be only applied in case where the background paper is exactly white with minimum variation in intensity, so this process cannot be used for **Real world** images.
  • Adaptive Schwellenwerte: Diese Methode deckt das Problem der Intensitätsvariation in dem gegebenen Bild ab, hier erfolgt die Schwellenwertbildung auf den Werten benachbarter Pixel. Übergänge von niedrigerer Intensität zu höherer und umgekehrt werden also mit dieser Methode erfolgreich erfasst als:

     thresh = cv2.adaptiveThreshold(original_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
    

Geben Sie hier die Bildbeschreibung ein

*Further Work*: You may work on various techniques of denoising the binary image, to remove the dots, Or have a look at removing the salt and pepper noise from the image.
  • Otus Binarisierung: Dies ist noch ein weiterer netter Ansatz, der den Schwellenwert zwischen den Maxima intelligent berechnet. Es kann in einigen Fällen sehr gut funktionieren, aber es scheint in Ihrem Fall zu scheitern.

     ret2,thresh = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    

Geben Sie hier die Bildbeschreibung ein

Es tut im Grunde dasselbe globale Schwellenwerte Aber jetzt wird der Schwellenwert automatisch so berechnet, dass der Schwellenwert zwischen 2 Spitzen liegt und somit die Tinte vom Papier segmentiert.

Empfohlene Methode:
Ich denke, der beste Ansatz für den Anfang ist Adaptive SchwellenwerteSie können einige andere Vorverarbeitungstechniken ausprobieren, z. B. das Schärfen von Bildern, Histogrammausgleichusw. und analysieren Sie, wie es eine realistischere Ausgabe erzeugt. Sie können auch versuchen, einige Nachbearbeitungen durchzuführen, z Entrauschen des Bildes, Morphologische Operationen

Ich habe versucht, das Bild zu entrauschen und fand es effektiver als andere Ansätze,

denoised = cv2.fastNlMeansDenoising(thresh, 11, 31, 9) # you may experiment with the constants here

Geben Sie hier die Bildbeschreibung ein

Aber ich begrüße Sie, verschiedene Kombinationen der oben genannten Ansätze auszuprobieren, um zu sehen, welcher für alle Fälle funktioniert.

Notiz: Die obige Technik kann für weniger farbenfrohe Bilder funktionieren. Hier ist jedoch eine weitere hervorragende Antwort, die den Fall farbiger Bilder lösen kann.

  • Es ist eine nette Lösung, aber ich weiß nicht, dass sie Binarisierung verwenden. Die Binarisierung erzeugt ein zweistufiges Bild. In dem Beispiel ist das verarbeitete Bild jedoch sauber, verbessert, aber mit mehr als zwei Farben. Daher glaube ich nicht, dass die adaptive Binarisierung den Zweck erfüllen kann.

    – fühl dich frei

    9. Oktober 2015 um 15:15 Uhr

  • Es ist eine nette Lösung, obwohl ich es noch nicht ausprobiert habe, wird es auch für farbige Bilder funktionieren.

    – mihirjoshi

    10. Oktober 2015 um 4:20 Uhr

  • Nein, es funktioniert nicht für farbige Bilder, ich habe versucht, die erwartete Ausgabe für die gegebene Eingabe zu erhalten, unabhängig davon, was Magic Color tatsächlich tut, ich würde versuchen, dies für farbige Bilder zu erarbeiten, wenn ich genug Zeit habe.

    – ZdaR

    10. Oktober 2015 um 4:49 Uhr

  • @ZdaR Danke, dass du es zumindest versucht hast

    – mihirjoshi

    13. Oktober 2015 um 20:23 Uhr

  • Aufrichtig, diese Antwort verdient nicht so viel Wertschätzung, ich war mir nicht bewusst, dass der Magic Color-Effekt auch für Farbbilder funktioniert. Wenn ich jedoch genug Zeit habe, werde ich diese Antwort entsprechend aktualisieren, um die Frage richtig zu beantworten. Die aktuelle Antwort würde bei Zeichen funktionieren, die auf Normalpapier gedruckt sind.

    – ZdaR

    13. Oktober 2015 um 21:54 Uhr

Benutzer-Avatar
Felix g

Eine sehr einfache, aber effektive Methode, um mit dieser Art von Bild umzugehen, ist eine Flat-Field-Korrektur.

Zuerst erzeugen Sie ein “gefälschtes” Flat-Field-Bild F durch Anwendung von a sehr starken Unschärfefilter auf das Originalbild I. Dann multiplizierst du I mittels Fund teilen Sie das resultierende Bild durch F (Pixel für Pixel), um das korrigierte Bild zu erhalten C. Die Multiplikation ist nur da, um die Gesamthelligkeit zu erhalten, bei der Division passiert die Magie.

Grundsätzlich dies: C = (I * mean(F)) / F

Das resultierende korrigierte Bild C werden die meisten, wenn nicht alle unerwünschten großflächigen Beleuchtungen und Farben entfernt. Dann bleibt nur noch etwas Kontraststreckung, und Sie erhalten ein Ergebnis, das dem bereitgestellten Referenzbild sehr ähnlich ist. (Graustufen, hoher Kontrast, aber ohne Schwellenwert)

Wenn Sie sich fragen, wie das Ergebnis für das bereitgestellte Bild aussieht …

Zuerst das flache Feld:

flaches Feld

Dann das korrigierte Bild:

korrigiertes Bild

Und schließlich, nach Erhöhung des Kontrasts:

erhöhter Kontrast

Das Schwierigste daran ist, das flache Feld genau richtig hinzubekommen, da Sie es genug verwischen möchten, um den Text loszuwerden, während gleichzeitig der Hintergrund so weit wie möglich erhalten bleibt. Hier können nichtlineare Filter (zB Median) Abhilfe schaffen.

  • Danke für den Vorschlag! Es wäre großartig, wenn Sie ein kleines Proof-of-Concept-Beispiel liefern könnten, mein Freund.

    – Zustandsmaschine

    3. Juli 2020 um 16:26 Uhr

  • @eldesgraciado Natürlich habe ich ein Beispiel hinzugefügt, wie das Ergebnis (und Zwischenschritte) für das Originalbild aussehen würden.

    – Felix G

    3. Juli 2020 um 19:56 Uhr

  • Danke für die Antwort, aber vergessen wir nicht, dass CamScanner auch die Bildqualität beibehält (scheint die Auflösung des Bildes zu erhöhen).

    – Pe Dro

    5. Juli 2020 um 6:14 Uhr

  • Ich habe diese App nicht, also kann ich nur versuchen, das bereitgestellte Referenzbild neu zu erstellen (das leider eine noch niedrigere Auflösung hat als das bereits niedrig aufgelöste Eingabebild). Die Flat-Field-Korrektur ist vielleicht nicht die vollständige Antwort, aber sie ist ein guter erster Schritt, um eine ganze Reihe von Problemen im Eingangsbild zu beseitigen.

    – Felix G

    5. Juli 2020 um 7:45 Uhr

  • @FelixG Ein Medianfilter, wie Sie vorschlagen, macht den Trick sehr gut. Wenn nur lineares Weichzeichnen verwendet wird, erhalten Sie dunkle Kleckse, wo mehr Text pro Bereich vorhanden ist. Beispielsweise kann ein Textabsatz 20 % schwarze Tinte enthalten und dann auf mehrere Zeilen mit weißen Flächen folgen. In diesem Fall erzeugt der Textabsatz beim Weichzeichnen einen großen grauen Fleck, selbst wenn es sich um ein perfekt aufgenommenes Foto handelt. Aber mit der Medianfilterung verschwindet der Text einfach, solange er weniger als 50 % des lokalen Bereichs einnimmt). Ich habe es mit dem obigen Bild versucht und der Text verschwindet mit einem mittleren Filterradius von nur 11 Pixeln.

    – Dummkopf

    5. Juli 2020 um 16:52 Uhr

Benutzer-Avatar
MSD

Ich habe Photoshop verwendet, um die Bearbeitungstechniken herauszufinden, die zum Erzielen des Scan-Effekts erforderlich sind.

In Photoshop kann der Scan-Effekt mit den Operationen „Weißpunkt setzen“ und „Schwarzpunkt setzen“ erreicht werden, die von der Funktion „Tonwertkorrektur“ bereitgestellt werden. Die Kombination dieser beiden Vorgänge führt zu dem Scan-Effekt, der in verschiedenen mobilen Apps oft als „magische Farbe“ angesehen wird.

Abgesehen davon kann der Hochpassfilter zusammen mit den beiden oben genannten Operationen verwendet werden, um einige aufregende Ergebnisse wie das Entfernen von Schatten zu erzielen.

Das Scannen von Dokumenten im “Schwarzweiß”-Modus wird durch die Verarbeitung des Bildes im LAB-Farbraum mit OpenCV erreicht.

Die oben genannten Operationen können in OpenCV unter Verwendung verschiedener Schwellwerttechniken und einiger grundlegender mathematischer Operationen implementiert werden.

Sie können einmal durchgehen dieses Depot um einen vollständigen Einblick in das zu bekommen, was ich zu sagen versuche.

Ich habe eine vollständige Wiki-Dokumentation für das Projekt im obigen Repo hinzugefügt.

Diese Antwort scheint nicht sehr informativ zu sein, aber da das Repo eine ausführliche Diskussion enthält, halte ich diesen Beitrag kurz.

Beispiel für Ergebnisse, die wir mit diesen Techniken erzielen können:
Das Bild in der oberen rechten Ecke und das Bild darunter sind die Eingänge, während andere Bilder für verschiedene Scanmodi ausgegeben werden

Markierungen in diesem Bild helfen uns, die Art der Ausgabe von jedem Modus zu verstehen, der im GitHub-Repo besprochen wird:
Markierungen in diesem Bild helfen uns, die Art der Ausgabe von jedem Modus zu verstehen, der im GitHub-Repo besprochen wird

Ich habe Code geschrieben, der so etwas macht, allerdings nicht mit OpenCV.

Normalerweise würde ich ein Histogramm analysieren, basierend auf dem Histogramm schätzen, was “Weiß” und “Schwarz” ist, und dann die Bildwerte so skalieren, dass Schwarz unter 0 und Weiß über 1 skaliert wird (oder 255, je nach Ihrer Darstellung). , schließlich die Farbwerte festklemmen.

Mit OpenCV gibt es jedoch möglicherweise einen einfacheren Weg. Versuchen Sie, den Histogrammausgleich auf Ihrer zugeschnittenen Seite zu verwenden, bevor Sie einen Kontrastfilter anwenden – das sollte die Pixelwerte konsistenter verteilen, sodass die Anpassung des Kontrasts in mehr Situationen zuverlässiger funktioniert. Sie könnten versuchen, zu verwenden lokalisiert Histogrammausgleich, um Farbverläufe auf dem zugeschnittenen Bild aufgrund der Beleuchtung abzumildern, aber dies kann Probleme mit leeren Bereichen der Seite verursachen.

Mir ist klar, dass ich etwas spät zum Spiel komme, aber ich habe diese großartige, einfache Lösung gefunden:

src.convertTo(dst, -1, 1.9, -80);

src und dst können dasselbe Image sein, wenn Sie in einer Verarbeitungspipeline arbeiten.

  • Es ändert nur den Kontrast. Probieren Sie es auf dem Quellbild aus, das ich gepostet habe, und Sie werden sehen.

    – mihirjoshi

    16. Juli 2016 um 2:26 Uhr

  • Was ist src und dst? Sind es dieselben Bitmaps?

    – Narendra

    13. September 2016 um 16:21 Uhr


  • Technisch gesehen handelt es sich um Mat-Objekte, die Bilddaten enthalten. Falls src und dst gleich sind, erfolgt die Konvertierung effektiv “in-place”. Wenn src und dst verschiedene Mat-Objekte sind, enthält die dst-Mat die konvertierten src-Daten.

    – bstar55

    14. September 2016 um 6:35 Uhr


  • Wenn das aufgenommene Bild ein Dokument ist, wird der Text auf dem Dokument ausgeblendet, wenn die obige Operation angewendet wird. Es ist nicht genau das, was die Camscanner-App tut.

    – Mohd Khalil Ur Rehman

    13. Januar 2017 um 9:30 Uhr


  • Dies ist nicht die vollständige Lösung. Es ist nur ein Teil der gesamten Methode ODER ein Trick, um einen ähnlichen Effekt zu erzielen.

    – Pe Dro

    28. Juni 2020 um 5:14 Uhr

  • Es ändert nur den Kontrast. Probieren Sie es auf dem Quellbild aus, das ich gepostet habe, und Sie werden sehen.

    – mihirjoshi

    16. Juli 2016 um 2:26 Uhr

  • Was ist src und dst? Sind es dieselben Bitmaps?

    – Narendra

    13. September 2016 um 16:21 Uhr


  • Technisch gesehen handelt es sich um Mat-Objekte, die Bilddaten enthalten. Falls src und dst gleich sind, erfolgt die Konvertierung effektiv “in-place”. Wenn src und dst verschiedene Mat-Objekte sind, enthält die dst-Mat die konvertierten src-Daten.

    – bstar55

    14. September 2016 um 6:35 Uhr


  • Wenn das aufgenommene Bild ein Dokument ist, wird der Text auf dem Dokument ausgeblendet, wenn die obige Operation angewendet wird. Es ist nicht genau das, was die Camscanner-App tut.

    – Mohd Khalil Ur Rehman

    13. Januar 2017 um 9:30 Uhr


  • Dies ist nicht die vollständige Lösung. Es ist nur ein Teil der gesamten Methode ODER ein Trick, um einen ähnlichen Effekt zu erzielen.

    – Pe Dro

    28. Juni 2020 um 5:14 Uhr

1370410cookie-checkSo erhalten Sie Magic Color-Effekte wie Cam Scanner mit OpenCV

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy