Вопрос или проблема
Я ищу программное обеспечение для командной строки Linux, которое может напечатать “оценку сходства” заданного эталонного изображения по сравнению со всеми изображениями в папке.
Эталонное изображение – это измененная по размеру версия одного из изображений, присутствующих в папке, с низким разрешением. Эталонное изображение может не быть точно таким же, как оригинал. Оно может быть слегка подрезано или изменено.
Цель состоит в том, чтобы найти изображение, которое соответствует оригиналу наилучшим образом.
findimagedupes
является хорошим кандидатом, но, насколько мне известно, он может лишь находить все изображения, у которых оценка сходства выше определенного порога. То, что я хочу сделать, это отсортировать все изображения в моей коллекции по их оценке сходства.
Вы могли бы довольно просто создать свое собственное решение с помощью Python + SciKit.Image, начиная с примера, приведенного здесь для Структурного Сходства. Вам может быть также полезна эта статья.
Ответ или решение
Для решения вашей задачи по поиску наиболее подходящего изображения в директории с использованием командной строки Linux, вы можете рассмотреть создание собственного инструмента на базе Python и библиотеки SciKit.Image или OpenCV. Данный подход будет также обеспечивать возможность сортировки изображений по их схожести с эталонным изображением, что является вашей основной целью.
Этапы разработки инструмента
-
Установка необходимых библиотек:
Перед началом работы убедитесь, что на вашем компьютере установлены Python и следующие библиотеки:
pip install scikit-image opencv-python numpy
-
Импорт библиотек:
В вашем скрипте вам понадобится импортировать необходимые библиотеки:
import os import cv2 import numpy as np from skimage.metrics import structural_similarity as ssim
-
Функция для вычисления схожести:
Вам необходимо реализовать функцию, которая будет принимать две картинки и возвращать их "оценку схожести":
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
-
Сравнение изображений:
Создайте функцию, которая будет просматривать все изображения в указанной директории и вычислять схожесть с эталонным изображением:
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
-
Запуск программы:
Завершите программу основной функцией, которая будет вызывать ваши методы:
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 для вычисления структурной схожести, вы сможете реализовать эффективный механизм оценки. Ваш инструмент будет не только вычислять оценку схожести, но и сортировать изображения, выводя их в порядке убывания схожести, что значительно упростит дальнейшую работу с изображениями.
Данный подход также можно развивать и улучшать, например, добавить поддержку различных форматов изображений или возможность менять параметры для улучшения точности обработки.