сортировка портрет фото программа
Разберу задачу пошагово — как откалибровать фотографии в папке, чтобы размер лица был 40–60 % кадра 500;500 пикселей.
Способ 1. Вручную в фоторедакторе
Подойдут: Photoshop, GIMP (бесплатно), Paint.NET (бесплатно) и др.
Пошаговая инструкция:
Откройте фото в редакторе.
Найдите инструмент «Выделение» (обычно прямоугольник) и выделите область с лицом.
Оцените размер выделения:
Если меньше 40 % высоты кадра (<200 px), увеличьте масштаб фото.
Если больше 60 % (>300 px), уменьшите масштаб.
Используйте инструмент «Кадрирование» (Crop), чтобы обрезать фото до 500;500 px. Убедитесь, что лицо по центру.
Сохраните файл (лучше через «Сохранить как…», чтобы не перезаписать оригинал).
Повторите для всех фото.
Способ 2. Автоматизация с OpenCV (Python)
Подходит для пакетной обработки. Потребуется Python и библиотеки.
Установка зависимостей:
bash
pip install opencv-python numpy
Код скрипта:
python
*
import cv2
import os
import numpy as np
# Путь к папке с фото
input_folder = 'путь к фото'
output_folder = 'сохранен'
# Загрузка каскада для детектирования лиц
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# Целевой размер кадра
target_size = 500
min_face_percent = 40 # 40%
max_face_percent = 60 # 60%
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
# Чтение изображения
img = cv2.imread(os.path.join(input_folder, filename))
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Детектирование лиц
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
if len(faces) > 0:
# Берём первое найденное лицо (самое крупное)
x, y, w, h = faces[0]
# Вычисляем процент лица относительно высоты кадра
face_percent = (h / img.shape[0]) * 100
if face_percent < min_face_percent:
# Увеличиваем масштаб
scale = (target_size * (min_face_percent / 100)) / h
elif face_percent > max_face_percent:
# Уменьшаем масштаб
scale = (target_size * (max_face_percent / 100)) / h
else:
scale = 1
# Масштабируем изображение
new_size = (int(img.shape[1] * scale), int(img.shape[0] * scale))
resized = cv2.resize(img, new_size)
# Кадрируем до 500x500, центрируя лицо
center_x = x + w // 2
center_y = y + h // 2
# Координаты обрезки
left = max(0, center_x * scale - 250)
top = max(0, center_y * scale - 250)
right = left + 500
bottom = top + 500
# Если обрезка выходит за границы, сдвигаем
if right > resized.shape[1]:
left -= right - resized.shape[1]
right = resized.shape[1]
if bottom > resized.shape[0]:
top -= bottom - resized.shape[0]
bottom = resized.shape[0]
cropped = resized[int(top):int(bottom), int(left):int(right)]
# Сохраняем результат
cv2.imwrite(os.path.join(output_folder, filename), cropped)
else:
print(f"Лицо не найдено на фото: {filename}")
Как использовать:
Замените input_folder и output_folder на реальные пути.
Запустите скрипт. Он обработает все фото в папке.
Способ 3. Готовые программы для пакетной обработки
Варианты:
FastStone Photo Resizer — бесплатный инструмент с поддержкой пакетного кадрирования и масштабирования. Можно задать шаблон 500;500 и настроить область фокусировки на лице.
XnView MP — позволяет массово изменять размер и кадрировать. Используйте режим пакетной обработки с настройками Crop.
Adobe Lightroom — в модуле «Develop» используйте пресет с кадрированием 500;500. Вручную корректируйте положение лица для каждого фото.
Важные нюансы
Точность детектирования: OpenCV может пропустить лицо на сложных фото (профиль, тень, низкое качество). Всегда проверяйте результат.
Соотношение сторон: Если исходное фото сильно вытянуто, после кадрирования до 500;500 могут появиться пустые области.
Качество: При масштабировании избегайте многократного увеличения — это снижает чёткость.
Резервное копирование: Перед обработкой сделайте копию исходной папки.
Краткий итог
Для 1–10 фото — ручной способ (GIMP/Photoshop).
Для десятков и сотен фото — скрипт на Python или FastStone.
Если нужна гибкая настройка — Lightroom.
Хотите - уточню какой- то из способов подробнее или помогу адаптировать код под ваши условия?
ещё один код на питоне
есть фото jpg и на нём много фотографий разного размера с рамками нужно их разрезать и откалибровать под стандарт 500 точек при этом сохранять пропорции лиц
Алиса
Разберу задачу: нужно извлечь отдельные фотографии из «коллажа» (фото с множеством фото в рамках), обрезать их и привести к размеру 500 px с сохранением пропорций.
Код на Python с OpenCV
python
*
import cv2
import numpy as np
import os
from pathlib import Path
def extract_photos_from_collage(input_path, output_folder, target_size=500):
"""
Извлекает отдельные фото из коллажа и приводит их к целевому размеру.
Args:
input_path: путь к изображению-коллажу
output_folder: папка для сохранения результатов
target_size: целевой размер по большей стороне (по умолчанию 500 px)
"""
# Создаём выходную папку, если её нет
Path(output_folder).mkdir(parents=True, exist_ok=True)
# Читаем изображение
image = cv2.imread(input_path)
if image is None:
raise ValueError(f"Не удалось загрузить изображение: {input_path}")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Улучшаем контраст для лучшего детектирования
gray = cv2.equalizeHist(gray)
# Применяем размытие для уменьшения шума
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# Детектируем края
edges = cv2.Canny(blurred, 50, 150)
# Находим контуры
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
photo_count = 0
for i, contour in enumerate(contours):
# Фильтруем слишком маленькие контуры
area = cv2.contourArea(contour)
if area < 1000: # Минимальная площадь — 1000 px;
continue
# Аппроксимируем контур до прямоугольника
perimeter = cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, 0.02 * perimeter, True)
# Ищем прямоугольники (4 вершины)
if len(approx) == 4:
# Получаем координаты ограничивающего прямоугольника
x, y, w, h = cv2.boundingRect(approx)
# Дополнительные фильтры:
# 1. Соотношение сторон (не слишком вытянутые)
aspect_ratio = w / h
if aspect_ratio < 0.3 or aspect_ratio > 3:
continue
# 2. Минимальный размер (не меньше 50 px по любой стороне)
if w < 50 or h < 50:
continue
# Извлекаем область интереса
roi = image[y:y + h, x:x + w]
# Масштабируем с сохранением пропорций
resized_photo = resize_with_aspect_ratio(roi, target_size)
# Сохраняем результат
output_path = os.path.join(output_folder, f"extracted_photo_{photo_count:03d}.jpg")
cv2.imwrite(output_path, resized_photo)
photo_count += 1
print(f"Сохранено фото {photo_count}: {w}x{h} -> {resized_photo.shape[1]}x{resized_photo.shape[0]} px")
print(f"\nВсего извлечено и обработано: {photo_count} фотографий")
def resize_with_aspect_ratio(image, target_size):
"""
Масштабирует изображение с сохранением пропорций, ограничивая по большей стороне.
"""
height, width = image.shape[:2]
# Определяем, какая сторона больше
if width > height:
new_width = target_size
new_height = int((height / width) * target_size)
else:
new_height = target_size
new_width = int((width / height) * target_size)
return cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_AREA)
# Использование
if __name__ == "__main__":
input_image = "collage.jpg" # Путь к вашему коллажу
output_directory = "extracted_photos" # Папка для результатов
extract_photos_from_collage(input_image, output_directory, target_size=500)
Как это работает
Чтение изображения — загружаем коллаж.
Предобработка — улучшаем контраст и применяем размытие для снижения шума.
Детектирование краёв — используем алгоритм Canny для поиска границ.
Поиск контуров — находим все внешние контуры на изображении.
Фильтрация контуров:
отбрасываем слишком маленькие области (площадь < 1000 px;);
ищем прямоугольные формы (4 вершины);
фильтруем по соотношению сторон (не слишком вытянутые);
проверяем минимальный размер (; 50 px по любой стороне).
Извлечение областей — вырезаем найденные прямоугольники из исходного изображения.
Масштабирование — изменяем размер с сохранением пропорций (большая сторона = 500 px).
Сохранение — записываем каждое фото в отдельную папку с нумерацией.
Свидетельство о публикации №126040100587