История изменений
Исправление
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,
:
ты вроде искал когда-то истребители красного цвета и аналогично раскрашенных девушек, своим алгоритмом, на просторах интернета?
Нет, таким не занимался, это уже область ИИ, где нужно серьёзно копаться.
Я использую при работе с изображениями два подхода:
— Для поиска похожих изображений использую 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