Das Beschneiden von leeren Außenbereichen mit ImageMagick funktioniert nicht für gescannte Dokumente

1342
caw

Angesichts eines Bildes, das einen tatsächlichen Inhalt enthält und normalerweise etwas unerwünschtes Weiß oder Schwarzes oder Transparenz aufweist, möchte ich die Außenteile mit ImageMagick beschneiden oder ausschneiden.

Das folgende Bild wurde digital auf einem Computer (im HTML-Format <canvas>) gezeichnet :

canvas.png

Den folgenden ImageMagick-Befehl habe ich ausprobiert:

$ convert canvas.png -trim +repage canvas_trimmed.png 

Und es hat perfekt funktioniert:

canvas_trimmed.png

Das ist also genau das, was ich will. Nun möchte ich aber auch, dass dies mit gescannten Dokumenten funktioniert, die nicht so "perfekt" sind wie computergenerierte Bilder, dh sie haben mehr "Weiß" und "Schwarz" und keine Transparenz, die einfacher zu erkennen wäre. Manchmal haben sie sogar schwarze Balken um den weißen Hintergrund des Papiers, weil der Scannerbereich größer ist als das Papier:

scan.jpg

Mit diesem Bild habe ich die folgenden Befehle in der angegebenen Reihenfolge ausprobiert, wobei jeder versucht, aggressiver zu sein, aber keines davon zu Ergebnissen führt - Sie können keinen Unterschied zwischen dem Originalbild und den "getrimmten" Bildern sehen, dh beim Zuschneiden oder Zuschneiden funktioniert überhaupt nicht:

$ convert scan.jpg -trim +repage scan_trimmed.jpg $ convert scan.jpg -fuzz 10% -trim +repage scan_trimmed.jpg $ convert scan.jpg -fuzz 60% -trim +repage scan_trimmed.jpg $ convert scan.jpg -fuzz 60% -bordercolor white -border 1x1 -trim +repage scan_trimmed.jpg $ convert scan.jpg -fuzz 60% -bordercolor black -border 1x1 -trim +repage scan_trimmed.jpg 

Was mache ich hier falsch? Wie kann der ImageMagick-Befehl, der computergenerierte Bilder zuverlässig trimmt, so geändert werden, dass er gescannte Dokumente des oben genannten Stils genauso zuverlässig trimmt?

