Страницы

Поиск по вопросам

пятница, 28 июня 2019 г.

Как искать похожие изображения между двумя папками?

Есть ли возможность у findimagedupes сравнивать изображения в одной папке с другой?
Например, в одной папке 100 изображений, и в другой столько же. В первой папке есть одно изображение, более, чем на 85%, похожее на одно изображение в другой папке.
Я пробовал делать так:
findimagedupes -t 85 "первая_папка/*" "вторая_папка/*"
но дело в том, что он показывает совпадения, которые нашлись в первой папке и/или во второй. А надо, чтобы сообщал, что «найдено изображение в папке первая_папка, которое совпадает с изображением во вторая_папка»


Ответ

можно в цикле перебрать все пары файлов:
$ for f1 in первый_каталог/*; do \ for f2 in второй_каталог/*; do \ findimagedupes -t 85 $f1 $f2; done; done

если же требуется, чтобы в выводимых строках пары файлов не были перемешаны (первым может идти файл то из первого, то из второго каталога), то можно каждую строку отсортировать, воспользовавшись возможностью программы findimagedupes передавать получаемые строки на обработку указанному скрипту (см. man findimagedupes):
$ for f1 in первый_каталог/*; do \ for f2 in второй_каталог/*; do \ findimagedupes -t 85 -i \ 'VIEW(){ for f in "$@"; do echo $f; done | sort | xargs echo; }' -- \ $f1 $f2; done; done

такой перебор каждого-с-каждым довольно ресурсоёмок («отпечатки»-fingerprints вычисляются при каждом запуске), поэтому для большей оптимальности следует либо дополнить нужной функциональностью саму программу, либо, вызывая её для всех файлов сразу, несколько усложнить скрипт, передаваемый программе опцией -i

обновление
«усложнил» скрипт:
#!/bin/bash
d1=$(realpath $1) d2=$(realpath $2)
e1=$(echo $d1 | sed 's,/,\\/,g')
findimagedupes -t 85 -i 'VIEW() { n1=$(for f in "$@"; do echo $f; done \ | sed -n "/^'$e1'/{p;q}"); n2=$(for f in "$@"; do echo $f; done \ | grep "^'$d2'" | xargs echo); if [ -n "$n1" -a "$n2" ]; then \ for f in "$@"; do echo $f; done | sed -n "/^'$e1'/!{s|^|$n1 |;p}"; fi; \ }' $d1/* $d2/*
вызывается он с двумя параметрами: первый_каталог второй_каталог (без каких-либо масок, просто пути к каталогам). для каждой строки, генерируемой программой, он оставляет только один файл из первого каталога (первый встретившийся), но разбивает её на несколько строк так, чтобы в каждой получившейся строке было только по одному файлу из второго каталога.
например, строку dir1/file1 dir1/file2 dir2/file1 dir2/file2 он заменит на две строки:
dir1/file1 dir2/file1 dir1/file1 dir2/file2
и, конечно, строки, в которых присутствуют только файлы из первого или только из второго каталога, игнорируются.

Комментариев нет:

Отправить комментарий