2010-03-01 3 views
5

Ich habe eine ganze Reihe von Bildern von Illustrationen, die ich auf eine kleinere Vorschaugröße zuschneiden möchte.Was ist ein guter Algorithmus oder eine Bibliothek zum Zuschneiden von Bildern, um Leerzeichen oder leere Bereiche zu vermeiden?

Das Problem ist, dass ich sie zuschneiden will, um einen "interessanten" Teil der Illustration zu zeigen (dh Bereiche von Leerzeichen zu vermeiden).

Die Bilder haben normalerweise eine flache Farbe oder einen feinen Farbverlauf für den Hintergrund. Sie sind meist Vektor-Art-Artwork mit ziemlich unterschiedlichen Formen.

Hier sind einige Beispiele: link ;-)

Ich habe über die Verwendung von irgendeiner Art von Bildmerkmalserkennungsalgorithmus mit einem Schiebefenster Denken Sie den Bereich mit der größten Anzahl von Funktionen zu finden.

Ich implementiere dies in PHP, aber es macht mir nichts aus, es selbst zu implementieren, wenn keine Bibliothek oder Erweiterung verfügbar ist.

Ideen?

+0

Sind diese professionellen Fotos? Wenn ja, überprüfen Sie die Drittel-Regel, sollte zumindest die verschiedenen Bereiche zu "sehen" zu verringern. –

+0

Ist der "Whitespace" wirklich eine feste Farbe oder nur wenige funktionsreiche Bereiche des Bildes? – Matthew

Antwort

1

Nun, Sie sollten vielleicht nur einen Kantenerkennungsalgorithmus verwenden. Wählen Sie den Bereich mit der größten Anzahl an Kanten aus. Verleihen Sie Kanten, die nicht verschwommen sind (wie sie vom Hintergrund stammen können), ein höheres Gewicht.

1

ImageMagick for PHP hat automatische Generierung von thumbnails. Diese SO question hat eine Verknüpfung zu einem ImageMagick Auto-Crop-Operator, und ich bin mir nicht sicher, aber ich denke this ist die PHP-Schnittstelle dazu.

Von the link:

Bool Imagick :: trimImage (float $ Flaum)
Kanten entfernen, die die Hintergrundfarbe aus dem Bild sind.

Für allgemeinere „Interestingness“, versuchen Sie vielleicht eine inverse von seam carving (die höchste Energie zu finden, anstatt niedrigsten Energiebereiche).

2

ImageMagick hat einen trim Betrieb. Es ist als eine Bibliothek verfügbar, aber ich weiß nicht, wie schwer es ist, von PHP zu verwenden. Es gibt einige PHP interfaces.

1

OK, also hier, was ich getan habe in den Beispielen nach einem Blick:

Summe alle Zeilen und alle Spalten eines jeden Bildes. Sie werden zwei Arrays erhalten, die beide wie folgt aussehen:

 /-----\ /--\ 
    _/  -- | 
___-    \_________ 

von ein paar Bilder auf diesen Arrays suchen, eine geeignete Schwelle (wahrscheinlich etwas knapp über Null) finden. Dann müssen Sie die Grenze ganz links und ganz rechts überschneiden, wo Sie zuschneiden müssen. Ich hoffe, ich habe es geschafft, es klar zu machen, wenn nicht - frag!

+1

Summen Sie die Zeilen und Spalten nicht zusammen, summieren Sie die * Differenzen * zwischen einer Zeile/Spalte und der nächsten. –

1

Ein CLI-Programm mit http://pecl.php.net/package/imagick:

<?php 
    dl('imagick.so'); 

    $img = new Imagick(); 
    $img->readImage($argv[1]); 

    # (* 0.0: exact match; * 1.0: crop entire image) 
    $fuzz = current($img->getQuantumRange()) * 0.25; 

    $img->trimImage($fuzz); 

    $img->writeImage($argv[2]); 
?> 

Es sollte gut genug funktionieren, solange das Bild nicht über einen Rahmen um seine Grenze.

1

Hier ist ein fairly simple approach, der einen Kantenerkennungsfilter verwendet und dann um die Bildmitte herum schneidet, um ein Miniaturbild zu erzeugen. Es funktioniert ziemlich gut auf den meisten Bildern, aber nicht, wenn es mehr als ein Thema gibt. Ich bin offen für Vorschläge zu anderen Möglichkeiten, die "interessanten" Punkte in einem Quellbild zu identifizieren.

1

Drupal hat ein Projekt smartcrop genannt, die PHP-Code muss höchste Entropie und „interessant“ Bereiche in Bildern finden. Siehe die output examples.

sollten Sie in der Lage sein, auch die Funktionen in dem Modul und die Bibliothek in keiner-Drupal-Projekten zu verwenden.

Verwandte Themen