Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования
МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
СВЯЗИ И ИНФОРМАТИКИ
(МТУСИ)
Факультет "Сети и системные связи"
Кафедра “ВвИТ"
ОТЧЕТ
по дисциплине " Оцифровка изображений в Python
"Лабораторная работа №7"
Выполнил
Студент гр. БИН2412 ____________________ Джумъаев Ф.Н.
Проверил
Преподаватель ___________________
Дата защиты _________2025г.
Москва 2025
Цель работы
Знакомство с численными методами для решения задач:
- оцифровка изображений jpg/png
Задание 1.1 (основная часть) “Изменение яркости изображения”
Задание 1.2 (основная часть) “Замена цветов в изображении”
Задание 1.3 (дополнительная часть) “Творческое задание”
Введение
Блок 1 “Оцифровка изображений При работе с цифровыми изображениями часто возникает задача анализа и манипуляции отдельными пикселями. Это особенно важно, когда речь идет о распознании объектов, изменении цветов или обработке изображений на уровне отдельных элементов. В качестве наиболее актуальных реальных задач можно привести обнаружение лиц (поиск лица основывается на выделении участков с характерными оттенками кожи и контрастностью), анализ дефектов на производстве (автоматическое выявление трещин, царапин или других повреждений на фотографиях деталей оборудования), изменение палитры (создание эффектов постобработки (чёрно-белого эффекта, сепия-фильтра и т.п.)). Одним из основных инструментов для такой работы является библиотека Pillow. Для примера рассмотрим 2 часто используемых формата изображений: JPG и PNG. JPG спользуется для хранения фотографических изображений, сжимается с потерями (lossy compression), сохраняет яркие визуальные данные, но немного ухудшая качество изображения. Поддерживает глубину цвета RGB (8 бит/цвет). PNG используется преимущественно для веб-графики и иконок, поддерживает прозрачность альфа-канала, сжатие без потерь (lossless compression), подходит для чётких контуров и логотипов.
Задания 1.1
from PIL import Image import numpy as np import matplotlib.pyplot as plt def adjust_brightness(image_path, factor, output_path): """ Изменяет яркость изображения :param image_path: путь к исходному изображению :param factor: коэффициент яркости (0.5 - уменьшить в 2 раза, 1.5 - увеличить на 50%) :param output_path: путь для сохранения результата """ # Открываем изображение img = Image.open(image_path) # Конвертируем в массив NumPy для быстрой обработки img_array = np.array(img) # Применяем изменение яркости ко всем пикселям # Обеспечиваем, чтобы значения оставались в диапазоне 0-255 brightened_array = np.clip(img_array.astype('float32') * factor, 0, 255).astype('uint8') # Создаем новое изображение из массива brightened_img = Image.fromarray(brightened_array) # Сохраняем результат brightened_img.save(output_path) # Показываем результат plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) plt.imshow(img) plt.title('Исходное изображение') plt.axis('off') plt.subplot(1, 2, 2) plt.imshow(brightened_img) plt.title(f'Яркость x{factor:.1f}') plt.axis('off') plt.tight_layout() plt.show() # Пример использования if __name__ == "__main__": input_image = r"C:\Users\Файзали\Desktop\Фото\i.webp" # Укажите путь к вашему изображению output_image = "output.jpg" brightness_factor = 1.5 # Увеличить яркость на 50% adjust_brightness(input_image, brightness_factor, output_image)
1. Импорт библиотек
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
PIL (Python Imaging Library) - для работы с изображениями (открытие, сохранение)
NumPy - для быстрой математической обработки пикселей
Matplotlib - для визуализации результатов
2. Функция adjust_brightness()
Основная функция, которая изменяет яркость изображения.
Параметры:
def adjust_brightness(image_path, factor, output_path):
image_path - путь к исходному изображению
factor - коэффициент изменения яркости:
0.5 = уменьшение яркости в 2 раза
1.5 = увеличение яркости на 50%
output_path - путь для сохранения результата
3. Обработка изображения
img = Image.open(image_path)
img_array = np.array(img)
Открываем изображение с помощью PIL
Конвертируем в массив NumPy для быстрой обработки пикселей
4. Изменение яркости
brightened_array = np.clip(img_array.astype('float32') * factor, 0, 255).astype('uint8')
img_array.astype('float32') - преобразуем значения пикселей в вещественные числа
* factor - умножаем все значения на коэффициент яркости
`np.clip(..., 0,
Задания 1.2
from PIL import Image import numpy as np import matplotlib.pyplot as plt def is_white(pixel, threshold=220): """Проверяет, является ли пиксель условно-белым""" # Для RGB изображений (без альфа-канала) if len(pixel) == 3: r, g, b = pixel return r > threshold and g > threshold and b > threshold # Для RGBA изображений elif len(pixel) == 4: r, g, b, a = pixel return r > threshold and g > threshold and b > threshold and a > 200 return False def replace_white_pixels(image_path, new_color=(255, 0, 0), output_path="output.png", threshold=220): """ Заменяет белые пиксели на указанный цвет :param image_path: путь к изображению :param new_color: новый цвет в формате (R, G, B) :param output_path: путь для сохранения результата :param threshold: порог "белизны" (0-255) """ # Открываем изображение img = Image.open(image_path) # Конвертируем в массив NumPy img_array = np.array(img) # Создаем маску белых пикселей if img_array.ndim == 3 and img_array.shape[2] >= 3: # Для RGB/RGBA изображений white_mask = (img_array[..., 0] > threshold) & \ (img_array[..., 1] > threshold) & \ (img_array[..., 2] > threshold) # Если есть альфа-канал, учитываем его if img_array.shape[2] == 4: white_mask = white_mask & (img_array[..., 3] > 200) # Заменяем белые пиксели img_array[white_mask, :3] = new_color else: # Для grayscale изображений white_mask = img_array > threshold img_array[white_mask] = sum(new_color) // 3 # Среднее значение цвета # Создаем новое изображение result_img = Image.fromarray(img_array) # Сохраняем результат result_img.save(output_path) # Показываем результат plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) plt.imshow(img) plt.title('Исходное изображение') plt.axis('off') plt.subplot(1, 2, 2) plt.imshow(result_img) plt.title('После замены белых пикселей') plt.axis('off') plt.tight_layout() plt.show() # Пример использования if __name__ == "__main__": # Настройки input_image = r"C:\Users\Файзали\Desktop\Фото\i.webp" # Замените на ваш путь output_image = "output.png" new_color = (255, 33, 33) # Зеленый цвет для замены # Вызываем функцию replace_white_pixels( image_path=input_image, new_color=new_color, output_path=output_image, threshold=220 # Можно уменьшить для более агрессивной замены )
