LINUX.ORG.RU

Image unique id [fingerprint/hash] для базы данных

 , ,


1

2

Какой несложный и быстрый хэш есть в библиотеках Debian или ядре Linux для сопоставления уникального id обычным фотографиям?

Хотя бы, чтобы со второго/третьего прохода (2-nd, 3-rd pass) он выбирал уникальный id. Иначе - на ручной разбор, или другой хэш.

Я нашёл вот этот тред на Стэке: http://stackoverflow.com/questions/596262/image-fingerprint-to-compare-simila...
Там упоминается CRC32, MD5, Haar wavelets, phash, LFA (Local Feature Analysis), Image similarity & comparison SDK (300$).

Когда я участвовал в конкурсе Яндекса (imat-2011), то применял для поиска похожих изображений сравнение их образов в цветовом пространстве (прообраз - исходное изображение). Аналогичный способ сравнения есть и для прообраза (например, разбиение 4:3 на 12 зон, вычисление медианы для каждой — получаем 12*3 байтов на изображение).

cast KRoN73, ты вроде искал когда-то истребители красного цвета и аналогично раскрашенных девушек, своим алгоритмом, на просторах интернета?

★★★★★

ты вроде искал когда-то истребители красного цвета и аналогично раскрашенных девушек, своим алгоритмом, на просторах интернета?

Нет, таким не занимался, это уже область ИИ, где нужно серьёзно копаться.

Я использую при работе с изображениями два подхода:

— Для поиска похожих изображений использую 64-битный хеш, алгоритм на
https://bitbucket.org/Balancer/bors-core/src/df59e72452f4f268b72193753ae6e3ba...
и
https://bitbucket.org/Balancer/bors-core/src/df59e72452f4f268b72193753ae6e3ba...

— Для удаления дубликатов в бэкапе домашней фотоколлекции (а то каждое изменение тегов, запись лиц и т.п. порождает лишнюю и ненужную копию) использую bash-самопал такого вида:

image-hash.sh:

if [ ! -e "$1" ]; then
    echo "Image $1 not found"
    exit 1
fi

convert "$1" -strip jpeg:- | md5sum -b | awk '{print $1}'


rm-same-images-hash:
#!/bin/bash

test-bin-x image-hash convert jpeginfo replace realpath || exit 1

CUR_DIR=$(realpath "$1")
RM_DIR=$(realpath "$2")

if [[ "$CUR_DIR" == "" || "$RM_DIR" == "" || "$CUR_DIR" == "$RM_DIR" ]]; then
    echo arguments error: use $0 cur-dir rm-dir
    exit 1
fi

sudo /usr/bin/find "$CUR_DIR" -iname '*.jpg' -print0 | while read -d $'\0' CUR_FILE; do
    RM_FILE="${CUR_FILE/$CUR_DIR/$RM_DIR}"

    if [ ! -e "$RM_FILE" ]; then
        continue
    fi

    if [ "$CUR_FILE" == "$RM_FILE" ]; then
        continue
    fi

#   echo Check $RM_FILE

    CUR_ERR=$(jpeginfo -c "$CUR_FILE" | grep --line-buffered -E "WARNING|ERROR")
    RM_ERR=$(jpeginfo -c "$RM_FILE" | grep --line-buffered -E "WARNING|ERROR")

    if [[ "$CUR_ERR" == "" && "$RM_ERR" != "" ]]; then
        echo rm by err "$RM_FILE"
        sudo rm "$RM_FILE"
        OLD_NAME=$(basename "${RM_FILE}")
        if [ -e "$RM_DIR/.picasa.ini" ]; then
            replace -s "[$OLD_NAME]" "[deleted-file]" -- "$RM_DIR/.picasa.ini"
        fi
        if [ -e "$RM_DIR/Picasa.ini" ]; then
            replace -s "[$OLD_NAME]" "[deleted-file]" -- "$RM_DIR/Picasa.ini"
        fi
        continue;
    fi

    if [[ "$CUR_ERR" != "" && "$RM_ERR" == "" ]]; then
        echo remote ok, local wrong, restore: "$RM_FILE"
        mv "$CUR_FILE" "$CUR_FILE.bak"
        mv "$RM_FILE" "$CUR_FILE"
        touch "$CUR_FILE"
#       rm "$RM_FILE"
        continue;
    fi

    IMAGE_HASH_OF_CUR_FILE=($(image-hash "$CUR_FILE"))
    IMAGE_HASH_OF_RM_FILE=($(image-hash "$RM_FILE"))

    if [[ "$IMAGE_HASH_OF_CUR_FILE" == "$IMAGE_HASH_OF_RM_FILE" ]]; then
#       set -x

        echo rm by img dup "$RM_FILE"
        sudo rm "$RM_FILE"
        OLD_NAME=$(basename "${RM_FILE}")
        if [ -e "$RM_DIR/.picasa.ini" ]; then
            replace -s "[$OLD_NAME]" "[deleted-file]" -- "$RM_DIR/.picasa.ini"
        fi
        if [ -e "$RM_DIR/Picasa.ini" ]; then
            replace -s "[$OLD_NAME]" "[deleted-file]" -- "$RM_DIR/Picasa.ini"
        fi
        continue
    fi
done


Второй скрипт тупо стирает во втором каталоге картинки с такими же именами, как в первом при совпадении хеша изображения (при разнице в метатегах).

test-bin-x — это простенькая проверялка наличия в системе нужных бинарников:
#!/bin/bash

for X in $*; do
    P=$(which "$X")
    if [ ! -x "$P" ] ; then
        echo "Can't find '$X'"
        exit 1
    fi
done

KRoN73 ★★★★★
()
Последнее исправление: KRoN73 (всего исправлений: 1)
Ответ на: комментарий от KRoN73

стирает во втором каталоге картинки с такими же именами, как в первом при совпадении хеша изображения

Полезно, спасибо.

pacify ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.