Хитрости Python: изменение формы изображений с помощью PyTorch для получения идеальных квадратов

В мире обработки изображений часто встречаются изображения с различными соотношениями сторон. Однако при работе со сверточными нейронными сетями (CNN) или другими моделями, требующими входных данных квадратной формы, нам часто необходимо преобразовать эти изображения в идеальные квадраты. В этой статье блога мы рассмотрим различные методы приведения изображений к квадратным размерам с помощью PyTorch. Я расскажу вам о каждом методе, используя разговорный язык, и попутно приведу примеры кода. Итак, приступим!

Метод 1: Заполнение нулями
Самый простой способ преобразовать изображение в квадратную форму — дополнить его нулями. Мы рассчитаем необходимое отступы для каждой стороны на основе ширины и высоты изображения. Вот код, иллюстрирующий это:

import torch
def pad_to_square(image):
    height, width, _ = image.shape
    max_dim = max(height, width)
    pad_height = max_dim - height
    pad_width = max_dim - width
    padded_image = torch.zeros((max_dim, max_dim, 3))
    padded_image[:height, :width, :] = image
    return padded_image

Метод 2: заполнение средним цветом
Вместо заполнения нулями мы также можем дополнить изображение средним значением цвета исходного изображения. Это помогает сохранить визуальное содержание изображения, делая его квадратным. Вот пример реализации:

import torch
def pad_to_square_mean(image):
    height, width, _ = image.shape
    max_dim = max(height, width)
    pad_height = max_dim - height
    pad_width = max_dim - width
    mean_color = torch.mean(image, dim=(0, 1))
    padded_image = torch.zeros((max_dim, max_dim, 3))
    padded_image[:height, :width, :] = image
    padded_image[height:, width:, :] = mean_color
    return padded_image

Метод 3: обрезка по центру
Другой подход к преобразованию изображений в квадраты — обрезка по центру. Мы посчитаем разницу между шириной и высотой, а затем обрежем изображение одинаково с обеих сторон. Вот пример реализации:

import torch
def pad_to_square_center_crop(image):
    height, width, _ = image.shape
    max_dim = max(height, width)
    pad_height = max_dim - height
    pad_width = max_dim - width
    top = pad_height // 2
    bottom = pad_height - top
    left = pad_width // 2
    right = pad_width - left
    padded_image = torch.nn.functional.pad(image, (left, right, top, bottom))
    return padded_image

Метод 4: изменение масштаба
Изменение масштаба изображения — это еще один метод преобразования его в квадратную форму. Мы изменим размер изображения, сохранив его соотношение сторон, а затем заполним оставшееся пространство, чтобы сделать его квадратным. Вот код:

import torch
from torchvision import transforms
def pad_to_square_rescale(image):
    height, width, _ = image.shape
    max_dim = max(height, width)
    rescale_transform = transforms.Resize((max_dim, max_dim))
    rescaled_image = rescale_transform(image)
    return rescaled_image

В этой статье блога мы рассмотрели несколько методов преобразования изображений в квадратные размеры с помощью PyTorch. Мы рассмотрели заполнение нулями, заполнение средним цветом, обрезку по центру и изменение масштаба. Каждый метод имеет свои преимущества и варианты использования, поэтому выберите тот, который лучше всего соответствует вашим потребностям. Используя эти методы, вы можете гарантировать, что ваши изображения совместимы с квадратными моделями, такими как CNN. Приятного кодирования!