Легкие в использовании учебники
Автоматически изменяйте размер всех ваших изображений с помощью Python
Быстрый и простой скрипт для изменения размера всех ваших изображений в папке до желаемых размеров.
Представьте себе: у вас есть ТОННЫ изображений в папке на вашем компьютере, и вы хотите изменить их размер до определенных размеров (изменить высоту или ширину).
Вы могли либо -
- По отдельности загружайте их в какой-нибудь инструмент для изменения размера по одному, или
- Ухх ... массово измените их размер с помощью инструмента для изменения размера (да, я знаю, что они существуют)
Я действительно понимаю, что эти два метода в основном охватывают все, что касается простого изменения размера изображений - ОДНАКО, то, что вы не можете получить (из методов выше), - это чувство удовлетворения после выполнения задачи путем написания сценария самостоятельно.
Итак, приступим. ʕ • ́ᴥ • ̀ʔ っ ♡
Единственная библиотека, которую вам нужно установить, - это 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 (). Нам нужно обработать три случая:
- Измените размер до новой ширины,
- Измените размер на новую высоту,
- Измените размер и высоту, и ширину (и потеряйте соотношение сторон)
Итак, мы хотим передать следующие три параметра:
- Само изображение,
- новое значение ширины,
- новое значение высоты
Итак, теперь у нас есть что-то вроде этого:
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! ʕ • ́ᴥ • ̀ʔ っ ♡