Найти в Дзене
ФЭД

Как разделить несколько фото с одного файла автоматически с помощью Python

Если вы насканировали фотографий, причем у вас несколько фото размещены в одном файле, а вам не хочется вручную копировать и разрезать их на несколько частей, то можно сделать это с помощью кода на питоне. Ссылка на гитхаб: <https://gist.github.com/ElenaInDespair/1f24a57f1664e4192857fd7e22038df1> Коротенько опишу, что происходит: import cv2
import os def detect_and_crop_photos_in_folder(folder_path): for filename in os.listdir(folder_path): if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff')): file_path = os.path.join(folder_path, filename) print(f"Processing {file_path}") image = cv2.imread(file_path) if image is None: print(f"Failed to load {file_path}") continue gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV) contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) index = 0 for cnt in contours: area = cv2.contourArea(cnt) ... index += 1 folder_path = 'your_folder' detect_an

Если вы насканировали фотографий, причем у вас несколько фото размещены в одном файле, а вам не хочется вручную копировать и разрезать их на несколько частей, то можно сделать это с помощью кода на питоне.

Ссылка на гитхаб:

<https://gist.github.com/ElenaInDespair/1f24a57f1664e4192857fd7e22038df1>

Коротенько опишу, что происходит:

import cv2
import os

  • cv2 - это OpenCV, библиотека для обработки изображений;
  • os - операционная система, которая обрабатывает операции с файловой системой, например, перечисление файлов.

def detect_and_crop_photos_in_folder(folder_path):

  • Определяет функцию, которая обрабатывает все изображения в указанном каталоге folder_path.

for filename in os.listdir(folder_path):

  • Перебирает каждый файл в папке.

if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff')):

  • Проверяет, является ли файл изображением, основываясь на его расширении (без учета регистра).

file_path = os.path.join(folder_path, filename)

print(f"Processing {file_path}")

  • Комбинирует путь к папке и имя файла, чтобы получить полный путь к файлу.
  • Выводит сообщение, указывающее, какой файл обрабатывается.

image = cv2.imread(file_path)

if image is None:

print(f"Failed to load {file_path}")

continue

  • Загружает изображение.
  • Если загрузка не удалась (например, файл поврежден), то идет к следующему файлу.

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

  • Преобразует изображение из цветного в оттенки серого, упрощая обработку.

_, thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)

  • Применяется пороговое значение: пиксели, значение которых превышает 200, становятся черными (0) после инверсии. Пиксели, значение которых меньше или равно 200, становятся белыми (255).
  • На этом этапе выделяются более темные области или объекты, представляющие интерес.

contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

  • Находит контуры (ребра фигур) на изображении с пороговым значением.
  • cv2.RETR_EXTERNAL извлекает только внешние контуры.
  • cv2.CHAIN_APPROX_SIMPLE сжимает контуры для экономии памяти.

index = 0

for cnt in contours:

area = cv2.contourArea(cnt)

...

index += 1

  • Инициализирует индекс счетчика для присвоения имен выходным файлам.
  • Обводит циклом каждый обнаруженный контур:
  1. Вычисляет площадь контуров.
  2. Пропускает небольшие контуры (площадью менее 1000 пикселей), чтобы не обращать внимания на шум.
  3. Находит ограничивающий прямоугольник вокруг контура (x, y, w, h).
  4. Обрезает исходное изображение в соответствии с этой рамкой.
  5. Сохраняет обрезанное изображение с именем файла, указывающим его происхождение, и индексом.
  6. Увеличивает индекс для следующего кадрирования.

folder_path = 'your_folder'

detect_and_crop_photos_in_folder(folder_path)

Задает путь к папке для обработки и вызывает функцию для запуска обнаружения и обрезки.

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