demo:

ascii art generator

input

output

program

cat.jpg

text

demo:

ascii art generator

How does this work??

First, we need to understand that all colors are just numbers

These are RGB sensors (aka "cones") in the human eye. We have a few million of these, which is equivalent to "megapixels"

Inspired by...

the human eye!!!

where else is this applied?

artificial intelligence:
"computer vision"
photobooth effects
SNAPCHAT!!!

functions in ascii-art.py

   scale_image(image, new_width=100)
    # resizes an image
   convert_to_grayscale(image)
    # converts image to grayscale
   map_pixels_to_ascii_chars(image, range_width=25)
    # maps each pixel to a character based on its  
      number range. 0-255 is divided into 11 ranges
      of 25 pixels each

   convert_image_to_ascii(image, new_width=100)
    # calls all of the functions above in a specific
      order, resulting in a string of characters

   handle_image_conversion(image_filepath)
    # calls convert_image_to_ascii (above) on the
      image file provided
import requests
from PIL import Image

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

def scale_image(image, new_width=100):
    # resizes an image, slightly adjusting the aspect ratio.
    
    (original_width, original_height) = image.size
    aspect_ratio = (original_height/float(original_width)) * .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):
    # maps each pixel to an ascii char based on the range in which it lies.
    # 0-255 is divided into 11 ranges of 25 pixels each.

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

    return "".join(pixels_to_chars)

def convert_image_to_ascii(image, new_width=100):
    image = scale_image(image)
    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):
    image = None
    try:
        response = requests.get(image_filepath)
        image = Image.open(BytesIO(response.content))
    except Exception as e:
        print("Unable to open image file {image_filepath}.".format(image_filepath=image_filepath))
        print(e)
        return

    image_ascii = convert_image_to_ascii(image)
    print(image_ascii)

image_file_path = "https://cdn.citylab.com/media/img/citylab/2018/02/RTR3MXS6/facebook.jpg?1518623597"
handle_image_conversion(image_file_path)

This is what I tell people who ask for advice about starting (or pivoting) their career in tech. “Be good at being bad at things,” I say. “You’ll have no idea what you’re doing, so you’ll just keep learning. You won’t get to be the best at everything or even most things or even some things. It’s not possible, and it’s not just you. So get good and comfortable having no idea, but figure out ways to get closer to having an idea.”

 

Gina Trapani, Partner & Director of Engineering at Postlight.
Founded ThinkUp, Makerbase, Todo.txt, Lifehacker.

Computer Vision

By Michelle Lim

Computer Vision

  • 1,071