-
Notifications
You must be signed in to change notification settings - Fork 0
/
filter.py
54 lines (44 loc) · 1.9 KB
/
filter.py
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
import doctest
from PIL import Image
import numpy as np
def get_brightness(pixels, pix_x, pix_y, size_moz):
"""
Считает "шаг" серого цвета и возвращает среднюю яркость
>>> get_brightness(np.array(Image.open('img2.jpg')), 5, 5, 10)
17
>>> get_brightness(np.array(Image.open("img2.jpg")), 15, 15, 5)
19
"""
sum_color = np.sum(pixels[pix_x: pix_x + size_moz, pix_y: pix_y + size_moz])
return int((sum_color / 3) // size_moz ** 2)
def set_color(pixels, pix_x, pix_y, size_moz, step):
"""
Закрашивает каждый пиксель в один цвет средней яркости
"""
value_grey = get_brightness(pixels, pix_x, pix_y, size_moz)
pixels[pix_x: pix_x + size_moz, pix_y: pix_y + size_moz] = int(value_grey // step) * step
def grey_img(pixels, gradation, size_moz):
""""
Возвращает итоговое изображение в серых оттенках
"""
step = 255 // (gradation - 1)
height = len(pixels)
width = len(pixels[1])
pix_x = 0
while pix_x < height:
pix_y = 0
while pix_y < width:
set_color(pixels, pix_x, pix_y, size_moz, step)
pix_y = pix_y + size_moz
pix_x = pix_x + size_moz
return pixels
if __name__ == '__main__':
doctest.testmod()
file_image = input("Введите имя входного файла")
img = Image.open(file_image)
arr_pixels = np.array(img)
size_moz = int(input("Введите размер желаемой мозайки"))
gradation = int(input("Введите количество градаций(число)"))
res_image = input("Введите имя файла для сохранения")
res = Image.fromarray(grey_img(arr_pixels, gradation, size_moz))
res.save(res_image)