Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы 2022-2023 / 1 сем / Baraeva_Elizaveta_lb2

.pdf
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
205 Кб
Скачать
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В. И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
ОТЧЕТ
по дисциплине «Информатика»
Тема: Введение в архитектуру компьютера
Студентка гр. 2383
Бараева Е. Н.
Преподаватель
Шевская Н. В.
Санкт-Петербург
2022
2
Цель работы.
Научиться пользоваться библиотекой numpy и Pillow для редактирования
изображений и создания новых.
Задание.
Вариант 4 Решить 3 подзадачи, используя библиотеки Pillow и numpy. Задача 1: Рисование отрезка. Необходимо реализовать функцию user_func(), рисующую на картинке
отрезок. Она принимает на вход: изображение, координаты, начала (x0, y0), координаты конца (x1, y1), цвет, толщину.
Функция должна вернуть обработанное изображение. Задача 2: Преобразовать в Ч/Б изображение (любым простым способом). Нужно реализовать 2 функции:
check_coords(image, x0, y0, x1, y1) – проверяет координаты области (x0,
y0, x1, y1) на корректность (они должны быть неотрицательными, не
превышать размеров изображения, поскольку x0, y0 – координаты левого верхнего угла, x1, y1 - координаты правого нижнего угла, то x1 должен быть больше x0, а y1 должен быть больше y0);
set_black_white(image, x0, y0, x1, y1) – преобразовывает заданную
область изображения в черно-белый. В этой функции должна вызываться
функция проверки, и, если область некорректна, то должно быть возвращено
исходное изображение без изменений. Примечание: поскольку черно-белый формат изображения (greyscale) является самостоятельным форматом, а не вариацией RGB-формата, для его получения необходимо использовать метод
Image.convert.
Задача 3: Найти самый большой прямоугольник заданного цвета и
перекрасить его в другой цвет.
Написать функцию find_rect_and_recolor(image, old_color, new_color),
принимающую на вход изображение и кортежи RGB-компонент старого и
3
нового цветов. Она выполняет задачу и возвращает изображение. При
необходимости можно писать дополнительные функции.
Выполнение работы.
Задача 1:
На вход функции user_func() подается изображение image, координаты левого верхнего угла x0, y0 и правого нижнего угла x1, y1, цвет заливки отрезка fill и его ширина width. Затем с помощью класса ImageDraw и метода Draw создается изображение drawing, на котором уже можно будет рисовать отрезок. Метод line, которому передается два кортежа с координатами, цвет
заливки и ширина, рисует отрезок. После этого функция возвращает
изображение.
Задача 2:
На вход функции set_black_white() подается изображение image, координаты левого верхнего угла x0, y0 и правого нижнего угла x1, y1. Затем проверяются координаты на верность. Вызывается функция check_coords(), которой передаются те же данные. Методом size записываются, в переменные width и height, размеры изображения. Оператором if проверяются координаты и возвращается соответствующее True или False. Если функцией было возвращено False, то set_black_white() возвращает исходное изображение, если True, то методом crop вырезается нужная область изображение, методом convert эта область становится черно-белой, методом paste измененная область возвращается на то же место и возвращается измененное изображение.
Задача 3:
На вход функции set_black_white() подается изображение image, старый цвет old_color, новый цвет new_color. Объявляются переменные xy0, xy1, в которые запишутся координаты углов прямоугольника, width, height, в которые методом size записываются размеры изображения. С помощью
np.array() создается матрица с цветами пикселей и записывается в pixels.
4
Создается переменная max_area, которая будет нужна для записи площади наибольшего прямоугольника. Затем с помощью двух циклов for проходится по каждому пикселю. Оператор if сравнивает цвет текущего пикселя с нужным цветом. Если пиксель с нужным цветом и до него не было пикселя с нужным цветом, то в переменные x, y записываются его координаты, а в переменные h и l, обозначающие высоту и длину прямоугольника, записываются нули. Циклом while вычисляется длина прямоугольника, с помощью прибавления 1 к x. Т. к. прямоугольник может находиться у края изображение, то x проверяется на не превышение размера изображения. Затем из x вычитается 1, для того чтобы вернуться к пикселю с нужным цветом. Вторым циклом while вычисляется высота прямоугольника таким же способом. После этого из y вычитается 1 по таким же причинам, как и у x. В конце проверяется превысила ли площадь данного прямоугольника
предыдущую площадь. Если превысила, то площадь перезаписывается и в
xy0, xy1 записываются координаты углов прямоугольника. После выхода из
циклов меняется цвет наибольшего прямоугольника с помощью метода
rectangle и возвращается измененное изображение.
Разработанный программный код см. в приложении А.
5
Тестирование.
Результаты тестирования представлены в табл. 1. Таблица 1 – Результаты тестирования
№ п/п
Входные данные
Выходные
данные
Комментарии
1.
image = Image.new("RGB", (300, 300), 'green') user_func(image, 20, 50, 100, 250, 'yellow',
5).show()
Проверка функции
user_func.
Верно.
2.
image = Image.new("RGB", (300, 300), 'black') user_func(image, 62, 55, 246, 145, 'blue',
5).show()
Проверка функции
user_func.
Верно.
3.
image = Image.new("RGB", (300, 300), 'blue') set_black_white(image, 87, 48, 274,
187).show()
Проверка функции
set_black_white.
Верно.
4.
image = Image.new("RGB", (300, 300), 'pink') set_black_white(image, 0, 134, 268, 100).show
Проверка функции
set_black_white.
Верно.
5.
image = Image.new("RGB", (300, 300), 'red') drawing = ImageDraw.Draw(image) drawing.rectangle((250, 250, 300, 300), 'black') drawing.rectangle((100, 100, 150, 200), 'black') drawing.rectangle((0, 0, 60, 60), 'black') find_rect_and_recolor(image, (0, 0, 0), (0, 200,
0)).show()
Проверка функции find_rect_and_recolor. Верно.
6.
image = Image.new("RGB", (300, 300), 'red') drawing = ImageDraw.Draw(image) drawing.rectangle((250, 250, 300, 300), 'black') drawing.rectangle((40, 60, 100, 90), 'black') find_rect_and_recolor(image, (0, 0, 0), (0, 200,
0)).show()
Проверка функции find_rect_and_recolor. Верно.
Вывод.
Были изучены основы библиотек Pillow и numpy. Разработаны 4 функции, которые изменяли изображения в соответствии с заданиями.
6
ПРИЛОЖЕНИЕ А
ИСХОДНЫЙ КОД ПРОГРАММЫ
Название файла: main_lb2.py
def user_func(image, x0, y0, x1, y1, fill, width): drawing = ImageDraw.Draw(image) drawing.line(((x0, y0), (x1, y1)), fill, width) return image
def check_coords(image, x0, y0, x1, y1): width, height = image.size if 0 <= x0 < x1 <= width and 0 <= y0 < y1 <= height: return True else: return False
def set_black_white(image, x0, y0, x1, y1): if check_coords(image, x0, y0, x1, y1): img = image.crop((x0, y0, x1, y1)) img = img.convert('1') image.paste(img, (x0, y0)) return image else: return image
def find_rect_and_recolor(image, old_color, new_color): global xy0, xy1 width, height = image.size pixels = np.array(image) max_area = 0 for j in range(height): for i in range(width): if tuple(pixels[j][i]) == old_color: if i == 0 or i != 0 and tuple(pixels[j][i-1]) !=
old_color:
h, l = 0, 0 y, x = j, i while tuple(pixels[y][x]) == old_color: l += 1 x += 1 if x == width: break x -= 1 while tuple(pixels[y][x]) == old_color and
tuple(pixels[y][i]) == old_color:
h += 1 y += 1 if y == height: break y -= 1 if max_area < (h - 1) * (l - 1): max_area = (h - 1) * (l - 1) xy0 = (i, j) xy1 = (x, y) drawing = ImageDraw.Draw(image) drawing.rectangle((xy0, xy1), new_color) return image
Соседние файлы в папке 1 сем