Explication détaillée de la façon d'utiliser Python pour convertir des images en peintures de personnages

黄舟
Libérer: 2017-08-22 13:24:34
original
2691 Les gens l'ont consulté

Cet article présente principalement l'exemple de conversion d'images en peintures de personnages en Python. L'éditeur pense que c'est plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence. Venez jeter un œil avec l'éditeur.

La peinture de personnages est vraiment intéressante. La peinture de personnages est générée en remplaçant les pixels de l'image par des personnages.

Mais les pixels ont des couleurs différentes. Comment encoder des pixels de couleurs différentes en caractères correspondants ?

Méthode de conversion :

  • Convertir les images couleur en images en niveaux de gris

  • Selon la profondeur de couleur Valeurs RVB (plage de valeurs de 0 à 255, où 0 est noir et 255 est blanc)

  • Implique votre jeu de caractères préféré

  • Selon la séquence du jeu de caractères et la longueur du jeu de caractères, la valeur RVB est codée dans le caractère correspondant.

RVB

Le mode couleur RVB est basé sur trois canaux de couleur : rouge (R), vert (V) et bleu (B). . RVB représente les couleurs des trois canaux rouge, vert et bleu. Cette norme inclut presque toutes les couleurs que la vision humaine peut percevoir.

Normalement, les RVB ont chacun 256 niveaux de luminosité, exprimés numériquement de 0, 1, 2... jusqu'à 255. Notez que même si le nombre le plus élevé est 255, 0 est également l'une des valeurs, il y a donc 256 niveaux au total.

Image en niveaux de gris

L'image en niveaux de gris fait référence à une image qui contient uniquement des informations sur la luminosité et ne contient pas d'informations sur la couleur, tout comme les photos en noir et blanc que nous voyons habituellement : la luminosité De l’obscurité à la lumière, le changement est continu.

Par conséquent, pour représenter une image en niveaux de gris, la valeur de luminosité doit être quantifiée. Il est généralement divisé en 256 niveaux de 0 à 255, dont 0 est le plus sombre (complètement noir) et 255 est le plus clair (complètement blanc). Dans la méthode d'expression de la couleur, en plus du RVB, la formule de conversion du RVB dans les images couleur en valeur de gris Gray est :


#在PIL中,从模式“RGB”转换为“L”模式(灰度模式)
Gray = 0.299R+0.587G+0.114B
Copier après la connexion

Par exemple, nous utilisons des minuscules Anglais 26 Alphabet comme jeu de caractères. La capacité du jeu de caractères est de 26 (la largeur de l'intervalle de valeur correspondant à un caractère = 256/longueur du jeu de caractères)

La largeur de l'intervalle ici est 256/26=9,8),

La relation correspondante entre gris et jeu de caractères :

Caractères correspondants à l'intervalle de gris


[0.0, 9.8)这|a
[9.8, 19.6)|b
[19.6, 29.4)|c
...|...
[225.6, 235.4]|x
[235.4, 245.2]|y
[245.2, 255.0]|z
Copier après la connexion

Fonction de conversion RVB


char_string = 'abcdefghijklmnopqrstuvwxyz'

def rgb2char(r, g, b):
  length = len(char_string)
  gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)

  # 每个字符对应的gray值区间宽度
  unit = (256.0 + 1) / length

  # gray值对应到char_string中的位置(索引值)
  idx = int(gray / unit)
  return char_string[idx]
Copier après la connexion

Prétraitement

Si la taille est trop grande ou trop petite, le dessin du personnage ne peut pas être reconnu lorsque nous ouvrons le txt déposer. Vous devez donc d'abord ajuster la taille de l'image à la taille appropriée. Notez ici que vous pouvez modifier le coefficient delta du coefficient de mise à l'échelle selon vos besoins


from PIL import Image

#预处理(将图片尺寸压缩,并转为灰度图) 
def preprocess(img_path,delta=100):
  img = Image.open(img_path) 
  # 获取图片尺寸
  width, height = img.size
  # 获取图片最大边的长度 if width > height:
    max = width
  else:
    max = height

  # 伸缩倍数scale
  scale = max / delta
  width, height = int(width / scale), int(height / scale)
  img = img.resize((width, height)) 
  return img
Copier après la connexion

Convertir l'image en caractère

Lire l'image selon Les coordonnées obtiennent le tuple RVB de ce pixel et sont codées sous forme de caractères


def img2char(img_obj, savepath):
  txt = ''
  width, height = img_obj.size
  # 获取像素点的rgb元组值,如(254, 0, 0),并将其转化为字符
  for i in range(height):
    line = ''
    for j in range(width):
      line += rgb2char(*img_obj.getpixel((j, i)))
    txt = txt + line + '\n'

  # 保存字符画
  with open(savepath, 'w+', encoding='utf-8') as f:
    f.write(txt)




img_obj = preprocess(img_path)
img2char(img_obj, savepath)
Copier après la connexion

Insérer une image

Changez char_string et transformez l'effet souhaité

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal