diff --git a/README.md b/README.md index f3543e8..44f78cc 100644 --- a/README.md +++ b/README.md @@ -23,34 +23,34 @@ Естественно, появилось желание написать вручную такой фильтр. Он может понадобится для пиксель-арта, создания игр с анимацией а-ля ранний Mortal Kombat, японских кроссвордов или для вязки свитеров ближе к НГ. Для чтения-записи изображений используется библиотека `pillow`, для всех остальных манипуляций — `numpy`. - ```python from PIL import Image import numpy as np + img = Image.open("img2.jpg") arr = np.array(img) a = len(arr) a1 = len(arr[1]) i = 0 while i < a - 11: - j = 0 - while j < a1 - 11: - s = 0 - for n in range(i, i + 10): - for n1 in range(j, j + 10): - n1 = arr[n][n1][0] - n2 = arr[n][n1][1] - n3 = arr[n][n1][2] - M = n1 + n2 + n3 - s += M - s = int(s // 100) - for n in range(i, i + 10): - for n1 in range(j, j + 10): - arr[n][n1][0] = int(s // 50) * 50 - arr[n][n1][1] = int(s // 50) * 50 - arr[n][n1][2] = int(s // 50) * 50 - j = j + 10 - i = i + 10 + j = 0 + while j < a1 - 11: + s = 0 + for n in range(i, i + 10): + for n1 in range(j, j + 10): + n1 = arr[n][n1][0] + n2 = arr[n][n1][1] + n3 = arr[n][n1][2] + M = n1 + n2 + n3 + s += M + s = int(s // 100) + for n in range(i, i + 10): + for n1 in range(j, j + 10): + arr[n][n1][0] = int(s // 50) * 50 + arr[n][n1][1] = int(s // 50) * 50 + arr[n][n1][2] = int(s // 50) * 50 + j = j + 10 + i = i + 10 res = Image.fromarray(arr) res.save('res.jpg') ``` diff --git a/filter.py b/filter.py index 4150df2..2a5a8a5 100644 --- a/filter.py +++ b/filter.py @@ -1,28 +1,25 @@ from PIL import Image import numpy as np -img = Image.open("img2.jpg") -arr = np.array(img) -a = len(arr) -a1 = len(arr[1]) -i = 0 -while i < a - 11: - j = 0 - while j < a1 - 11: - s = 0 - for n in range(i, i + 10): - for n1 in range(j, j + 10): - n1 = arr[n][n1][0] - n2 = arr[n][n1][1] - n3 = arr[n][n1][2] - M = n1 + n2 + n3 - s += M - s = int(s // 100) - for n in range(i, i + 10): - for n1 in range(j, j + 10): - arr[n][n1][0] = int(s // 50) * 50 - arr[n][n1][1] = int(s // 50) * 50 - arr[n][n1][2] = int(s // 50) * 50 - j = j + 10 - i = i + 10 -res = Image.fromarray(arr) -res.save('res.jpg') + + +def pixel_brightness(arr, b_s, gr, i, j): + brightness = np.sum(arr[i: i + b_s, j: j + b_s]) // (b_s * b_s * 3) + brightness -= brightness % gr + return brightness + + +def transform_to_mosaic(arr, b_s, gr): + for i in range(0, len(arr), b_s): + for j in range(0, len(arr[1]), b_s): + brightness = pixel_brightness(arr, b_s, gr, i, j) + arr[i: i + b_s, j: j + b_s] = np.full(3, brightness) + + +def convert_image_to_mosaic(img_in="img2.jpg", img_out="res.jpg", block_size=10, gradation_step=50): + img = Image.open(img_in) + img_arr = np.array(img) + transform_to_mosaic(img_arr, block_size, gradation_step) + res = Image.fromarray(img_arr) + res.save(img_out) + +convert_image_to_mosaic() \ No newline at end of file diff --git a/res.jpg b/res.jpg index d8d97ff..f80ca2f 100644 Binary files a/res.jpg and b/res.jpg differ diff --git a/tests/img2.jpg b/tests/img2.jpg new file mode 100644 index 0000000..f8c3ed5 Binary files /dev/null and b/tests/img2.jpg differ diff --git a/tests/res.jpg b/tests/res.jpg new file mode 100644 index 0000000..f80ca2f Binary files /dev/null and b/tests/res.jpg differ diff --git a/tests/res2.jpg b/tests/res2.jpg new file mode 100644 index 0000000..3cc292c Binary files /dev/null and b/tests/res2.jpg differ diff --git a/tests/res3.jpg b/tests/res3.jpg new file mode 100644 index 0000000..7c1a01c Binary files /dev/null and b/tests/res3.jpg differ diff --git a/tests/test_2step.py b/tests/test_2step.py index 80ea23f..62eb2f7 100644 --- a/tests/test_2step.py +++ b/tests/test_2step.py @@ -21,7 +21,7 @@ def convert_image(img_in="img2.jpg", # после выполнения с аргументами по умолчанию метод должен возвращать изображение res.jpg result = Image.open("res.jpg") - correct = Image.open("tests/out/1out.jpg") # сравниваем с верным изображением по умолчанию + correct = Image.open("outWin/1out.jpg") # сравниваем с верным изображением по умолчанию # для тестирования на Windows - поменять путь на tests/outWin diff = ImageChops.difference(correct, result) @@ -37,7 +37,7 @@ def test_2_2(): # 255 // 63 = 4 градации серого result = Image.open("res2.jpg") - correct = Image.open("tests/out/2out.jpg") + correct = Image.open("outWin/2out.jpg") diff = ImageChops.difference(correct, result) assert not diff.getbbox() @@ -51,7 +51,12 @@ def test_2_3(): gradation_step=1) result = Image.open("res3.jpg") - correct = Image.open("tests/out/3out.jpg") # для тестирования на Windows - поменять путь на tests/outWin + correct = Image.open("outWin/3out.jpg") # для тестирования на Windows - поменять путь на tests/outWin diff = ImageChops.difference(correct, result) assert not diff.getbbox() + + +test_2_1() +test_2_2() +test_2_3() \ No newline at end of file