У меня есть много файлов с одним и тем же изображением в разном разрешении, подходящих для всех устройств, таких как мобильный телефон, компьютер, psp и т. Д. Теперь я пытаюсь отображать на странице только уникальные изображения, но не знаю, как это сделать. Я мог бы избежать этого, если бы в первую очередь поддерживал базу данных, но я этого не сделал. И мне нужна ваша помощь в обнаружении самых крупных уникальных картинок.
Как обнаружить похожие изображения в PHP?
Ответы (4)
Что ж, даже у вас есть довольно много алгоритмов для этого, я считаю, что было бы быстрее сделать это вручную. Загрузите все изображения, загрузите их во что-то вроде фотогалереи Windows Live или любое другое программное обеспечение, которое может сопоставить похожие изображения. Это займет у вас несколько часов, но реализация алгоритма сопоставления изображений может занять гораздо больше времени. После этого вы можете потратить дополнительное время на внесение изменений в вашу текущую систему, чтобы хранить все в БД. Устраните причину проблемы, а не ее симптомы.
Установите gd2 и lib puzzle на свой сервер.
Lib Puzzle удивительна, и с ней легко играть. Проверьте этот фрагмент
<?php
# Compute signatures for two images
$cvec1 = puzzle_fill_cvec_from_file('img1.jpg');
$cvec2 = puzzle_fill_cvec_from_file('img2.jpg');
# Compute the distance between both signatures
$d = puzzle_vector_normalized_distance($cvec1, $cvec2);
# Are pictures similar?
if ($d < PUZZLE_CVEC_SIMILARITY_LOWER_THRESHOLD) {
echo "Pictures are looking similar\n";
} else {
echo "Pictures are different, distance=$d\n";
}
# Compress the signatures for database storage
$compress_cvec1 = puzzle_compress_cvec($cvec1);
$compress_cvec2 = puzzle_compress_cvec($cvec2);
Во-первых, ваша проблема не связана с PHP, поэтому я удалил этот тег и добавил более подходящие теги.
Умное выполнение этого не потребует сравнений NxN. Вы можете использовать множество эвристик, но сначала я хотел бы вас спросить:
Все ли копии одного изображения точно изменяют размер друг друга (выполняется ли некоторая обрезка - сопоставление обрезанных изображений с оригиналом может быть более трудным и трудоемким)?
Все ли изображения создаются (изменяются) с помощью одного и того же инструмента?
А как насчет параметров, которые вы использовали для изменения размера? Например, все ли картинки для отображения на PSP имеют одинаковое разрешение?
Как вы оцениваете, сколько уникальных изображений у вас есть (т. Е. Сколько может быть копий каждого изображения - в среднем)?
Вы уже сделали какую-либо категоризацию? Например, все ли мобильные изображения находятся в отдельной папке (или имеют другое разрешение, чем изображения с ПК)? Уже одно это может сократить количество сравнений на много, даже если в противном случае вы примените грубую силу.
Подсказка высшего уровня о том, почему вам не нужны сравнения NxN: вы можете разработать множество различных приблизительных хешей (например, распределение высокочастотных / низкочастотных коэффициентов jpeg) и сгруппировать «потенциально» похожие изображения вместе. Это может уменьшить количество требуемых сравнений в 10–100 раз или даже больше в зависимости от качества используемой эвристики и набора данных. Хеширование может выполняться даже для частей изображений. 30000 - не очень большое число, если использовать правильную технику.
php
, потому что изображения находятся в сети, и я использую локальный веб-сайт для управления ими, и весь веб-сайт разработан на php, и я хочу, чтобы код php изолировал другие файлы и отображал только самые большие изображения.
- person mrN; 06.01.2011
Вы должны проверить, какое из двух изображений самое маленькое, определить его размер, а затем сравнить только пиксели в пределах размера прямоугольника.
30000*30000*10/1000/60/60/24 = 104.17
. На это понадобится чуть больше ста дней. Wohoo! - person jwueller   schedule 05.01.2011