Durchschnittliche Farbe eines Bildes
Wissenschaftler konnten die durchschnittliche Farbe des Universums bestimmen, aber in wie vielen Bytes können wir die durchschnittliche Farbe auf einem Bild finden?
Deine Aufgabe
Ihre Eingabe wird ein einzelnes Bild sein, das Sie benötigen, um den Durchschnitt der Farben im Bild zu ermitteln und eine hexadezimale Farbfolge ( #??????
) auszugeben . Das Bild kann eines der folgenden Formate haben
- JPEG / JFIF
- JPEG 2000
- TIFF
- GIF
- BMP
- PNG
- PNM
- PPM
Die Eingabe kann auch als URL / URI zum Bild verwendet werden.
Eingebaute Funktionen, die Durchschnittswerte berechnen oder das Bild sofort abtasten, ImageMeasurements
sind nicht zulässig.
Beispiele
Die Ergebnisse unterscheiden sich geringfügig, je nachdem, wie Sie den Durchschnitt berechnen und welche Farbmodelle Sie verwenden. Ich habe RGB- und LCH-Werte (HSV) für die folgenden Bilder hinzugefügt.
Ausgabe: #53715F
RGB, kann auch #3B7D3D
LCH (HSV) sein
Ausgang: #8B7D41
RGB, #96753C
LCH (HSV)
quelle
95.6...
, auf das Sie95
in der angegebenen Ausgabe gerundet haben .Antworten:
Pyth -
2322191816 BytesTransponiert, um alle Kanäle abzurufen, summiert, dividiert und hexiert dann die einzelnen Kanäle. Abschluss durch Verketten und Voranstellen von a
#
.Nimmt einen Bilddateinamen (beliebiger Typ) von stdin und gibt ihn an stdout aus. SEHR LANGSAM .
Probelauf
quelle
PIL
Bibliothek zur Verarbeitung von Bildern verwendet. Suchen Sie hier nach der genauen Quelle.Bash, 46 Bytes
ImageMagick skaliert das Bild auf ein Pixel, das den Durchschnitt der Farben im Bild enthält, und gibt es dann als Text aus.
quelle
MATLAB - 68 Bytes
Das Bild wird eingelesen mit
imread
kombiniert mituigetfile
, um eine GUI zu öffnen und das Bild auszuwählen, in das Sie laden möchten. Die Annahme mit diesem Code ist, dass alle Bilder RGB sind, und um die durchschnittliche Farbe zu berechnen, addieren wir über jeden Kanal einzeln und teilen dann auf durch so viele Elemente wie es in einem Kanal gibt, was die Gesamtzahl der Pixel im RGB-Bild ( ) geteilt durch 3 ist. Da der Durchschnitt möglicherweise Gleitkommawerte erzeugen kann, ist ein Aufruf von erforderlich, um die Zahl auf Null abzurunden . zusammen mit der hexadezimalen Formatierungszeichenfolge ( ) wird verwendet, um jeden ganzzahligen Wert im Durchschnitt in seine hexadezimale Entsprechung zu drucken. Das ist jedoch da, um sicherzustellen, dass eine zusätzliche 0 nach links aufgefüllt wird, sollte der Durchschnittswert für einen Kanal kleiner als 16 seinnumel
(I)
fix
sprintf
%x
02
* .Probeläufe
Das Schöne daran
imread
ist, dass Sie Bilder direkt von URLs einlesen können. Nehmen wir als reproduzierbares Beispiel an, Sie haben die Bilder auf Ihren Computer heruntergeladen und den obigen Code ausgeführt. Zur Demonstration lese ich die Bilder jedoch direkt von Code Golf:Erstes Bild
Zweites Bild
* Hinweis: Dies war eine Zusammenarbeit von StackOverflow-Benutzern im MATLAB- und Octave-Chatroom .
quelle
CJam, 27 Bytes
Dies liest ein PPM-Bild von STDIN.
CJam hat keine eingebaute Bildverarbeitung, daher erwartet dieser Code eine tragbare ASCII-PixMap (magische Zahl P3) mit vollständiger 24-Bit-Palette (Maximalwert 255) und ohne Kommentare.
Testlauf
Wie es funktioniert
quelle
HTML5 + JavaScript (ES6), 335 Byte
Das wird nicht gewinnen, aber ich hatte trotzdem Spaß daran.
Verwendet die HTML5 Canvas API . Die Eingabe ist eine URL eines CORS-fähigen Bildes .
Demo
Da es sich um ES6 handelt, funktioniert es derzeit nur in Firefox und Edge.
quelle
new Image
durchImage()
?TypeError: Constructor Image requires 'new'
W='width'
undH='height'
und verwendeni[H]
oderi[W]
Python [3] + SciPy,
144133121Lädt Pixeldaten, summiert für jeden Kanal, dividiert durch Größe *, Formate. Die Werte sind gegen Null gerundet.
* Größe = Breite * Höhe * Kanäle, also multipliziert mit 3
quelle
input()
für den Weg nutzen? Sie sparen 20 Bytes.import scipy
. Wechseln Siem.imread
zumisc.imread
.NameError: name 'misc' is not defined
. Versuchtfrom scipy import*
, funktioniert auch nicht.from scipy import sum, misc as m
? Sie sparen dann, wenn Sie auch die Summe verwenden.R, 90 Bytes
Der Pfad zur PNG-Datei wird aus STDIN gelesen. Paket
png
muss installiert sein.Schritt für Schritt:
quelle
C 259 Bytes
Nimmt eine PPM-Datei ohne Kommentare auf .
Verarbeiten
Anfangscode:
Variablen trimmen und Schleife entfernen:
Von dort habe ich die verschiedenen Anweisungen zu einer einzigen return-Anweisung zusammengefasst. Entfernte es und alle anderen fremden Typinformationen, benannte Variablen um und schnitt das Leerzeichen aus.
quelle
Cobra - 371
quelle
Java,
449447446430426 BytesDank dieser Antwort auf Stapelüberlauf für den
String.format
Trick.quelle