Neulich fand ich eine interessante Seite namens ASCII Camera. Auf diese Weise wird das Kamerabild vom Browser abgerufen und in eine ASCII-Zeichenfolge konvertiert.
Ich dachte, ich könnte es selbst machen, also beschloss ich, ein Programm zu erstellen, um das Bild in ASCII-Kunst umzuwandeln.
Der Mechanismus ist wie folgt.
Python und OpenCV machen diese Dinge ziemlich einfach.
Der Pfad des zu lesenden Bildes sollte durch Eingabe erhalten werden. Dadurch wird es in Graustufen umgewandelt und das Grau enthält die Dichte (0-255) für jedes Pixel.
import cv2
imgpath = input("Path: ")
img = cv2.imread(imgpath)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Sie müssen die ASCII-Zeichen für jede Pixeldichte (0-255) ermitteln, es sind jedoch nicht 256 tatsächliche ASCII-Zeichen verfügbar. Ich konnte nicht anders, also wählte ich sorgfältig 64 Zeichen aus und entschied mich, die Zeichen auszuwählen, indem ich die Dichte in 4 Teile teilte. Wenn die Dichte beispielsweise 0 bis 3 beträgt, ist sie "M", wenn sie 252 bis 255 beträgt, ist sie "(leer)" und so weiter.
Unten sind 64 Zeichen in der Reihenfolge "hohe Dichte" angeordnet.
MWN$@%#&B89EGA6mK5HRkbYT43V0JL7gpaseyxznocv?jIftr1li*=-~^`':;,.
Es war ziemlich schwierig, diese Reihenfolge zu bestimmen. Die Reihenfolge wird nur durch das Aussehen entschieden, so ist es super geeignet.
Der Konvertierungsprozess sieht folgendermaßen aus.
colorset = "MWN$@%#&B89EGA6mK5HRkbYT43V0JL7gpaseyxznocv?jIftr1li*=-~^`':;,. "
for gray2 in gray:
output += "\n"
for dark in gray2:
output += colorset[dark // 4] * 2
Sie können den Farbsatzindex genau richtig erhalten, indem Sie die Dichte durch 4 teilen und abschneiden. Da das Seitenverhältnis von ASCII-Zeichen 2: 1 beträgt, werden die zu schreibenden Zeichen verdoppelt.
Das abgeschlossene Programm sieht so aus. Das Ergebnis wird in eine Datei ausgegeben.
import cv2
colorset = "MWN$@%#&B89EGA6mK5HRkbYT43V0JL7gpaseyxznocv?jIftr1li*=-~^`':;,. "
imgpath = input("Path:")
img = cv2.imread(imgpath)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
output = ""
for gray2 in gray:
output += "\n"
for dark in gray2:
output += colorset[dark // 4] * 2
with open("output.txt", mode="w") as f:
f.write(output)
Ich werde versuchen, mein Symbol zu konvertieren (dies ↓). Ergebnis ist ...
So was. Ich war überrascht, dass ich es richtig konvertieren konnte.
Als nächstes werde ich ein kostenloses Bild der natürlichen Landschaft von Nordengland versuchen, das von Herrn Pakutaso erhalten wurde und auf 300 x 200 Pixel konvertiert wurde. Ergebnis ist ...
Ja ... ich denke es ist eine gute Linie.
Schließlich habe ich es von Diese Person existiert nicht erhalten, einer Site, auf der AI automatisch Gesichtsfotos generiert. Lassen Sie uns dieses Bild in 250x250px konvertieren und ausführen.
Ergebnis ist ...
Es fühlt sich ziemlich gut an! Das ist gut ... die Mühe hat sich gelohnt ...
So war es mit nur 12 Codezeilen möglich. Diesmal habe ich OpenCV zum ersten Mal berührt, aber ich fand es nicht so praktisch. Es könnte interessant sein, dasselbe in Unicode mit 256 Zeichen zu versuchen.