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 - чувствительность определения белого
Логика работы:
Загрузка изображения:
img = Image.open(image_path)
img_array = np.array(img) # Конвертация в массив
Создание маски белых пикселей:
white_mask = (img_array[...,0] > threshold) &
(img_array[...,1] > threshold) &
(img_array[...,2] > threshold)
Для RGBA-изображений дополнительно проверяется альфа-канал.
Замена цвета:
img_array[white_mask, :3] = new_color # Заменяем только RGB-каналы
Сохранение и отображение:
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()
Показывает:
Исходное изображение
Гистограмму распределения яркости
График с топ-5 цветами (для цветных изображений)
Практическое применение программы
Эта программа может быть полезна для:
1. Фотографам и дизайнерам
Анализ цветового баланса фотографий
Выявление переэкспонированных областей (слишком ярких/белых пикселей)
Подбор цветовых палитр на основе существующих изображений
2. Разработчикам компьютерного зрения
Предварительный анализ датасетов изображений
Поиск аномалий в изображениях (например, неожиданно ярких областей)
Определение доминирующих цветов для классификации
3. Контент-менеджерам и маркетологам
Анализ визуального контента перед публикацией
Проверка соответствия корпоративным цветам
Оптимизация изображений для веба (выявление проблемных областей)
4. Преподавателям и студентам
Наглядная демонстрация принципов обработки изображений
Изучение статистических методов анализа визуальных данных
Практика работы с библиотеками PIL и NumPy
5. QA-инженерам
Автоматизированная проверка качества рендеринга графики
Выявление артефактов на изображениях
Валидация корректности обработки изображений
Технические особенности реализации
Эффективная обработка:
Использование NumPy для векторных операций
Быстрый подсчет пикселей через маскирование
Гибкость:
Работа с RGB, RGBA и Grayscale изображениями
Настраиваемые пороги для яркости и "белизны"
Наглядность:
Комбинированная визуализация (изображение + графики)
Четкое текстовое представление статистики
Расширяемость:
Классовая структура позволяет легко добавлять новые методы анализа
Возможность интеграции в более крупные проекты
Программа особенно полезна там, где требуется быстрый анализ основных характеристик изображения без использования тяжеловесных графических редакторов.
Заключение
Выполняя эту работу, я получил ценный практический опыт работы с цифровой обработкой изображений. Вот мои основные выводы:
1. Что удалось реализовать:
Научился программно изменять яркость изображений через математические операции с пикселями
Освоил технику замены цветов с использованием масок и пороговых значений
Создал собственный анализатор изображений, который показывает статистику по цветам и яркости
2. Какие трудности встретились:
Сначала было сложно понять, как правильно работать с разными форматами изображений (RGB, RGBA, grayscale)
Пришлось повозиться с правильным ограничением диапазона значений пикселей (0-255)
Не сразу получилось сделать красивую визуализацию результатов
3. Чему я научился:
Основам обработки изображений на Python с помощью PIL и NumPy
Применению математических операций к пиксельным данным
Визуализации результатов с помощью Matplotlib
Навыкам отладки при работе с изображениями
4. Где это можно применить:
Для автоматической обработки фотографий (коррекция яркости, замена фона)
В веб-разработке для анализа загружаемых изображений
В научных проектах, связанных с обработкой визуальных данных
5. Что было самым интересным: Больше всего понравилось видеть, как математические операции преобразуют изображение. Особенно впечатлило, когда удалось заменить все белые пиксели на красные - выглядит как настоящее волшебство!
6. Что хотелось бы улучшить: В будущем планирую добавить:
Поддержку большего количества форматов изображений
Более сложные алгоритмы автоматической коррекции
Возможность обработки нескольких изображений сразу
Эта работа дала мне хорошую базу для дальнейшего изучения компьютерного зрения и обработки изображений. Теперь я понимаю, как работают многие фильтры в фоторедакторах, и могу создавать свои собственные!
