From b33cb49af16efa061dbea18fe1c5af993862fe54 Mon Sep 17 00:00:00 2001 From: Sergey Date: Fri, 12 Nov 2021 23:41:37 +0500 Subject: [PATCH 1/5] Make stage 1 --- filter.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/filter.py b/filter.py index 4150df2..6738900 100644 --- a/filter.py +++ b/filter.py @@ -1,21 +1,22 @@ -from PIL import Image import numpy as np +from PIL import Image + img = Image.open("img2.jpg") arr = np.array(img) a = len(arr) a1 = len(arr[1]) i = 0 -while i < a - 11: +while i < a: j = 0 - while j < a1 - 11: + while j < a1: 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 + m1 = int(arr[n][n1][0]) + m2 = int(arr[n][n1][1]) + m3 = int(arr[n][n1][2]) + M = m1 + m2 + m3 + s += M // 3 s = int(s // 100) for n in range(i, i + 10): for n1 in range(j, j + 10): From 164ee6802e7002fde10c22c7c3e3288575c0406c Mon Sep 17 00:00:00 2001 From: Sergey Date: Fri, 12 Nov 2021 23:42:00 +0500 Subject: [PATCH 2/5] Make stage 2. --- filter.py | 73 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/filter.py b/filter.py index 6738900..2dd02b7 100644 --- a/filter.py +++ b/filter.py @@ -1,29 +1,46 @@ +import os import numpy as np -from PIL import Image - -img = Image.open("img2.jpg") -arr = np.array(img) -a = len(arr) -a1 = len(arr[1]) -i = 0 -while i < a: - j = 0 - while j < a1: - s = 0 - for n in range(i, i + 10): - for n1 in range(j, j + 10): - m1 = int(arr[n][n1][0]) - m2 = int(arr[n][n1][1]) - m3 = int(arr[n][n1][2]) - M = m1 + m2 + m3 - s += M // 3 - 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') +from PIL import Image, UnidentifiedImageError + + +def load_img_as_array(path: str) -> np.ndarray: + if os.path.isfile(path): + try: + img = Image.open(path) + return np.array(img) + except UnidentifiedImageError: + raise TypeError("Incorrect file type.") + raise FileExistsError("This file doesn't exist.") + + +def convert_to_gray_pixel_art(img: np.ndarray, pixel_size: int = 10, grayscale: int = 50) -> np.ndarray: + width = len(img) + height = len(img[1]) + + for x in range(0, width, pixel_size): + for y in range(0, height, pixel_size): + brightness = 0 + for x1 in range(x, min(x + pixel_size, width)): + for y1 in range(y, min(y + pixel_size, height)): + brightness += sum(int(color) for color in img[x1][y1]) // 3 + brightness = brightness // (pixel_size * pixel_size) + + for x1 in range(x, min(x + pixel_size, width)): + for y1 in range(y, min(y + pixel_size, height)): + img[x1][y1][0] = img[x1][y1][1] = img[x1][y1][2] = brightness - brightness % grayscale + + return img + + +def save_img(img: np.ndarray, filename: str) -> None: + Image.fromarray(img).save(filename) + + +def main() -> None: + img = load_img_as_array("img2.jpg") + gray_image = convert_to_gray_pixel_art(img, 10, 50) + save_img(gray_image, "res.jpg") + + +if __name__ == "__main__": + main() From c5dd3459dc41850792bfcaf035b0466c8651954d Mon Sep 17 00:00:00 2001 From: Sergey Date: Sat, 13 Nov 2021 00:29:13 +0500 Subject: [PATCH 3/5] Make stage 3. --- filter.py | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/filter.py b/filter.py index 2dd02b7..6ee18f4 100644 --- a/filter.py +++ b/filter.py @@ -14,20 +14,10 @@ def load_img_as_array(path: str) -> np.ndarray: def convert_to_gray_pixel_art(img: np.ndarray, pixel_size: int = 10, grayscale: int = 50) -> np.ndarray: - width = len(img) - height = len(img[1]) - - for x in range(0, width, pixel_size): - for y in range(0, height, pixel_size): - brightness = 0 - for x1 in range(x, min(x + pixel_size, width)): - for y1 in range(y, min(y + pixel_size, height)): - brightness += sum(int(color) for color in img[x1][y1]) // 3 - brightness = brightness // (pixel_size * pixel_size) - - for x1 in range(x, min(x + pixel_size, width)): - for y1 in range(y, min(y + pixel_size, height)): - img[x1][y1][0] = img[x1][y1][1] = img[x1][y1][2] = brightness - brightness % grayscale + for x in range(0, len(img), pixel_size): + for y in range(0, len(img[0]), pixel_size): + brightness = np.average(img[x: x + pixel_size, y: y + pixel_size]) + img[x: x + pixel_size, y: y + pixel_size] = brightness - brightness % grayscale return img From 65b0c3a844338ecd64dbd3f62adb70c09df9f25e Mon Sep 17 00:00:00 2001 From: Sergey Date: Sat, 13 Nov 2021 01:16:09 +0500 Subject: [PATCH 4/5] Make stage 4. --- filter.py | 36 ++++++++++++++++++++++++++++++------ requirements.txt | 2 ++ 2 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 requirements.txt diff --git a/filter.py b/filter.py index 6ee18f4..ac2c16a 100644 --- a/filter.py +++ b/filter.py @@ -1,7 +1,11 @@ import os +import argparse import numpy as np from PIL import Image, UnidentifiedImageError +STANDARD_PIXEL_SIZE = 10 +STANDARD_GRAYSCALE = 50 + def load_img_as_array(path: str) -> np.ndarray: if os.path.isfile(path): @@ -9,11 +13,14 @@ def load_img_as_array(path: str) -> np.ndarray: img = Image.open(path) return np.array(img) except UnidentifiedImageError: - raise TypeError("Incorrect file type.") - raise FileExistsError("This file doesn't exist.") + print("Incorrect file type.") + exit(1) + print("This file doesn't exist.") + exit(1) -def convert_to_gray_pixel_art(img: np.ndarray, pixel_size: int = 10, grayscale: int = 50) -> np.ndarray: +def convert_to_gray_pixel_art(img: np.ndarray, pixel_size: int = STANDARD_PIXEL_SIZE, + grayscale: int = STANDARD_GRAYSCALE) -> np.ndarray: for x in range(0, len(img), pixel_size): for y in range(0, len(img[0]), pixel_size): brightness = np.average(img[x: x + pixel_size, y: y + pixel_size]) @@ -26,10 +33,27 @@ def save_img(img: np.ndarray, filename: str) -> None: Image.fromarray(img).save(filename) +def convert(input_path: str, output_path: str = None, pixel_size: int = STANDARD_PIXEL_SIZE, + grayscale: int = STANDARD_GRAYSCALE) -> None: + img = load_img_as_array(input_path) + gray_image = convert_to_gray_pixel_art(img, pixel_size, grayscale) + file_info = os.path.splitext(input_path) + output_path = output_path or f"{file_info[0]}_pixel{file_info[1]}" + save_img(gray_image, output_path) + + def main() -> None: - img = load_img_as_array("img2.jpg") - gray_image = convert_to_gray_pixel_art(img, 10, 50) - save_img(gray_image, "res.jpg") + parser = argparse.ArgumentParser() + parser.add_argument('input_path', type=str, help='Путь до входного изображения.') + parser.add_argument('-op', '--output_path', type=str, default=None, + help=('Путь до выходного изображения. Стандартное значение: ' + '<путь до файла>_pixel.<расширение файла>.')) + parser.add_argument('-ps', '--pixel_size', type=int, default=10, + help=f'Устанавливает размер пикселя. Стандартное значение: {STANDARD_PIXEL_SIZE}.') + parser.add_argument('-gs', '--grayscale', type=int, default=50, + help=f'Устанавливает градацию серого. Стандартное значение: {STANDARD_GRAYSCALE}.') + args = parser.parse_args() + convert(args.input_path, args.output_path, args.pixel_size, args.grayscale) if __name__ == "__main__": diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..d05ee4d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +numpy==1.21.2 +Pillow==8.4.0 From e06fe89320679689c7743a06b022d8841f52d8d6 Mon Sep 17 00:00:00 2001 From: Sergey Dorokhov <52073821+onezuppi@users.noreply.github.com> Date: Sat, 13 Nov 2021 01:31:35 +0500 Subject: [PATCH 5/5] Fix default values. --- filter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/filter.py b/filter.py index ac2c16a..7bae604 100644 --- a/filter.py +++ b/filter.py @@ -48,9 +48,9 @@ def main() -> None: parser.add_argument('-op', '--output_path', type=str, default=None, help=('Путь до выходного изображения. Стандартное значение: ' '<путь до файла>_pixel.<расширение файла>.')) - parser.add_argument('-ps', '--pixel_size', type=int, default=10, + parser.add_argument('-ps', '--pixel_size', type=int, default=STANDARD_PIXEL_SIZE, help=f'Устанавливает размер пикселя. Стандартное значение: {STANDARD_PIXEL_SIZE}.') - parser.add_argument('-gs', '--grayscale', type=int, default=50, + parser.add_argument('-gs', '--grayscale', type=int, default=STANDARD_GRAYSCALE, help=f'Устанавливает градацию серого. Стандартное значение: {STANDARD_GRAYSCALE}.') args = parser.parse_args() convert(args.input_path, args.output_path, args.pixel_size, args.grayscale)