4
Wenn Sie Ihr gescanntes Bild betrachten, weisen die Seiten deutlich einige nicht weiße Bereiche auf. Das bedeutet für ImageMagick immer noch Inhalte, die nicht zugeschnitten werden können, da das Bild noch Inhalte enthält. Keine einfache Lösung, die ich kenne. JakeGould vor 6 Jahren 0
Warum kompliziert? Verwenden Sie die automatische Zuschneidefunktion in Ihrem Scannertreiber, und Sie sind fertig. Einige Scannertreiber bieten auch die Entfernung dunkler Kanten an, wie in Ihrem gescannten Beispiel gezeigt. Vielleicht bietet ImageMagick auch eine solche Entfernung dunkler Kanten an. user291737 vor 6 Jahren 0
@ user291737 Danke! Ich wünschte, das wäre möglich, aber nicht. Es ist leicht vorstellbar, dass einige Anwendungsfälle nicht möglich sind: Ihr Scanner unterstützt diese Funktion möglicherweise nicht, Sie können die Verarbeitung für einen anderen Benutzer ausführen (der den Scanner verwendet hat, auf den Sie keinen Zugriff haben) usw. caw vor 6 Jahren 0
Wie wäre es mit potenziellem Testen mit [-shave] (http://www.imagemagick.org/script/command-line-options.php?#shave) und prüfen, ob Sie sich einfach [rasieren] (http: //www.imagemagick .org / Usage / crop / # shave) die Kanten ab und verwenden Sie dann die Logik, die Sie verwenden? Lassen Sie mich wissen, wenn das hilft, aber schauen Sie sich beide Links an, wenn Sie eine Chance haben Pimp Juice IT vor 6 Jahren 1
Schauen Sie sich Fred's ImageMagick-Skripts [autotrim] (http://www.fmwconcepts.com/imagemagick/autotrim/) und [multicrop] (http://www.fmwconcepts.com/imagemagick/multicrop/) an. Siehe diesen [verwandten Artikel] (http://start.sethanil.com/exploring-software/49-image_cropping). harrymc vor 6 Jahren 0

3 Antworten auf die Frage

3
Pimp Juice IT

Sie können mit -shave und einfach rasieren die Kanten ab und verwenden Sie dann die Logik, die Sie danach entsprechend zu verarbeiten, verwenden.

Hinweis: Der Betrag, den Sie rasieren weg (zB das Argument nach „-shave“ 40x40oder 10x10, etc.) ist wichtig, so sicher sein, gründlich zu testen diese Einstellung, um sicherzustellen, für Ihre Bilder überall in Ihrer Umgebung funktioniert.

Beispiellogik

@ECHO ON  SET Convert="C:\Program Files\ImageMagick\Convert.exe" %convert% C:\Folder\Circle.jpg -shave 40x40 C:\Folder\ShavedCircle.jpg <The rest of your logic against C:\Folder\ShavedCircle.jpg now> 

Vor

enter image description here

Nach dem

enter image description here


Weitere Ressourcen

  • Rasieren, Kanten aus einem Bild entfernen

    Die Umkehrung der Operatoren "-border" oder "-frame" ist " -shave ". Wenn dieselben Argumente angegeben werden, wird der durch diese Befehle hinzugefügte Speicherplatz entfernt.

    Beachten Sie bei diesen drei Operatoren vor allem, dass sie auf gegenüberliegenden Seiten der Bilder Platz hinzufügen und entfernen, nicht nur auf einer Seite oder auf benachbarten Seiten.

    Wenn Sie nur eine Kante eines Bildes entfernen möchten, müssen Sie stattdessen den Operator "-chop" verwenden. (Siehe die Chop-Beispiele unten).

    Wie zuvor wirken alle Operatoren "-border", "-frame" und " -shave " nur auf das virtuelle Bild auf der virtuellen Leinwand und nicht auf die virtuelle Leinwand selbst.

    Quelle

Danke dafür! Nun, die '-shave'-Option funktioniert gut, zumindest scheint es so. Ich kannte diese Option nicht (irgendwie immer übersehen) und es ist sehr hilfreich für die Kanten. Bei Verwendung von "-shave 90x90" für das Beispielbild sind alle Kanten weg. * Aber *, die Kanten waren nie das einzige Problem. Selbst wenn Sie sie vollständig entfernt haben, und selbst bei nachsichtigen Einstellungen wie "-fuzz 80%", wird der obere weiße Teil nur dann entfernt, wenn überhaupt. Es scheint, dass in den weißen Bereichen, die vom Scanner erzeugt werden, etwas "Schmutz" vorhanden ist, der verhindert, dass "-trim" funktioniert. Vielleicht gibt es keine bessere Lösung. caw vor 6 Jahren 0
Noch nicht ganz sicher, weil es das Problem nicht wirklich gelöst oder die vollständige Frage beantwortet hat, sondern nur einen Teil davon angesprochen hat. Jedenfalls habe ich die Prämie (+100) bereits vergeben. caw vor 6 Jahren 0
Es ist eigentlich genau das Bild aus der Frage, mit der ich arbeite: https://i.stack.imgur.com/yVhlM.jpg Ich habe alle Befehle und Optionen mit diesem Bild ausprobiert. Funktioniert nicht für mich. caw vor 6 Jahren 0
Danke noch einmal! Zusammen mit Ihrer zweiten Antwort funktioniert dies tatsächlich perfekt. caw vor 6 Jahren 0
1
Pimp Juice IT

Entfernen Sie mit ImageMagick Schmutzflecken oder Geräusche aus Bildern

Im Folgenden habe ich die Schmutzflecken in der Bilddatei aus dem Bild in Ihrer Frage entfernt, aber ich habe die Rasur mit der 90x90ersten verwendet, und Sie haben bestätigt, dass das Problem von der anderen Lösung gelöst wurde, für die ich eine Lösung gefunden hatte die prämierte Prämie.

Beispiellogik

@ECHO ON  SET Convert="C:\Program Files\ImageMagick\Convert.exe" %convert% C:\Folder\Circle.jpg -shave 90x90 C:\Folder\ShavedCircle.jpg %convert% C:\Folder\ShavedCircle.jpg -write MPR:source ^ -morphology close rectangle:3x4 ^ -morphology erode square MPR:source -compose Lighten -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ C:\Folder\cleaned.jpg 

Vor

Nach dem


Aufgrund der Art des Klingelrauschens sind alle schwarzen Rauschflecken um mindestens 1 Pixel von den Buchstaben getrennt.

Ein guter Ansatz, um dieses Rauschen zu entfernen, besteht darin, das Bild so zu erweitern, dass mindestens ein "Seed" -Teil jedes Buchstabens übrig bleibt. Diese Seeds werden dann abgetragen, während das Originalbild als Maske verwendet wird. praktisch eine Flutfüllung für jeden Buchstaben.

Auf diese Weise bleibt die Form der Buchstaben und anderer großer Flecken perfekt erhalten, und kleinere Flecken verschwinden.

Das größte Dilatat, das immer noch einen Teil jeder Buchstabenform hinterlässt, scheint ein 3x4-Rechteck für die Beispieldaten zu sein. Verwenden Sie vielleicht etwas kleineres, um auf der sicheren Seite zu sein.

Dieser Befehl erweitert zuerst das 3x4-Rechteck, endet dann, bis die Buchstaben wieder vollständig sind

Code

convert cleanup.tif -write MPR:source ^ -morphology close rectangle:3x4 ^ -morphology erode square MPR:source -compose Lighten -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ cleaned.png 

Quelle


Weitere Ressourcen

Wenn Sie dies vor dem anderen Befehl ('-trim') tun, wird das Bild wie gewünscht bereinigt und getrimmt. Danke vielmals! caw vor 6 Jahren 0
1
caw

Was letztendlich perfekte Ergebnisse lieferte, zumindest für mein spezifisches Beispiel in der ursprünglichen Frage ( scan.jpg), war die folgende zweistufige Lösung:

convert \ scan.jpg \ -write MPR:source \ -morphology close rectangle:3x4 \ -clip-mask MPR:source \ -morphology erode:8 square \ +clip-mask \ scan_intermediate.jpg  convert scan_intermediate.jpg -shave 40x40 -fuzz 10% -trim +repage scan_final.jpg 

Diese Lösung besteht aus drei Teilen:

  1. Der Befehl aus meiner ursprünglichen Frage
  2. Die in dieser Antwort gezeigte Geräuschbeseitigung
  3. Der -shaveBetreiber schlug in dieser Antwort vor