Как спасти карьеру Цзянь Хуанга — Python для рисования пиксельных карт

искусственный интеллект Python Ресурсы изображений Icon
Как спасти карьеру Цзянь Хуанга — Python для рисования пиксельных карт

Добро пожаловать на главный сайт Jizhi:Jizhi, двигатель, ведущий к эре интеллекта

Уведомление!

Все коды в этой статье можно запускать и отлаживать в Jizhiyuan Post. Студенты, которым это нужно, могуткликните сюдаперейти к исходному сообщению



01. ASCII-арт

ASCIIПолное имяAmerican Standard Code for Information Interchange, Американский стандартный код для обмена информацией. Он был разработан на основе военного телеграфного кодирования и стал самой распространенной современной системой компьютерного кодирования.

В те дни, когда видеокарты не могли уничтожать боевые группы авианосцев, компьютеры в основном использовались для расчета баллистики ракет и спутниковых орбит, а их возможности обработки графики были очень слабыми, даже не такими хорошими, как современные передовые осциллографы. Но это не останавливает стремление человечества к прекрасному, как дикость 40 000 лет назад не помешала рождению наскальных рисунков Ласко.

拉斯科洞窟壁画

Когда я впервые вышел в интернет, там был широко распространен пост, в котором вас учили смотреть «Звездные войны» в командной строке, и эти «Звездные войны» состоят из символов в кодировке ASCII, которая называетсяASCII art

ASCII星球大战

Сегодня, когда Doutu заменяет набор текста, VOD превратился в прямую трансляцию и даже в VR/AR, обработка графики больше не является узким местом, а стала новой точкой роста. Дорога высотой в один фут, дьявол высотой в один фут, а развитие технологий также принесло вредную информацию, такую ​​как порнографическая информация, которая особенно беспокоит родителей и друзей. Вначале идентификация порнографии производилась вручную.Товарищ Ли Ди стал хитом, сыграв роль Тан Ма Ру, мастера Желтого Императора, в «Великом происшествии».

Однако быстро прогрессирует и распознавание изображений на основе искусственного интеллекта, и автоматическая идентификация желтого цвета получила практическое применение.

02. Живопись персонажей

Преобразование фотографии в рисунок персонажа требует примерно трех шагов:

  1. Сжать размер изображения до приемлемого уровня для рисунков персонажей;
  2. Цветное изображение преобразуется в изображение в градациях серого, а градации серого имеют значение от 0 до 255;
  3. Установите отношение сопоставления между значением серого и набором символов.

В первые годы для выполнения вышеуказанных шагов по-прежнему требовалось небольшое программное обеспечение, но теперь только простой код может быть непосредственно реализован в браузере.

典型的字符画,看窗口边框大概就知道年代

Поскольку сутью рисования персонажа является «персонаж», который можно открыть текстовым редактором, для компьютера они ничем не отличаются от других персонажей, а характер «рисования» приобретается только человеческим воображением. Поэтому, если вы используете форму рисования персонажей для распространения эротических картинок, вам все равно нужен Тан Ма Ру.

03. Библиотека расширений Python

Для базовых функций генерации рисунков персонажей в Python встроено множество отличных библиотек расширений, которые можно вызывать прямо на этой основе, не повторяя изготовление колес.

  • LibraryPIL (библиотека изображений Python)

    Основные функции обработки изображений.

  • URL-адрес сетевой библиотеки

    Получите сетевые ресурсы, такие как загрузка изображений из Интернета.

from PIL import Image # 图像处理模块
from urllib import request #网络请求模块

Нет необходимости сопоставлять значения оттенков серого от 0 до 255 разным символам один за другим, обычно достаточно дюжины или около того. Вот определения:

ASCII_CHARS = [' ', '#', '?', '%', '.', '+', '.', '*', ':', ',', '@']

Здесь самый низкий сегмент оттенков серого отображается как' '(пробел), то есть пустая или почти пустая часть исходного изображения также станет пустой в рисовании персонажа, а черная точка исходного изображения станет@.

