поиск похожих фото jpg в папке

есть папка с фотографиями jpg
в ней наша программа и также другие папки вложения
нужно найти любые 10 фото которые ниболее похожи по содержанию
для этого можно сравнить их копии размером около 80 пикселей
после этого поместить эти фото в папку фот1


Конечно, я помогу вам с этой задачей
На основе вашего описания, я предполагаю,
что вы хотите написать программу (скрипт на Python), которая:

Найдёт все JPG-фотографии в указанной папке (включая подпапки).
Сравнит их на схожесть по содержанию, используя уменьшенные копии изображений (размером около 80x80 пикселей). Для сравнения я использую среднеквадратичную ошибку (MSE) между пикселями — это простой и эффективный способ определить визуальную схожесть.

Найдёт 10 фотографий, которые наиболее похожи на "среднее" изображение (т.е. на типичный представитель всех фото в папке). Это интерпретация "наиболее похожи по содержанию" — мы вычисляем среднее изображение по всем, а затем выбираем 10 ближайших к нему.
Поместит эти 10 фото в новую папку "fot1" (она будет создана автоматически, если не существует).

Важные замечания:
Это не идеальный метод для сложного анализа содержимого (например, распознавания объектов), но он подходит для грубой оценки схожести по пикселям.
Если у вас много изображений (сотни или тысячи), скрипт может работать медленно, так как сравнивает все пары.

Убедитесь, что у вас установлены библиотеки: Pillow (для работы с изображениями) и numpy (для расчётов). Установите их командой: pip install pillow numpy.
Скрипт работает рекурсивно по подпапкам.
Если изображений меньше 10, он скопирует все найденные.
Путь к папке нужно указать в коде (в переменной folder_path).


Код на Python
Вот полный скрипт. Скопируйте его в файл, например,
find_similar_photos.py, и запустите командой python find_similar_photos.py.



import os
import shutil
import numpy as np
from PIL import Image

# Укажите путь к папке с фото (измените на свой)
folder_path = '/path/to/your/folder'  # Например, 'C:/Photos' или '/home/user/photos'

# Папка для результатов
output_folder = os.path.join(folder_path, 'fot1')
os.makedirs(output_folder, exist_ok=True)

# Функция для уменьшения изображения до 80x80
def resize_image(image_path, size=(80, 80)):
    with Image.open(image_path) as img:
        img = img.convert('RGB')  # Убедимся, что в RGB
        return np.array(img.resize(size, Image.Resampling.LANCZOS))

# Найдём все JPG-файлы рекурсивно
jpg_files = []
for root, dirs, files in os.walk(folder_path):
    for file in files:
        if file.lower().endswith('.jpg'):
            jpg_files.append(os.path.join(root, file))

if len(jpg_files) < 10:
    print(f"Найдено только {len(jpg_files)} JPG-файлов. Копируем все.")
    selected_files = jpg_files
else:
    # Уменьшим все изображения и сохраним в список
    resized_images = []
    for file in jpg_files:
        try:
            resized = resize_image(file)
            resized_images.append((file, resized))
        except Exception as e:
            print(f"Ошибка при обработке {file}: {e}")

    # Вычислим среднее изображение
    if not resized_images:
        print("Нет подходящих изображений.")
        exit()
   
    avg_image = np.mean([img for _, img in resized_images], axis=0)
   
    # Вычислим MSE для каждого изображения относительно среднего
    similarities = []
    for file, img in resized_images:
        mse = np.mean((img - avg_image) ** 2)
        similarities.append((file, mse))
   
    # Отсортируем по возрастанию MSE (наименьший — наиболее похожий)
    similarities.sort(key=lambda x: x[1])
   
    # Выберем топ-10
    selected_files = [file for file, _ in similarities[:10]]

# Скопируем выбранные файлы в папку fot1
for file in selected_files:
    shutil.copy(file, output_folder)
    print(f"Скопировано: {os.path.basename(file)}")

print(f"Готово! Выбранные фото в папке: {output_folder}")




Как это работает:
Поиск файлов: Скрипт рекурсивно проходит по папке и подпапкам, собирая все .jpg файлы (регистр не важен).

Уменьшение: Каждое изображение уменьшается до 80x80 пикселей с помощью PIL (с антиалиасингом для качества).

Сравнение: Вычисляется среднее изображение (по всем пикселям), затем для каждого фото рассчитывается MSE (среднеквадратичная ошибка) относительно этого среднего. Чем меньше MSE, тем фото ближе к "типичному".

Выбор: Берутся 10 фото с наименьшим MSE.
Копирование: Файлы копируются в fot1 (с сохранением оригинальных имён).
Тестирование и советы:

Запустите на небольшой папке сначала, чтобы проверить.
Если MSE не подходит (например, для фото с разными темами), рассмотрите более продвинутые методы, как perceptual hashing (библиотека imagehash).
Но для вашего описания это должно сработать.

Если "наиболее похожи" значит что-то другое (например, найти кластер похожих фото или сравнить с конкретным изображением), уточните — я скорректирую код
Если возникнут ошибки или нужны доработки, дайте знать.


Рецензии