-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
85 lines (65 loc) · 2.69 KB
/
main.py
File metadata and controls
85 lines (65 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from PIL import Image
from colorama import Fore, Style
ASCII_CHARS = "`^\",:;Il!i~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$"
MAX_PIXEL_VALUE = 255
def get_pixel_matrix(img, height):
img.thumbnail((height, 200))
pixels = list(img.getdata())
return [pixels[i:i+img.width] for i in range(0, len(pixels), img.width)]
def get_intensity_matrix(pixels_matrix, algo_name='luminosity'):
intensity_matrix = []
for row in pixels_matrix:
intensity_row = []
for p in row:
if algo_name == 'average':
intensity = (p[0] + p[1] + p[2] )/ 3.0
elif algo_name == 'max_min':
intensity = (max(p) + min(p) / 2.0)
elif algo_name == 'luminosity':
intensity = 0.21*p[0] + 0.72*p[1] + 0.07*p[2]
else:
raise Exception("Unrecognixed algo_name: %s" % algo_name)
intensity_row.append(intensity)
intensity_matrix.append(intensity_row)
return intensity_matrix
def normalize_intensity_matrix(intensity_matrix):
normalized_intensity_matrix = []
max_pixel = max(map(max, intensity_matrix))
min_pixel = min(map(min, intensity_matrix))
for row in intensity_matrix:
rescaled_row = []
for p in row:
r = MAX_PIXEL_VALUE * (p - min_pixel) / float(max_pixel - min_pixel)
rescaled_row.append(r)
normalized_intensity_matrix.append(rescaled_row)
return normalized_intensity_matrix
def invert_intensity_matrix(intensity_matrix):
inverted_intensity_matrix = []
for row in intensity_matrix:
inverted_row = []
for p in row:
inverted_row.append(MAX_PIXEL_VALUE - p)
inverted_intensity_matrix.append(inverted_row)
return inverted_intensity_matrix
def convert_to_ascii(intensity_matrix, ascii_chars):
ascii_matrix = []
for row in intensity_matrix:
ascii_row = []
for p in row:
ascii_row.append(ascii_chars[int(p/MAX_PIXEL_VALUE * len(ascii_chars)) - 1])
ascii_matrix.append(ascii_row)
return ascii_matrix
def print_ascii_matrix(ascii_matrix, text_color):
for row in ascii_matrix:
line = [p+p+p for p in row]
print(text_color + "".join(line))
print(Style.RESET_ALL)
filepath = "tiger.jpeg"
img = Image.open(filepath)
pixels = get_pixel_matrix(img, 1000)
intensity_matrix = get_intensity_matrix(pixels, 'luminosity')
intensity_matrix = normalize_intensity_matrix(intensity_matrix)
#intensity_matrix = invert_intensity_matrix(intensity_matrix)
#intensity_matrix = invert_intensity_matrix(intensity_matrix)
ascii_matrix = convert_to_ascii(intensity_matrix, ASCII_CHARS)
print_ascii_matrix(ascii_matrix, Fore.GREEN)