Легкие в использовании учебники

Автоматически изменяйте размер всех ваших изображений с помощью Python

Быстрый и простой скрипт для изменения размера всех ваших изображений в папке до желаемых размеров.

Представьте себе: у вас есть ТОННЫ изображений в папке на вашем компьютере, и вы хотите изменить их размер до определенных размеров (изменить высоту или ширину).

Вы могли либо -

  1. По отдельности загружайте их в какой-нибудь инструмент для изменения размера по одному, или
  2. Ухх ... массово измените их размер с помощью инструмента для изменения размера (да, я знаю, что они существуют)

Я действительно понимаю, что эти два метода в основном охватывают все, что касается простого изменения размера изображений - ОДНАКО, то, что вы не можете получить (из методов выше), - это чувство удовлетворения после выполнения задачи путем написания сценария самостоятельно.

Итак, приступим. ʕ • ́ᴥ • ̀ʔ っ ♡

Единственная библиотека, которую вам нужно установить, - это OpenCV. Эта замечательная библиотека содержит множество функций, которые вы можете вызывать прямо из коробки, поэтому, если вас интересует что-нибудь, связанное с обработкой изображений, обязательно попробуйте!

Я использую pip для установки python-opencv, поэтому в вашем терминале (не забудьте записать cd в рабочий каталог) просто введите pip install opencv-python (после $):

your-project-directory$ pip install opencv-python

Как только это будет сделано, мы можем приступить к написанию нашего скрипта python (давайте сначала напишем основную функцию):

from cv2 import cv2
import os
def resizeImg():
  # we'll fill in this section below
  return
def main():
  folder = "./originalImgs/"
  newResizedFolder = "./newResizedImgs/"
  for filename in os.listdir(folder):
    img = cv2.imread(os.path.join(folder, filename))
    if img is not None:
      #newImage = resizeImg() #we'll fill in this later
      newImgPath = newResizedFolder + filename
      cv2.imwrite(newImgPath, newImage)
if __name__ == "__main__":
  main()

Итак, в приведенном выше скрипте у нас есть одна основная функция и одна функция resizeImg. В нашей основной функции мы стремимся прочитать каждый файл изображения (имя файла) в папке «./originalImgs/» с помощью cv2.imread, а затем, если это не None, мы передаем его через функцию resizeImg перед сохранением в наша новая папка («./newResizedImgs/»).

Обратите внимание, что вам нужно сначала создать новую папку (в моем случае это «./newResizedImgs/») для хранения всех новых изображений с измененным размером, иначе это не сработает. В качестве альтернативы у вас также может быть условие, при котором, если эта папка не найдена, создайте ее, но это не входит в это руководство.

Хорошо, перейдем к функции resizeImg (). Нам нужно обработать три случая:

  1. Измените размер до новой ширины,
  2. Измените размер на новую высоту,
  3. Измените размер и высоту, и ширину (и потеряйте соотношение сторон)

Итак, мы хотим передать следующие три параметра:

  • Само изображение,
  • новое значение ширины,
  • новое значение высоты

Итак, теперь у нас есть что-то вроде этого:

def resizeImg(image, width=None, height=None)

Затем для остальной части функции нам просто нужно будет получить новые размеры на основе входных данных и рассчитанных соотношений сторон, а затем передать изображение и размеры через функцию cv2.resize (), и все готово. Вот код функции:

def resizeImg(image, width=None, height=None):
  dim=None
  (h,w) = image.shape[:2]
  if width is None and height is None:
    return image
  
  elif width is not None and height is not None:
    dim = (width, height)
  
  elif width is None:
    r = height/float(h)
    dim = (int(w*r), height)
  else:
    r = width / float(w)
    dim = (width, int(h*r))
  resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
  return resized

В основном то, что делает приведенный выше код, - это вычисление размеров (тусклое) на основе того, какие входные данные вы ему даете:

  • Если вы не передадите никаких параметров, он вернет исходное изображение без изменения размера,
  • В противном случае, если вы передаете параметры ширины и высоты, он устанавливает размеры (ширина, высота) без сохранения соотношения сторон
  • В противном случае, если вы передаете только новое значение высоты, оно вычисляет новые размеры, сохраняя соотношение сторон
  • В противном случае (если вы передаете только новое значение ширины) он вычисляет новые размеры, сохраняя соотношение сторон

Если вам интересно, почему мы передаем cv2.INTER_AREA для нашей интерполяции в функции cv2.resize, вот краткое объяснение из их официальных документов:

Different interpolation methods are used. Preferable interpolation methods are cv.INTER_AREA for shrinking and cv.INTER_CUBIC (slow) & cv.INTER_LINEAR for zooming. By default, the interpolation method cv.INTER_LINEAR is used for all resizing purposes.

Вывод

Хорошо, на этом урок на сегодня. Я надеюсь, что вам, ребята, было легко следовать и программировать. Я, вероятно, скоро добавлю ссылку на GitHub и, возможно, ссылку на видео. ПОЖАЛУЙСТА, не стесняйтесь обращаться ко мне, если у вас есть какие-либо мысли / комментарии / вопросы / предложения / что-нибудь вообще!

Счастливого OpenCV-ing! ʕ • ́ᴥ • ̀ʔ っ ♡