L'autre jour, j'ai trouvé un site intéressant appelé ASCII Camera. De cette façon, il obtient l'image de la caméra du navigateur et la convertit en une chaîne de caractères ASCII.
J'ai pensé que je pouvais le faire moi-même, alors j'ai décidé de créer un programme pour convertir l'image en art ASCII.
Le mécanisme est le suivant.
Python et OpenCV rendent ces choses assez faciles.
Le chemin de l'image à lire doit être obtenu par saisie. Cela le convertira en échelle de gris et le gris contiendra la densité (0-255) pour chaque pixel.
import cv2
imgpath = input("Path: ")
img = cv2.imread(imgpath)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Vous devez déterminer les caractères ASCII pour chaque densité de pixels (0-255), mais il n'y a pas 256 caractères ASCII réels disponibles. Je n'ai pas pu m'en empêcher, j'ai donc soigneusement sélectionné 64 caractères à utiliser et j'ai décidé de sélectionner les caractères en divisant la densité en 4 parties. Par exemple, si la densité est de 0 à 3, c'est "M", si c'est 252-255, c'est "(vide)", et ainsi de suite.
Vous trouverez ci-dessous 64 caractères classés par ordre «haute densité».
MWN$@%#&B89EGA6mK5HRkbYT43V0JL7gpaseyxznocv?jIftr1li*=-~^`':;,.
Il était assez difficile de décider de cet ordre. L'ordre est juste décidé par l'apparence, donc c'est super approprié.
Le processus de conversion ressemble à ceci.
colorset = "MWN$@%#&B89EGA6mK5HRkbYT43V0JL7gpaseyxznocv?jIftr1li*=-~^`':;,. "
for gray2 in gray:
output += "\n"
for dark in gray2:
output += colorset[dark // 4] * 2
Vous pouvez obtenir l'index du jeu de couleurs juste en divisant la densité par 4 et en la tronquant. Le rapport hauteur / largeur des caractères ASCII étant de 2: 1, les caractères à écrire sont doublés.
Le programme terminé ressemble à ceci. Le résultat est sorti dans un fichier.
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)
J'essaierai de convertir mon icône (ceci ↓). Le résultat est ...
Comme ça. J'ai été surpris de pouvoir le convertir correctement.
Ensuite, je vais essayer une image gratuite du paysage naturel du nord de l'Angleterre reçu de M. Pakutaso converti en 300 x 200px. Le résultat est ...
Ouais ... je pense que c'est une bonne réplique.
Enfin, je l'ai obtenu de Cette personne n'existe pas, un site où l'IA génère automatiquement des photos faciales. Convertissons cette image en 250x250px et exécutons-la.
Le résultat est ...
Ça fait du bien! C'est bien ... ça valait la peine ...
C'était donc possible avec seulement 12 lignes de code. J'ai touché OpenCV pour la première fois cette fois, mais je ne l'ai pas trouvé si pratique. Il peut être intéressant d'essayer la même chose en Unicode de 256 caractères.
Recommended Posts