сортировка портрет фото программа

такая программа в папке фото есть фотографии нужно откалибровать так чтобы размер лица был около 40-60% формата 500 на 500 точек стандартный портрет

Разберу задачу пошагово — как откалибровать фотографии в папке, чтобы размер лица был 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).

Сохранение — записываем каждое фото в отдельную папку с нумерацией.


Рецензии