Skip to content
Merged

123 #10

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions conditions/sem02/lesson03/tasks.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def sum_arrays_naive(
]
```

Допишите код векторизованной функции в файле [task1](../solutions/sem02/lesson03/task1.py).
Допишите код векторизованной функции в файле [task1](../../../solutions/sem02/lesson03/task1.py).

**Входные данные:**
- `lhs` - одномерный массив чисел с плавающей точкой;
Expand All @@ -42,7 +42,7 @@ def sum_arrays_naive(
def compute_poly_naive(abscissa: list[float]) -> list[float]:
return [3 * (x ** 2) + 2 * x + 1 for x in abscissa]
```
Допишите код векторизованной функции в файле [task1](../solutions/sem02/lesson03/task1.py).
Допишите код векторизованной функции в файле [task1](../../../solutions/sem02/lesson03/task1.py).

**Входные данные:**
- `abscissa` - одномерный массив чисел с плавающей точкой - область определения для вычисления полинома;
Expand All @@ -54,7 +54,7 @@ def compute_poly_naive(abscissa: list[float]) -> list[float]:

Векторизуйте код функции `get_mutual_l2_distances_naive`.

Допишите код векторизованной функции в файле [task1](../solutions/sem02/lesson03/task1.py).
Допишите код векторизованной функции в файле [task1](../../../solutions/sem02/lesson03/task1.py).

