Центральная обрезка

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

Я работал над веб-камерой и пи-камерой с разным разрешением. Поэтому я создал функцию обрезки от центра до максимального размера без превышения доступного размера исходного изображения.

import cv2

Импорт библиотеки OpenCV как обычно.

def center_crop(img, dim):
  """Returns center cropped image

  Args:Image Scaling
  img: image to be center cropped
  dim: dimensions (width, height) to be cropped from center
  """

Давайте создадим функцию center_crop() с параметрами в виде изображения и размерами обрезки в виде кортежа (ширина, высота).

  width, height = img.shape[1], img.shape[0]
  #process crop width and height for max available dimension
  crop_width = dim[0] if dim[0]<img.shape[1] else img.shape[1]
  crop_height = dim[1] if dim[1]<img.shape[0] else img.shape[0] 

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

  mid_x, mid_y = int(width/2), int(height/2)
  cw2, ch2 = int(crop_width/2), int(crop_height/2) 
  crop_img = img[mid_y-ch2:mid_y+ch2, mid_x-cw2:mid_x+cw2]
  return crop_img

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

Изображение RGB, прочитанное в OpenCV, будет иметь форму: (высота, ширина, канал). Пример: (920, 1280, 3).

Срезы третьей строки из исходного массива изображений, которые становятся массивом обрезанных изображений. Наконец, возвращает обрезанное по центру изображение.

Масштабирование изображения

Масштабирование изображения — это изменение размера путем сохранения пропорций изображения, т. е. уменьшение и увеличение масштаба.

def scale_image(img, factor=1):
  """Returns resize image by scale factor.
  This helps to retain resolution ratio while resizing.
  Args:
  img: image to be scaled
  factor: scale factor to resize
  """

Определим функцию scale_image() с параметрами image и коэффициентом масштабирования.

return cv2.resize(img,
                (int(img.shape[1]*factor),int(img.shape[0]*factor)))     

Мы будем использовать функцию изменения размера для масштабирования изображения путем умножения коэффициента масштабирования на исходный размер изображения и возврата масштабированного изображения.

Уменьшение масштаба можно выполнить, передав аргумент фактора от 0 до 1. И выше 1 для увеличения масштаба.

Код