CLI инструмент для нахождения лучшего соответствия эталонного изображения в директории

Вопрос или проблема

Я ищу программное обеспечение для командной строки Linux, которое может напечатать “оценку сходства” заданного эталонного изображения по сравнению со всеми изображениями в папке.

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

Цель состоит в том, чтобы найти изображение, которое соответствует оригиналу наилучшим образом.

findimagedupes является хорошим кандидатом, но, насколько мне известно, он может лишь находить все изображения, у которых оценка сходства выше определенного порога. То, что я хочу сделать, это отсортировать все изображения в моей коллекции по их оценке сходства.

Вы могли бы довольно просто создать свое собственное решение с помощью Python + SciKit.Image, начиная с примера, приведенного здесь для Структурного Сходства. Вам может быть также полезна эта статья.

Ответ или решение

Для решения вашей задачи по поиску наиболее подходящего изображения в директории с использованием командной строки Linux, вы можете рассмотреть создание собственного инструмента на базе Python и библиотеки SciKit.Image или OpenCV. Данный подход будет также обеспечивать возможность сортировки изображений по их схожести с эталонным изображением, что является вашей основной целью.

Этапы разработки инструмента

  1. Установка необходимых библиотек:

    Перед началом работы убедитесь, что на вашем компьютере установлены Python и следующие библиотеки:

    pip install scikit-image opencv-python numpy
  2. Импорт библиотек:

    В вашем скрипте вам понадобится импортировать необходимые библиотеки:

    import os
    import cv2
    import numpy as np
    from skimage.metrics import structural_similarity as ssim
  3. Функция для вычисления схожести:

    Вам необходимо реализовать функцию, которая будет принимать две картинки и возвращать их "оценку схожести":

    def calculate_similarity(imageA, imageB):
       # Преобразование изображений в оттенки серого
       grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
       grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)
    
       # Вырезание изображений до той же формы
       grayA = cv2.resize(grayA, (grayB.shape[1], grayB.shape[0]))
    
       # Вычисление SSIM
       score, _ = ssim(grayA, grayB, full=True)
       return score
  4. Сравнение изображений:

    Создайте функцию, которая будет просматривать все изображения в указанной директории и вычислять схожесть с эталонным изображением:

    def find_best_match(reference_image_path, directory):
       reference_image = cv2.imread(reference_image_path)
    
       # Словарь для хранения оценок схожести
       similarity_scores = {}
    
       # Итерация по файлам в директории
       for filename in os.listdir(directory):
           if filename.endswith(('.png', '.jpg', '.jpeg')):  # Поддерживаемые форматы
               image_path = os.path.join(directory, filename)
               current_image = cv2.imread(image_path)
               score = calculate_similarity(reference_image, current_image)
               similarity_scores[filename] = score
    
       # Сортировка изображений по схожести
       sorted_images = sorted(similarity_scores.items(), key=lambda x: x[1], reverse=True)
    
       return sorted_images
  5. Запуск программы:

    Завершите программу основной функцией, которая будет вызывать ваши методы:

    if __name__ == "__main__":
       reference_image_path = "path/to/reference/image.jpg"
       directory = "path/to/image/directory"
    
       best_matches = find_best_match(reference_image_path, directory)
       for filename, score in best_matches:
           print(f"{filename}: {score:.4f}")

Выводы

Создание CLI инструмента для поиска наиболее подходящего изображения в директории – это оптимальное решение для вашей задачи. Изучив возможности библиотеки OpenCV и метода SSIM для вычисления структурной схожести, вы сможете реализовать эффективный механизм оценки. Ваш инструмент будет не только вычислять оценку схожести, но и сортировать изображения, выводя их в порядке убывания схожести, что значительно упростит дальнейшую работу с изображениями.

Данный подход также можно развивать и улучшать, например, добавить поддержку различных форматов изображений или возможность менять параметры для улучшения точности обработки.

Оцените материал
Добавить комментарий

Капча загружается...