**Python функция**:
```python
Expand Down Expand Up @@ -92,7 +92,7 @@ def get_mutual_l2_distances_naive(

### Перевод из декартовых координат в сферические

Допишите код функции `convert_from_sphere` в файле [task2](../solutions/sem02/lesson03/task2.py).
Допишите код функции `convert_from_sphere` в файле [task2](../../../solutions/sem02/lesson03/task2.py).

**Входные данные**:
- `abscissa` - np.ndarray, абсциссы точек;
Expand All @@ -112,7 +112,7 @@ def get_mutual_l2_distances_naive(

### Перевод из сферических координат в декартовы

Допишите код функции `convert_to_sphere` в файле [task2](../solutions/sem02/lesson03/task2.py).
Допишите код функции `convert_to_sphere` в файле [task2](../../../solutions/sem02/lesson03/task2.py).

**Входные данные**:
- `distances` - np.ndarray, массив расстояний;
Expand All @@ -129,7 +129,7 @@ def get_mutual_l2_distances_naive(

На вход подается одномерный массив чисел с плавающей точкой - значения некоторой функции на определенном отрезке. Ваша задача - вычислить индексы элементов, соответствующие точкам экстремума данной функции.

Допишите код в файле [task3](../solutions/sem02/lesson03/task3.py).
Допишите код в файле [task3](../../../solutions/sem02/lesson03/task3.py).

**Входные данные**:
- `ordinates` - np.ndarray числе с плавающей точкой, значения некоторой функции на определенном отрезке;
Expand Down
Binary file added conditions/sem02/lesson04/images/compare.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added conditions/sem02/lesson04/images/conv.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added conditions/sem02/lesson04/images/padding.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
79 changes: 79 additions & 0 deletions conditions/sem02/lesson04/tasks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
## Задача 1. Нечеткий парень

В этом задании перед вами стоит задача реализовать фильтр размытия, аналогичный фильтрам размытия из различных редакторов фото. Но прежде чем переходить к реализации самого фильтра размытия, необходимо выполнить подготовительные шаги.

### Часть 1. Паддингтон

Слово паддинг (англ. *padding*) буквально можно перевести, как отступ. В контексте текущей задачи паддингом мы будем называть рамку вокруг изображения, шириной в заданное число пикселей, заполненную нулями. На картинке ниже приведен пример добавления паддинга шириной в 1 пиксель к входному изображению.

![padding](./images/padding.jpg)

Ваша задача - реализовать функцию добавления паддинга.

Допишите код функции `pad_image` в файле [task1](../../../solutions/sem02/lesson04/task1.py).

**Входные данные**:
- `image` - двумерный или трехмерный массив - черно-белое или RGB изображение. Элементы массива - восьмибитные целые беззнаковые числа.
- `pad_size` - натуральное число, ширина паддинга.

**Выходные данные**:
- Исходное изображение с добавленным паддингом. Т.е. `image`, заключенное в рамку из 0 шириной в `pad_size` пикселей.

*Сторонние эффекты*:
- Если значение `pad_size` меньше единицы, необходимо возбудить исключение `ValueError`.

**ВАЖНО**: в это задании запрещено использовать функцию `np.pad`. Решения с использованием `np.pad` будут оценены в 0 баллов!

### Часть 2. Размытие

Теперь мы готовы реализовывать фильтр размытия. Размытие изображения работает достаточно просто:

- Сначала задается размер окна размытия - $l_w$, которое можно интерпретировать, как степень размытия. Чем больше окно размытия, тем сильнее результирующая картинка будет размыта. Обычно в качестве размеров окна размытия используются нечетные целые числа.
- Следующий шаг - это применение паддинга к входному изображению размеров $N \times M$, причем ширина паддинга соответствует следующему выражению: $\lfloor\frac{l_w}{2}\rfloor$.
- Затем, по всему изображению с паддингом запускается обход скользящим окном размеров $l_w \times l_w$, причем центр окна всегда находится в пикселях, соответствующих пикселям исходного изображения. Т.е. центр окна размытия проходит пиксели из области $[l_w, l_w + N] \times [l_w, l_w + M]$
- В каждом положении окна размытия вычисляется среднее значений пикселей, попавших в окно. Результат записывается в новый массив, тех же размеров, что и исходное изображение.

![blur](./images/conv.png)

Ваша задача - реализовать функцию для размытия изображений.

Допишите код функции `blur_image` в файле [task1](../../../solutions/sem02/lesson04/task1.py).

**Входные данные**:
- `image` - двумерный или трехмерный массив - черно-белое или RGB изображение. Элементы массива - восьмибитные целые беззнаковые числа.
- `kernel_size` - натуральное нечетное число, размер окна размытия.

**Выходные данные**:
- Размытое изображение.

*Сторонние эффекты*:
- Если `kernel_size` четное число или `kernel_size` меньше 1, необходимо возбудить исключение `ValueError`.

Ожидаемый результат:

![cirlce](./images/compare.png)

## Задача 2. Не вижу разницы

Представим, что вы занимаетесь разработкой некоторого алгоритма дорисовки черно-белых изображений. Для дорисовки используется некоторая модель машинного обучения. Вызов модели занимает продолжительное время, и в некоторых случаях этот вызов не оправдан. Например, дорисовка с помощью модели машинного обучения не оправдана, когда изображение является однотонным (очень много больших областей одного и того же цвета). В этом случае можно было бы использовать цвет однотонных областей для дорисовки требуемых частей изображения.

Для реализации такого подхода необходимо разработать алгоритм, который позволял бы определить самый распространенный цвет на изображении. Однако есть нюанс. Некоторые цвета черно-белого изображения плохо различимы человеком, и их необходимо рассматривать как один и тот же цвет. Определить плохо различимые цвета можно с помощью критерия `|image[i][j] - image[k][l]| < treshold`. Т.е. если значение разности яркости двух пикселей не превышает заранее заданного порога, то эти пиксели считаются пикселями одного цвета.

Необходимо реализовать функцию для определения самого распространенного цвета черно-белого изображения с учетом оговоренных особенностей восприятия цвета. Также необходимо рассчитать процент пикселей изображения, окрашенных в самый распространенный цвет, чтобы понимать, возможна ли тривиальная дорисовка или нет.

Допишите код функции pad_image в файле [task2](../../../solutions/sem02/lesson04/task2.py).

**Входные данные**:
- `image` - двумерный массив - черно-белое изображение. Элементы массива - восьмибитные целые беззнаковые числа.
- `threshold` - натуральное число, порог для выявления неразличимых цветов.

**Выходные данные**:
- Кортеж. Первый элемент кортежа - восьмибитное целое беззнаковое число, самый распространенный цвет. Второй элемент кортежа - процент пикселей изображения, окрашенных в самый распространенный цвет.

*Сторонние эффекты*:
- Если значение `threshold` меньше единицы, необходимо возбудить исключение `ValueError`.





Empty file.
Empty file.
Binary file added solutions/sem02/lesson04/images/circle.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions solutions/sem02/lesson04/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
matplotlib==3.8.0
numpy==1.26.1
opencv-python-headless==4.9.0.80
27 changes: 27 additions & 0 deletions solutions/sem02/lesson04/task1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import numpy as np


def pad_image(image: np.ndarray, pad_size: int) -> np.ndarray:
# ваш код
return image


def blur_image(
image: np.ndarray,
kernel_size: int,
) -> np.ndarray:
# ваш код
return image


if __name__ == "__main__":
import os
from pathlib import Path

from utils.utils import compare_images, get_image

current_directory = Path(__file__).resolve().parent
image = get_image(os.path.join(current_directory, "images", "circle.jpg"))
image_blured = blur_image(image, kernel_size=21)

compare_images(image, image_blured)
10 changes: 10 additions & 0 deletions solutions/sem02/lesson04/task2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import numpy as np


def get_dominant_color_info(
image: np.ndarray[np.uint8],
threshold: int = 5,
) -> tuple[np.uint8, float]:
# ваш код

return 0, 0
22 changes: 22 additions & 0 deletions solutions/sem02/lesson04/utils/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np


def get_image(path_to_image: str) -> np.ndarray:
image = cv.imread(path_to_image)
return cv.cvtColor(image, code=cv.COLOR_BGR2RGB)


def compare_images(image1: np.ndarray, image2: np.ndarray) -> None:
_, (axis1, axis2) = plt.subplots(1, 2, figsize=(16, 8))
axis1: plt.Axes = axis1
axis2: plt.Axes = axis2

axis1.imshow(image1)
axis2.imshow(image2)

axis1.axis("off")
axis2.axis("off")

plt.show()
Binary file added tests/test_data/lesson04/test_task11_data_res.npy
Binary file not shown.
Binary file not shown.
Binary file added tests/test_data/lesson04/test_task2_data1.npy
Binary file not shown.
Loading
Loading