Удаление белого пространства вокруг сохраненных изображений в Matplotlib и NetworkX

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам нужно автоматически обрезать избыточные белые поля около изображения, используйте функцию getbbox() из библиотеки Pillow. Она поможет обозначить границы заполненных областей изображения. Затем, с помощью функции crop(), вы сможете обрезать необходимые участки. Вот как это делается:

Python
Скопировать код
from PIL import Image

def trim_whitespace(image_path):
    with Image.open(image_path) as img:
        bbox = img.getbbox() # Определяем границы заполненных областей
        if bbox:
            img = img.crop(bbox)  # Обрезаем избыточные пространства
        img.save('trimmed_image.png')  # Сохраняем результат

trim_whitespace('your_image.png')  # Укажите путь к нужному вам изображению

Запустите функцию trim_whitespace(), указав путь к файлу с изображением, чтобы избавиться от белых полей.

Кинга Идем в IT: пошаговый план для смены профессии

Альтернативные методы обрезки и оптимизации

Если вы работаете с графиками matplotlib, не волнуйтесь, у нас для вас также есть решения!

Подгонка изображения в matplotlib

Чтобы ваши изображения выглядели идеально, используйте аргументы bbox_inches='tight' и pad_inches=0 при вызове метода plt.savefig():

Python
Скопировать код
import matplotlib.pyplot as plt

# Создаём график...
plt.plot(...)

# Сохраняем без белых полей
plt.savefig('tight_figure.png', bbox_inches='tight', pad_inches=0)

Удаление излишних отступов и осей

Если по какой-то причине элементы осей занимают слишком много места, которое можно было бы эффективнее использовать, отключите оси с помощью plt.gca().set_axis_off() и установите минимальные отступы с помощью команды plt.margins(0,0):

Python
Скопировать код
plt.gca().set_axis_off()  # Отключаем оси
plt.margins(0,0)  # Удаляем отступы

Чтобы удалить лишнее пространство, настроенное для субплотов, воспользуйтесь методом plt.subplots_adjust():

Python
Скопировать код
plt.subplots_adjust(left=0, right=1, top=1, bottom=0)  # Оптимизируем использование пространства

Прозрачный фон

В случае необходимости использовать прозрачный фон, аргумент transparent=True решит вашу проблему:

Python
Скопировать код
plt.savefig('transparent_figure.png', transparent=True)  # Сохраняем изображение с прозрачным фоном

Функция "всё в одном": создание и обрезка

Вы можете скомбинировать возможности matplotlib и Pillow, чтобы создать функцию, которая осуществит как построение графика, так и обрезку лишнего:

Python
Скопировать код
def create_and_trim_plot(x, y):
    plt.figure()
    plt.plot(x, y)
    plt.savefig('temporary_figure.png', bbox_inches='tight', pad_inches=0)  # Этап предварительной обрезки
    trim_whitespace('temporary_figure.png')  # Финальная обрезка

Такой подход с двойной обрезкой даст наилучший результат.

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

Ниже приведено пример того, как избавиться от лишних белых полей, окружающих ваше изображение:

Markdown
Скопировать код
Множество белых полей (До): 🌫️🖼️🌫️

Произведите обрезку:

Python
Скопировать код
image.crop(bounding_box)  # 🖼️✂️➡️🖼️

Теперь ваше изображение выглядит безупречно:

Markdown
Скопировать код
Обрезанное и аккуратное (После): 🖼️

Просто и эффективно.

За рамками статических изображений: методы для обработки динамичных сценариев

В контексте веб-приложений и пользовательского интерфейса ситуация немного сложнее.

Визуализация в веб-приложении

С помощью CSS можно настроить границы изображения на вашем сайте. Чтобы избавиться от избыточных белых полей в рамках HTML, установите атрибут style="display:block;" для вашего изображения:

HTML
Скопировать код
<img src="trimmed_image.png" style="display:block;" />

Это изображение будет отображаться без лишних отступов.

Работа с фреймворками GUI

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

Python
Скопировать код
from tkinter import PhotoImage
trimmed_image = PhotoImage(file="trimmed_image.png")

С помощью этого подхода ваши изображения всегда будут выглядеть безупречно.

Потенциальные проблемы: сложные случаи

В некоторых случаях избыточные белые поля никак не хотят "уйти" — например, из-за эффектов тени или антиалиасинга. Что делать в такой ситуации:

  • Настройте обрезку в Pillow: используйте ImageOps.expand перед getbbox() в борьбе с антиалиасингом.
  • Настройте порог в matplotlib: используйте параметр extent или выполните ручную обрезку.
  • Тестируйте: проводите тестовые проверки, визуально осматривая результаты или используя сравнение изображений.

Полезные материалы

  1. Обрезка белых полей с помощью Pillow – Stack Overflow — обсуждение различных способов обрезки белых полей;
  2. Модуль ImageOps – документация Pillow (форк PIL) 10.2.0 — важная информация о работе с методами обрезки изображений в Pillow;
  3. Python PIL | Метод Image.crop() – GeeksforGeeks — подробное пошаговое руководство по использованию метода Image.crop() в PIL Python;
  4. Многомерный массив (ndarray) — Руководство NumPy v1.26 — глубокое погружение в возможности NumPy для работы с многомерными массивами;
  5. Обработка изображений в Python с помощью Pillow — вводное руководство по обработке изображений в Python;
  6. Удаление белых полей вокруг сохранённого изображения – Stack Overflow — ещё одно обсуждение о том, как удалить избыточные белые поля вокруг изображений с применением matplotlib.