Photoshop hat viele coole künstlerische Filter und ich würde gerne die zugrunde liegenden Algorithmen verstehen.
Ein Algorithmus, der besonders interessant ist, ist der Cutout-Filter (Nummer 2 bei der obigen Verknüpfung).
Es verfügt über drei einstellbare Parameter: Anzahl der Ebenen, Edge Simplicity und Edge Fidelity. Anzahl der Ebenen scheint einen geradlinigen Posterisierungsalgorithmus zu steuern, aber was die anderen Slider technisch machen, entzieht sich mir.
Ich würde denken, dass sie etwas tun, das mit Vornoi-Diagrammen oder k-means-Partitionierung zusammenhängt, aber in Wikipedia herumstochern hat nichts ergeben, was offensichtlich auf das, was Photoshop macht, abstellt, besonders wenn man bedenkt, wie schnell sich der Filter rendert .
Gibt es eine Quelle für technische Beschreibungen der Photoshop-Filter? Oder haben Sie irgendwelche Gedanken darüber, wie dieser spezielle Filter implementiert werden könnte?
Kantenerkennung ist normalerweise ein Sobel- oder Canny-Filter, dann werden die Kanten mit einem Chain-Code zusammengefügt.
Betrachten Sie etwas wie die OpenCV Bibliothek für Details
Ich bin mir nicht sicher, ob es eine Art von Zellschattierung sein könnte, aber es sieht auch wie ein Medianfilter mit einer sehr großen Kernelgröße aus oder wurde mehrmals angewendet.
Die Kante Einfachheit / Wiedergabetreue können Optionen sein, die entscheiden, ob ein benachbartes Pixel (oder eines, das in den Kernel fällt) basierend auf der Farbdifferenz mit dem aktuellen Pixel berücksichtigt werden sollen.
Haben Sie diesen Beitrag gesehen? Es erklärt, wie Sie mit ImageMagic das gleiche Ergebnis erzielen, und IM ist opensource .
Vielleicht nicht genau das, wonach Sie suchen, aber wenn Sie gerne wissen, wie Filter funktionieren, können Sie den Quellcode von GIMP ausprobieren. Ich kann nicht sagen, ob GIMP ein Äquivalent von Cutout-Filter hat, das Sie erwähnt haben, aber es lohnt sich, einen Blick darauf zu werfen, wenn Sie wirklich an diesem Bereich interessiert sind.
Die Anzahl der Ebenen scheint der Zellschattierung zu ähneln und so würde ich diesen Teil in diesem Fall implementieren: Sie nehmen einfach dieses Histogramm des Bildes und teilen es in den "Anzahl der Ebenen" -Betrag auf der Abschnitte berechnen dann einen Durchschnitt für jeden Abschnitt. Jede Farbe im Histogramm verwendet dann diesen Durchschnitt anstelle ihrer ursprünglichen Farbe.
Die anderen beiden Parameter erfordern etwas mehr Denken, aber "Edge simplicity" scheint die Anzahl der Segmente zu explodieren, aus denen die Formen aufgebaut sind. Oder besser gesagt: die Anzahl der Verfeinerungen, die auf einige grobe Bildsegmentierungsalgorithmen angewendet werden. Der Treue-Schieberegler scheint etwas Ähnliches zu tun; es steuert wahrscheinlich eine Art von Schwelle für den Zeitpunkt, an dem die Verfeinerungen stattfinden sollten.
Ich habe eine einfache Lösung, die theoretisch etwas ähnliches zu diesem Filter erzeugen würde. Irgendwie ähnlich dem, was Ismael C vorgeschlagen hat.
Edge Simplicity steuert die Fenstergröße. Vielleicht sollte Fenster gewichtet werden.
Aber anders als bei regulären gefilterten Filtern würde dieser nur einen festen Teil zufälliger Pixel aus diesem Fenster nehmen. Die Größe des Abschnitts wird mit dem Parameter Fidelity gesteuert.
Stellen Sie die Pixelfarbe auf den Median der Probe ein.
Wenn wir einen Posterisierungsalgorithmus haben, wird er danach angewendet.
Hier gehen wir!
Bitte melden Sie die Ergebnisse, wenn Sie sie implementieren.
PS. Ich bezweifle wirklich, dass die Segmentierung überhaupt verwendet wird.
Ich kann mir vorstellen, dass es wahrscheinlich eine Schwellwertmessung, eine Kantenerkennung (Sobel / Canny / Roberts / was auch immer) und eine Posterisierung ist.
Vom Basteln her habe ich das herausgefunden:
Insgesamt sieht es wie eine vereinfachte Version des Live-Trace-Algorithmus von Adobe Illustrator aus, der anstelle von Kurven Polygone verwendet.
... oder vielleicht auch nicht.
Tags und Links algorithm language-agnostic image-processing photoshop reverse-engineering