Читатели и друзья могут определять своих собственных персонажей в среде открытого кода, которая следует ниже, и могут передавать любые сетевые изображения для экспериментов.

04. Предварительная обработка изображения

Экраны 4K постепенно стали популярными, и почти такие же компьютерные мониторы также могут поддерживать разрешение 2K.Если каждый пиксель превратить в символ, результирующая картинка будет действительно слишком большой.

Поэтому исходное изображение необходимо сначала сжать, а затем преобразовать в режим оттенков серого, то есть выкинув информацию о цвете.

# 压缩图片
def scale_image(image, new_width=60):
    (original_width, original_height) = image.size # 获取原图尺寸
    aspect_ratio = original_height/float(original_width) * 0.5 # 计算高宽比,因为输出文本有2倍行距,所以乘0.5维持高宽比
    new_height = int(aspect_ratio * new_width)
    new_image = image.resize((new_width, new_height))
    return new_image

# 灰度模式
def convert_to_grayscale(image):
    return image.convert('L') # 调用image对象自己的.convert()方法

05. Картинка к персонажу

Затем необходимо установить взаимосвязь отображения между пикселями изображения (после сжатия) и набором символов.

def map_pixels_to_ascii_chars(image, range_width=25):

    # 将每个像素根据其灰度值映射为一个字符,每个字符对应25个灰度值
    pixels_in_image = list(image.getdata()) # 获取原图灰度值列表   
    pixels_to_chars = [ASCII_CHARS[int(pixel_value/range_width)] for pixel_value in pixels_in_image]
    # 对于每个像素点,将其灰度值转换为列表ASCII_CHARS的索引
    return "".join(pixels_to_chars)[/amalthea_sample_code]

Наконец, предыдущие функции интегрированы для вывода рисунков персонажей в текстовом виде.

def convert_image_to_ascii(image, new_width=60):
    image = scale_image(image, new_width) # 调用scale_image()函数,压缩图片
    image = convert_to_grayscale(image) # convert_to_grayscale()函数,转换为灰度图

    pixels_to_chars = map_pixels_to_ascii_chars(image) # 映射至字符集
    len_pixels_to_chars = len(pixels_to_chars) # 获取字符集长度

    image_ascii = [pixels_to_chars[index: index + new_width] for index in range(0, len_pixels_to_chars, new_width)]

    return "\n".join(image_ascii)


def handle_image_conversion(image_filepath, new_width=60):
    image = Image.open(image_filepath) # Image.open()打开源图片
    image_ascii = convert_image_to_ascii(image, new_width) # 调用上面的convert_image_to_ascii()函数
    print(image_ascii) # 输出字符画

06. Коллекция источников изображений

Далее мы можем преобразовать любое изображение в рисунок персонажа, чтобы увидеть эффект.Чтобы полностью передать дух Интернета, в настоящее время поддерживаются только изображения с сетевыми адресами (на самом деле система загрузки изображений еще не готова).

Давайте рассмотрим пример, преобразуем иконку пингвина QQ в рисунок персонажа, нажмитебегатьВы можете получить рисунки персонажей.

from PIL import Image

ASCII_CHARS = [' ', '#', '?', '%', '.', '+', '.', '*', ':', ',', '@']


def scale_image(image, new_width=60):
    """Resizes an image preserving the aspect ratio.
    """
    (original_width, original_height) = image.size
    aspect_ratio = original_height/float(original_width) * 0.5
    new_height = int(aspect_ratio * new_width)

    new_image = image.resize((new_width, new_height))
    return new_image


def convert_to_grayscale(image):
    return image.convert('L')


def map_pixels_to_ascii_chars(image, range_width=25):

    pixels_in_image = list(image.getdata())    
    pixels_to_chars = [ASCII_CHARS[int(pixel_value/range_width)] for pixel_value in
            pixels_in_image]

    return "".join(pixels_to_chars)


