Цифровая картинка — это двумерный массив: каждый элемент — точка (пиксель, pixel), а число — её цвет.
В чёрно-белой картинке достаточно двух чисел: 0 — пусто, 1 — закрашено. В этом проекте мы будем рисовать и
преобразовывать картинки только срезами, .T и итогами — всем, что было в модуле.
Чтобы видеть картинку, а не столбики чисел, напишем маленькую функцию show: единицы она печатает
квадратиком, нули — точкой.
import numpy as np
def show(picture):
for row in picture: # цикл for по таблице перебирает её строки
line = ""
for value in row: # а по строке — её элементы
if value:
line += "█" # 1 — закрашенная точка
else:
line += "·" # 0 — пустая
print(line)
show(np.zeros((3, 8), dtype=int))········ ········ ········
Шаг 1. Рамка
Присваивание в срез закрашивает сразу целую строку или столбец: canvas[0] = 1 — верхняя строка,
canvas[:, -1] = 1 — правый столбец.
Холст frame — нули 6 × 10. Нарисуйте на нём рамку: закрасьте первую и последнюю строки и первый и последний
столбцы.
frame[0] = 1 и frame[-1] = 1.frame[:, 0] = 1 и frame[:, -1] = 1.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
frame = np.zeros((6, 10), dtype=int)Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
frame = np.zeros((6, 10), dtype=int)
frame[0] = 1
frame[-1] = 1
frame[:, 0] = 1
frame[:, -1] = 1
show(frame)Шаг 2. Крест
Холст plus — нули 7 × 7. Нарисуйте в нём крест: закрасьте среднюю строку и средний столбец (индекс 3).
plus[3] = 1, средний столбец — plus[:, 3] = 1.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
plus = np.zeros((7, 7), dtype=int)Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
plus = np.zeros((7, 7), dtype=int)
plus[3] = 1
plus[:, 3] = 1Шаг 3. Сколько закрашено
Сохраните в lit число закрашенных точек креста plus.
Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
lit = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
lit = plus.sum()show(plus)
print("закрашено:", lit)···█··· ···█··· ···█··· ███████ ···█··· ···█··· ···█··· закрашено: 13
Строка и столбец креста по 7 точек, но центральную точку закрасили оба раза — это одна и та же точка: 7 + 7 − 1 = 13.
Шаг 4. Отражения
Срез с шагом −1 разворачивает ось: [::-1] — строки в обратном порядке (отражение сверху вниз), [:, ::-1] —
столбцы в обратном порядке (отражение слева направо). Вот стрелка вверх:
up = np.array([
[0, 0, 1, 0, 0],
[0, 1, 1, 1, 0],
[1, 0, 1, 0, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
])
right = np.array([
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
])
show(up)··█·· ·███· █·█·█ ··█·· ··█··
Отразите стрелку up сверху вниз и сохраните результат в down.
up[::-1].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
down = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
down = up[::-1]
show(down)Стрелка right смотрит вправо. Отразите её слева направо и сохраните в left.
right[:, ::-1].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
left = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
left = right[:, ::-1]
show(left)Шаг 5. Поворот
Поворот на 90° по часовой стрелке складывается из двух шагов: транспонировать (.T), а потом отразить слева
направо. Попробуйте на бумажке с углом «Г» — и убедитесь.
В заготовке — картинка letter 4 × 3: буква «Г». Поверните её на 90° по часовой стрелке и сохраните
в turned. Проверьте себя: у повёрнутой картинки 3 строки и 4 столбца, а перекладина буквы уходит вниз
по правому краю.
letter.T, потом отражение столбцов: [:, ::-1].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
letter = np.array([
[1, 1, 1],
[1, 0, 0],
[1, 0, 0],
[1, 0, 0],
])
turned = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
letter = np.array([
[1, 1, 1],
[1, 0, 0],
[1, 0, 0],
[1, 0, 0],
])
turned = letter.T[:, ::-1]
show(turned)Шаг 6. Обрезка
Картинка photo — 8 × 8. Вырежьте из неё центральный квадрат 4 × 4 (строки и столбцы с индексами 2–5)
и сохраните в center.
2:6 по обеим осям.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
photo = np.arange(64).reshape(8, 8)
center = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
photo = np.arange(64).reshape(8, 8)
center = photo[2:6, 2:6]for picture in (frame, down, left, turned):
show(picture)
print()██████████ █········█ █········█ █········█ █········█ ██████████ ··█·· ··█·· █·█·█ ·███· ··█·· ··█·· ·█··· █████ ·█··· ··█·· ████ ···█ ···█
Настоящие фотографии устроены так же, только чисел больше: в цветной картинке у каждой точки три числа — красный, зелёный и синий, и массив получается трёхмерным. Обрезка, повороты и отражения в графических редакторах — это те же срезы.