Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2сем / лаб / ЛР-7.docx
Скачиваний:
1
Добавлен:
04.04.2026
Размер:
47.28 Кб
Скачать

1. Импорт библиотек

from PIL import Image # Для работы с изображениями

import numpy as np # Для обработки пикселей как массива

import matplotlib.pyplot as plt # Для визуализации

2. Функция is_white()

Проверяет, является ли пиксель "условно-белым":

def is_white(pixel, threshold=220):

# Для RGB (3 канала)

if len(pixel) == 3:

return all(c > threshold for c in pixel[:3])

# Для RGBA (4 канала)

elif len(pixel) == 4:

return all(c > threshold for c in pixel[:3]) and pixel[3] > 200

return False

  • threshold=220 - порог "белизны" (значения выше считаются белыми)

  • Для прозрачных изображений дополнительно проверяется альфа-канал (>200)

3. Функция replace_white_pixels()

Основная функция замены пикселей:

Параметры:

def replace_white_pixels(image_path, new_color=(255,0,0), output_path="output.png", threshold=220):

  • new_color - цвет для замены (по умолчанию красный)

  • threshold - чувствительность определения белого

Логика работы:

  1. Загрузка изображения:

img = Image.open(image_path)

img_array = np.array(img) # Конвертация в массив

  1. Создание маски белых пикселей:

white_mask = (img_array[...,0] > threshold) &

(img_array[...,1] > threshold) &

(img_array[...,2] > threshold)

Для RGBA-изображений дополнительно проверяется альфа-канал.

  1. Замена цвета:

img_array[white_mask, :3] = new_color # Заменяем только RGB-каналы

  1. Сохранение и отображение:

result_img = Image.fromarray(img_array)

result_img.save(output_path)

4. Визуализация

plt.figure(figsize=(10,5))

plt.subplot(1,2,1) # Ис

Задания 1.3

from PIL import Image import numpy as np import matplotlib.pyplot as plt from collections import defaultdict class ImageAnalyzer: def __init__(self, image_path): self.image = Image.open(image_path) self.array = np.array(self.image) self.height, self.width = self.array.shape[:2] self.total_pixels = self.width * self.height def count_bright_pixels(self, threshold=200): """Подсчет пикселей ярче заданного порога""" if self.array.ndim == 3: # RGB/RGBA brightness = self.array[..., :3].mean(axis=2) else: # Grayscale brightness = self.array bright_pixels = np.sum(brightness > threshold) percentage = (bright_pixels / self.total_pixels) * 100 return bright_pixels, percentage def count_white_pixels(self, threshold=220): """Подсчет белых (условно-белых) пикселей""" if self.array.ndim == 3 and self.array.shape[2] >= 3: mask = (self.array[..., 0] > threshold) & \ (self.array[..., 1] > threshold) & \ (self.array[..., 2] > threshold) white_pixels = np.sum(mask) else: white_pixels = np.sum(self.array > threshold) percentage = (white_pixels / self.total_pixels) * 100 return white_pixels, percentage def color_distribution(self): """Анализ распределения цветов""" if self.array.ndim != 3 or self.array.shape[2] < 3: return None colors = self.array[..., :3].reshape(-1, 3) color_counts = defaultdict(int) for pixel in colors: color_counts[tuple(pixel)] += 1 top_colors = sorted(color_counts.items(), key=lambda x: -x[1])[:5] return top_colors def detect_dominant_color(self): """Определение доминирующего цвета""" if self.array.ndim != 3 or self.array.shape[2] < 3: return None pixels = self.array[..., :3].reshape(-1, 3) dominant_color = np.median(pixels, axis=0).astype(int) return tuple(dominant_color) def generate_report(self, bright_thresh=200, white_thresh=220): """Генерация полного отчета""" report = { 'dimensions': f"{self.width}x{self.height}", 'total_pixels': self.total_pixels, 'bright_pixels': self.count_bright_pixels(bright_thresh), 'white_pixels': self.count_white_pixels(white_thresh), 'dominant_color': self.detect_dominant_color(), 'top_colors': self.color_distribution() } return report def visualize(self): """Визуализация изображения и гистограммы""" plt.figure(figsize=(15, 5)) # Изображение plt.subplot(1, 3, 1) plt.imshow(self.array) plt.title('Исходное изображение') plt.axis('off') # Гистограмма яркости plt.subplot(1, 3, 2) if self.array.ndim == 3: brightness = self.array[..., :3].mean(axis=2) else: brightness = self.array plt.hist(brightness.flatten(), bins=50, color='gray') plt.title('Распределение яркости') plt.xlabel('Яркость') plt.ylabel('Количество пикселей') # Цветовая палитра (для RGB) if self.array.ndim == 3 and self.array.shape[2] >= 3: plt.subplot(1, 3, 3) top_colors = self.color_distribution()[:5] for i, (color, count) in enumerate(top_colors): plt.bar(i, count, color=np.array(color) / 255) plt.title('Топ-5 цветов') plt.xticks([]) plt.tight_layout() plt.show() # Пример использования if __name__ == "__main__": analyzer = ImageAnalyzer(r"C:\Users\Файзали\Desktop\Фото\i.webp") # Укажите путь к вашему изображению # Генерация отчета report = analyzer.generate_report() print("=== Анализ изображения ===") print(f"Размер: {report['dimensions']}") print(f"Всего пикселей: {report['total_pixels']:,}") print(f"Ярких пикселей (>200): {report['bright_pixels'][0]:,} ({report['bright_pixels'][1]:.2f}%)") print(f"Белых пикселей (>220): {report['white_pixels'][0]:,} ({report['white_pixels'][1]:.2f}%)") print(f"Доминирующий цвет (RGB): {report['dominant_color']}") print("Топ-5 цветов:") for color, count in report['top_colors']: print(f" {color}: {count} пикселей ({count / report['total_pixels'] * 100:.2f}%)") # Визуализация analyzer.visualize()

