Wie jeder Amateurfotograf Ihnen sagen kann, ist extreme Nachbearbeitung immer gut. Eine solche Technik wird " Miniatur-Fälschung " genannt.
Das Ziel ist es, ein Bild wie eine Fotografie einer miniaturisierten Spielzeugversion von sich selbst aussehen zu lassen. Dies funktioniert am besten für Fotos, die aus einem mittleren / hohen Winkel zum Boden mit einer geringen Abweichung in der Motivhöhe aufgenommen wurden, kann jedoch mit unterschiedlicher Effektivität auf andere Bilder angewendet werden.
Die Herausforderung: Nehmen Sie ein Foto auf und wenden Sie einen Miniatur-Fälschungsalgorithmus an. Es gibt viele Möglichkeiten, dies zu tun, aber für die Zwecke dieser Herausforderung läuft es auf Folgendes hinaus:
Selektive Unschärfe
Ein Teil des Bildes sollte unscharf sein, um eine geringe Schärfentiefe zu simulieren. Dies geschieht normalerweise entlang eines linearen oder geformten Gefälles. Wählen Sie einen beliebigen Unschärfe- / Verlaufsalgorithmus aus, aber zwischen 15 und 85% des Bildes müssen "merkliche" Unschärfen aufweisen.
Sättigungsschub
Pumpen Sie die Farbe auf, damit die Dinge so aussehen, als wären sie von Hand bemalt worden. Die Ausgabe muss im Vergleich zur Eingabe eine durchschnittliche Sättigung von> + 5% aufweisen. (mit HSV-Sättigung )
Kontrastverstärkung
Erhöhen Sie den Kontrast, um härtere Lichtverhältnisse zu simulieren (z. B. wenn Sie mit Innen- / Studioleuchten anstatt mit Sonnenlicht sehen). Die Ausgabe muss im Vergleich zur Eingabe einen Kontrast von> + 5% aufweisen. (mit RMS-Algorithmus )
Diese drei Änderungen müssen implementiert werden, und es sind keine weiteren Verbesserungen / Änderungen zulässig. Kein Zuschneiden, Schärfen, Weißabgleichsanpassungen, nichts.
Die Eingabe ist ein Bild und kann aus einer Datei oder einem Speicher gelesen werden. Sie können externe Bibliotheken zum Lesen und Schreiben des Bildes verwenden, sie können jedoch nicht zum Verarbeiten des Bildes verwendet werden. Mitgelieferte Funktionen sind für diesen Zweck ebenfalls nicht zulässig (Sie können beispielsweise nicht einfach anrufen
Image.blur()
).Es gibt keine weiteren Eingaben. Die Verarbeitungsstärken, -niveaus usw. müssen vom Programm und nicht von einem Menschen bestimmt werden.
Die Ausgabe kann als Datei in einem standardisierten Bildformat (PNG, BMP usw.) angezeigt oder gespeichert werden.
Versuchen Sie zu verallgemeinern. Es sollte nicht nur für ein Bild funktionieren , aber es ist verständlich, dass es nicht für alle Bilder funktioniert . Einige Szenen reagieren einfach nicht gut auf diese Technik, egal wie gut der Algorithmus ist. Wenden Sie hier Ihren gesunden Menschenverstand an, wenn Sie antworten oder über Antworten abstimmen.
Das Verhalten ist undefiniert für ungültige Eingaben und für Bilder, die die Spezifikation nicht erfüllen können. Zum Beispiel kann ein Graustufenbild nicht gesättigt werden (es gibt keinen Grundfarbton), ein reines Weißbild kann keinen erhöhten Kontrast aufweisen usw.
Fügen Sie Ihrer Antwort mindestens zwei Ausgabebilder hinzu:
Aus einem der Bilder in diesem Dropbox-Ordner muss eines generiert werden . Es gibt sechs zur Auswahl, aber ich habe versucht, sie alle in unterschiedlichem Maße lebensfähig zu machen. Sie können Beispielausgaben für jede im
example-outputs
Unterordner sehen. Bitte beachten Sie, dass es sich um vollständige 10-Megapixel-JPG-Bilder handelt, die direkt aus der Kamera stammen, sodass Sie eine Menge Pixel zum Bearbeiten haben.Das andere kann ein beliebiges Bild Ihrer Wahl sein. Versuchen Sie natürlich, Bilder auszuwählen, die frei verwendbar sind. Fügen Sie außerdem entweder das Originalbild oder einen Link zum Vergleich hinzu.
Zum Beispiel von diesem Bild:
Sie könnten etwas ausgeben wie:
Als Referenz wurde das obige Beispiel in GIMP mit einer kastenförmigen Gradienten-Gaußschen Unschärfe, Sättigung +80, Kontrast +20 verarbeitet. (Ich weiß nicht, welche Einheiten GIMP für diese verwendet)
Weitere Inspirationen oder eine bessere Vorstellung davon, was Sie erreichen möchten, finden Sie auf dieser oder dieser Website . Sie können auch für die Suche miniature faking
und tilt shift photography
für Beispiele.
Dies ist ein Beliebtheitswettbewerb. Stimmen Sie für die Beiträge ab, von denen Sie glauben, dass sie am besten aussehen, während Sie dem Ziel treu bleiben.
Klärung:
Es war nicht meine Absicht, mathematische Funktionen zu verbieten, um zu klären, welche Funktionen nicht zulässig sind . Es war meine Absicht, Bildmanipulationsfunktionen zu verbieten . Ja, da gibt es einige Überlappungen, aber Dinge wie FFT, Faltungen, Matrixmathematik usw. sind in vielen anderen Bereichen nützlich. Sie sollten keine Funktion verwenden, die einfach ein Bild aufnimmt und verwischt. Wenn Sie einen geeigneten mathematischen Weg finden, um eine Unschärfe zu erzeugen , dann dieses faire Spiel.
quelle
GeometricTransformation
,DistanceTransform
,ImageAdd
,ColorNegate
,ImageMultiply
,Rasterize
, undImageAdjust
.) Auch mit Hilfe eines solchen Hochpegel - Bildverarbeitungsfunktionen, setzt sich der Code 22 K auf. Der Code für die Benutzeroberfläche ist dennoch sehr klein.Antworten:
Java: Referenzimplementierung
Hier ist eine grundlegende Referenzimplementierung in Java. Es funktioniert am besten bei High Angle Shots und ist schrecklich ineffizient.
Bei der Unschärfe handelt es sich um eine sehr einfache Rahmenunschärfe, sodass sie viel mehr als nötig über dieselben Pixel verläuft. Der Kontrast und die Sättigung könnten auch in einer einzigen Schleife kombiniert werden, aber die überwiegende Mehrheit der aufgewendeten Zeit entfällt auf Unschärfe, sodass davon kein großer Nutzen zu erwarten ist. Davon abgesehen funktioniert es ziemlich schnell bei Bildern mit weniger als 2 Megapixeln. Die Fertigstellung des 10-Megapixel-Images hat einige Zeit in Anspruch genommen.
Die Unschärfe-Qualität kann leicht verbessert werden, indem grundsätzlich alles andere als eine flache Rahmenunschärfe verwendet wird. Die Kontrast- / Sättigungsalgorithmen machen ihren Job, also keine wirklichen Beschwerden.
Es gibt keine wirkliche Intelligenz im Programm. Dabei werden konstante Faktoren für Unschärfe, Sättigung und Kontrast verwendet. Ich habe damit herumgespielt, um glückliche mittlere Einstellungen zu finden. Infolgedessen gibt es einige Szenen, die nicht sehr gut funktionieren. Beispielsweise pumpt es den Kontrast / die Sättigung so stark, dass Bilder mit großen, ähnlich gefärbten Bereichen (etwa Himmel) in Farbbänder aufbrechen.
Es ist einfach zu bedienen; Übergeben Sie einfach den Dateinamen als einziges Argument. Die Ausgabe erfolgt in PNG, unabhängig von der Eingabedatei.
Beispiele:
Aus der Dropbox-Auswahl:
Diese ersten Bilder werden zur Erleichterung der Veröffentlichung verkleinert. Klicken Sie auf das Bild, um es in voller Größe zu sehen.
Nach:
Vor:
Sonstiges Auswahl:
Nach:
Vor:
quelle
C #
Anstatt iterative Box-Unschärfen zu machen, habe ich beschlossen, den gesamten Weg zu gehen und eine Gaußsche Unschärfe zu schreiben. Die
GetPixel
Aufrufe verlangsamen den Vorgang bei Verwendung großer Kernel erheblich, aber es lohnt sich nicht, die verwendeten Methoden zu konvertieren, esLockBits
sei denn, wir haben einige größere Bilder verarbeitet.Im Folgenden sind einige Beispiele aufgeführt, die die von mir festgelegten Standard-Optimierungsparameter verwenden (ich habe nicht viel mit den Optimierungsparametern gespielt, da sie für das Testbild gut zu funktionieren schienen).
Für den Testfall vorgesehen ...
Ein weiterer...
Ein weiterer...
Die Erhöhung der Sättigung und des Kontrasts sollte im Code relativ einfach sein. Ich mache das im HSL-Raum und konvertiere es zurück in RGB.
Der 2D-Gauß-Kernel wird basierend auf der
n
angegebenen Größe generiert , mit:... und normalisiert, nachdem alle Kernelwerte zugewiesen wurden. Beachten Sie das
A=sigma_x=sigma_y=1
.Um herauszufinden, wo der Kernel angewendet werden soll, verwende ich ein Weichzeichnungsgewicht, das berechnet wird durch:
... was eine anständige Reaktion ergibt, im Wesentlichen eine Ellipse von Werten erzeugt, die vor der Unschärfe geschützt sind, die allmählich weiter nachlässt. Ein Bandpassfilter in Kombination mit anderen Gleichungen (möglicherweise einer Variante davon
y=-x^2
) könnte hier möglicherweise für bestimmte Bilder besser funktionieren. Ich habe mich für den Cosinus entschieden, weil er für den von mir getesteten Basisfall eine gute Antwort lieferte.quelle
Java
Verwendet eine schnelle, durchschnittliche Zwei-Wege-Box-Unschärfe, um schnell genug zu sein, um mehrere Durchläufe durchzuführen und eine Gaußsche Unschärfe zu emulieren. Die Unschärfe ist ein elliptischer Farbverlauf anstatt auch bi-linear.
Optisch funktioniert es am besten bei großen Bildern. Hat ein dunkleres, grungieres Thema. Ich bin glücklich darüber, wie die Unschärfe bei Bildern mit angemessener Größe auftrat. Es ist ziemlich allmählich und schwer zu erkennen, wo sie "beginnt".
Alle Berechnungen für Arrays aus ganzen oder doppelten Zahlen (für HSV).
Erwartet den Dateipfad als Argument und gibt die Datei an derselben Stelle mit dem Suffix "miniaturized.png" aus. Zeigt auch die Eingabe und Ausgabe in einem JFrame zur sofortigen Anzeige an.
(Klicken, um große Versionen zu sehen, sie sind viel besser)
Vor:
Nach:
Möglicherweise muss ich eine intelligentere Tonzuordnung oder Luma-Erhaltung hinzufügen, da es ziemlich dunkel werden kann:
Vor:
Nach:
Immer noch interessant, bringt es in eine ganz neue Atmosphäre.
Der Code:
quelle
J
Das war eine schöne Herausforderung. Die Einstellungen für Unschärfe, Sättigung und Kontrast sind fest programmiert, können jedoch bei Bedarf problemlos geändert werden. Der fokussierte Bereich ist jedoch als horizontale Linie in der Mitte fest codiert. Es kann nicht einfach wie die anderen Einstellungen geändert werden. Es wurde ausgewählt, da die meisten Testbilder Ansichten über eine Stadt bieten.
Nach einer Gaußschen Unschärfe habe ich das Bild horizontal in 5 Regionen aufgeteilt. Die oberen und unteren Bereiche erhalten 100% der Unschärfe. Der mittlere Bereich erhält 0% der Unschärfe. Die beiden verbleibenden Bereiche werden proportional zum inversen Würfel von 0% auf 100% skaliert.
Der Code soll in J als Skript verwendet werden, und dieses Skript befindet sich in demselben Ordner wie
input.bmp
das Eingabebild. Es wirdoutput.bmp
eine gefälschte Miniatur der Eingabe erstellt.Die Leistung ist gut und auf meinem PC mit einem i7-4770k dauert es ungefähr 20 Sekunden, um ein Bild vom OP-Set zu verarbeiten. Zuvor dauerte es ungefähr 70 Sekunden, um ein Bild unter Verwendung der Standardfaltung mit dem
;._3
Subarray-Operator zu verarbeiten. Die Leistung wurde durch Verwendung von FFT zur Durchführung der Faltung verbessert.Dieser Code erfordert die
bmp
undmath/fftw
Addons installiert werden. Sie können sie mitinstall 'bmp'
und installiereninstall 'math/fftw'
. Auf Ihrem System muss möglicherweise auch diefftw
Bibliothek installiert werden.quelle