def convert_image_to_ascii(image, new_width=60):
    image = scale_image(image, new_width)
    image = convert_to_grayscale(image)

    pixels_to_chars = map_pixels_to_ascii_chars(image)
    len_pixels_to_chars = len(pixels_to_chars)

    image_ascii = [pixels_to_chars[index: index + new_width] for index in
            range(0, len_pixels_to_chars, new_width)]

    return "\n".join(image_ascii)

def handle_image_conversion(image_filepath, new_width=60):
    image = Image.open(image_filepath)
    image_ascii = convert_image_to_ascii(image, new_width)
    print(image_ascii)

from urllib import request
    
image_file_path = 'image2ascii.jpg' # 图片的本地名称
image_url = "http://upload.wikimedia.org/wikipedia/en/thumb/9/9c/Tencent_QQ.png/64px-Tencent_QQ.png" # 图片的网络地址
request.urlretrieve(image_url, image_file_path) # 将网络图片下载到本地,并重命名
handle_image_conversion(image_file_path) # 启动handle_image_conversion()这个总函数

07. Открытое пространство

В примере из предыдущего раздела по-прежнему сохраняется набор символов по умолчанию и ширина изображения по умолчанию.60, следующая часть предоставляется читателю для самостоятельной игры, вы можете получить свою собственную раскраску персонажа, изменив следующие параметры:

  • new_width: Размер рисунка персонажа (количество символов по ширине)
  • ASCII_CHARS:набор символов
  • image_url: сетевой адрес образа, который вы хотите преобразовать.

Пример операции:

Увидев картинку в Интернете, щелкните правой кнопкой мыши - скопируйте адрес картинки.

http://weibo.com/kaiser0730

Присвоить адрес изображения переменнойimage_url, нажмитебегатьВот и все.

替换相应变量

from PIL import Image
from urllib import request

def scale_image(image, new_width=60):
    (original_width, original_height) = image.size
    aspect_ratio = original_height/float(original_width) * 0.5
    new_height = int(aspect_ratio * new_width)

    new_image = image.resize((new_width, new_height))
    return new_image

def convert_to_grayscale(image):
    return image.convert('L')

def map_pixels_to_ascii_chars(image, range_width=25):
    pixels_in_image = list(image.getdata())    
    pixels_to_chars = [ASCII_CHARS[int(pixel_value/range_width)] for pixel_value in
            pixels_in_image]

    return "".join(pixels_to_chars)

def convert_image_to_ascii(image, new_width=60):
    image = scale_image(image, new_width)
    image = convert_to_grayscale(image)
    pixels_to_chars = map_pixels_to_ascii_chars(image)
    len_pixels_to_chars = len(pixels_to_chars)
    image_ascii = [pixels_to_chars[index: index + new_width] for index in
            range(0, len_pixels_to_chars, new_width)]
    return "\n".join(image_ascii)

def handle_image_conversion(image_filepath, new_width=60):
    image = Image.open(image_filepath)
    image_ascii = convert_image_to_ascii(image, new_width)
    print(image_ascii)

image_file_path = 'image2ascii.jpg' # 图片的本地名称
new_width = 60 # 字符画宽几个字符    

ASCII_CHARS = [' ', '#', '?', '%', '.', '+', '.', '*', ':', ',', '@'] # 字符集

image_url =  "http://upload.wikimedia.org/wikipedia/en/thumb/9/9c/Tencent_QQ.png/64px-Tencent_QQ.png" # 图片的网络地址
request.urlretrieve(image_url, image_file_path) 

handle_image_conversion(image_file_path, new_width)

Сними очки, чтобы лучше видеть.

Sublime编辑器里的成像效果


Рекомендуемое чтение

Семинар TensorFlow «Фестиваль технологического опыта для девочек»

Этот комментарий ядовит! ——Общая процедура для классификации текста

Я сделал робота по имени Серсея, но она просто хотела, чтобы сир Грегор убивал меня на каждом шагу.