Этот код представляет собой анализатор изображений, который выполняет комплексный анализ загруженного изображения и предоставляет статистическую информацию о его характеристиках. Программа использует библиотеки PIL, NumPy и Matplotlib для обработки и визуализации данных.

Основной функционал программы

1. Анализ базовых параметров изображения

  • Определение размеров (ширина × высота)

  • Подсчет общего количества пикселей

2. Подсчет ярких пикселей

count_bright_pixels(threshold=200)

  • Считает пиксели, чья яркость (среднее значение по каналам R, G, B) превышает заданный порог

  • Возвращает количество и процент таких пикселей

3. Подсчет белых пикселей

count_white_pixels(threshold=220)

  • Определяет пиксели, где все цветовые каналы (R, G, B) превышают порог (по умолчанию 220)

  • Для grayscale-изображений проверяет только интенсивность

4. Анализ цветового распределения

color_distribution()

  • Создает частотный словарь всех цветов в изображении

  • Возвращает топ-5 самых часто встречающихся цветов

5. Определение доминирующего цвета

detect_dominant_color()

  • Вычисляет медианный цвет по всем пикселям

  • Возвращает наиболее "типичный" цвет изображения

6. Генерация отчета

generate_report()

  • Формирует сводный отчет со всей собранной статистикой:

    • Размеры изображения

    • Количество ярких/белых пикселей

    • Доминирующий цвет

    • Топ-5 цветов

7. Визуализация данных

visualize()

  • Показывает:

    1. Исходное изображение

    2. Гистограмму распределения яркости

    3. График с топ-5 цветами (для цветных изображений)

Практическое применение программы

Эта программа может быть полезна для:

1. Фотографам и дизайнерам

  • Анализ цветового баланса фотографий

  • Выявление переэкспонированных областей (слишком ярких/белых пикселей)

  • Подбор цветовых палитр на основе существующих изображений

2. Разработчикам компьютерного зрения

  • Предварительный анализ датасетов изображений

  • Поиск аномалий в изображениях (например, неожиданно ярких областей)

  • Определение доминирующих цветов для классификации

3. Контент-менеджерам и маркетологам

  • Анализ визуального контента перед публикацией

  • Проверка соответствия корпоративным цветам

  • Оптимизация изображений для веба (выявление проблемных областей)

4. Преподавателям и студентам

  • Наглядная демонстрация принципов обработки изображений

  • Изучение статистических методов анализа визуальных данных

  • Практика работы с библиотеками PIL и NumPy

5. QA-инженерам

  • Автоматизированная проверка качества рендеринга графики

  • Выявление артефактов на изображениях

  • Валидация корректности обработки изображений

Технические особенности реализации

  1. Эффективная обработка:

    • Использование NumPy для векторных операций

    • Быстрый подсчет пикселей через маскирование

  2. Гибкость:

    • Работа с RGB, RGBA и Grayscale изображениями

    • Настраиваемые пороги для яркости и "белизны"

  3. Наглядность:

    • Комбинированная визуализация (изображение + графики)

    • Четкое текстовое представление статистики

  4. Расширяемость:

    • Классовая структура позволяет легко добавлять новые методы анализа

    • Возможность интеграции в более крупные проекты

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

Заключение

Выполняя эту работу, я получил ценный практический опыт работы с цифровой обработкой изображений. Вот мои основные выводы:

1. Что удалось реализовать:

  • Научился программно изменять яркость изображений через математические операции с пикселями

  • Освоил технику замены цветов с использованием масок и пороговых значений

  • Создал собственный анализатор изображений, который показывает статистику по цветам и яркости

2. Какие трудности встретились:

  • Сначала было сложно понять, как правильно работать с разными форматами изображений (RGB, RGBA, grayscale)

  • Пришлось повозиться с правильным ограничением диапазона значений пикселей (0-255)

  • Не сразу получилось сделать красивую визуализацию результатов

3. Чему я научился:

  • Основам обработки изображений на Python с помощью PIL и NumPy

  • Применению математических операций к пиксельным данным

  • Визуализации результатов с помощью Matplotlib

  • Навыкам отладки при работе с изображениями

4. Где это можно применить:

  • Для автоматической обработки фотографий (коррекция яркости, замена фона)

  • В веб-разработке для анализа загружаемых изображений

  • В научных проектах, связанных с обработкой визуальных данных

5. Что было самым интересным: Больше всего понравилось видеть, как математические операции преобразуют изображение. Особенно впечатлило, когда удалось заменить все белые пиксели на красные - выглядит как настоящее волшебство!

6. Что хотелось бы улучшить: В будущем планирую добавить:

  • Поддержку большего количества форматов изображений

  • Более сложные алгоритмы автоматической коррекции

  • Возможность обработки нескольких изображений сразу

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

Соседние файлы в папке лаб