Как обнаружить похожие изображения в PHP? - PullRequest
3 голосов
/ 05 января 2011

У меня есть много файлов одной и той же картинки в различном разрешении, подходящих для всех устройств, таких как мобильные устройства, ПК, psp и т. Д. Сейчас я пытаюсь отображать на странице только уникальные картинки, но не знаю, как это сделать. Я мог бы избежать этого, если бы сначала вел базу данных, но не сделал этого. И мне нужна ваша помощь в обнаружении самых больших уникальных фотографий.

Ответы [ 4 ]

14 голосов
/ 06 января 2011

Установите gd2 и lib puzzle на свой сервер.

Головоломка Lib удивительна и с ней легко играть. Проверить этот фрагмент

<?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);
2 голосов
/ 06 января 2011

Ну, даже если для этого есть немало алгоритмов, я думаю, что это было бы быстрее сделать это вручную.Загрузите все изображения, загрузите их в нечто вроде фотоальбома Windows Live или любого другого программного обеспечения, которое может соответствовать аналогичным изображениям.Это займет несколько часов, но реализация алгоритма сопоставления изображений может занять гораздо больше.После этого вы можете потратить дополнительное время на внесение изменений в вашу текущую систему, чтобы хранить все в БД. Исправить причину проблемы, а не ее симптомы.

0 голосов
/ 05 января 2011

Во-первых, ваша проблема не имеет ничего общего с PHP, поэтому я удалил этот тег и добавил более релевантные теги.


Умное выполнение этого не потребует сравнения NxN. Вы можете использовать много эвристики, но сначала я хотел бы спросить вас:

  1. Являются ли все копии одного изображения точным изменением размера друг друга (выполняется ли какое-либо обрезание - сопоставление обрезанных изображений с оригиналом может быть более трудным и трудоемким)?

  2. Все ли изображения сгенерированы (изменены) с использованием одного и того же инструмента?

  3. А как насчет параметров, которые вы использовали для изменения размера? Например, все ли изображения для отображения на PSP имеют одинаковое разрешение?

  4. Как вы оцениваете, сколько у вас уникальных изображений (т.е. сколько копий каждого изображения может быть - в среднем)?

  5. У вас уже есть какая-либо классификация. Например, все ли мобильные изображения находятся в отдельной папке (или имеют другое разрешение, чем изображения на ПК)? Одно это может уменьшить количество сравнений на лот , даже если вы используете грубую силу в противном случае.

Подсказка очень высокого уровня о том, почему вам не нужны сравнения NxN: вы можете разработать много разных приблизительных хэшей (например, распределение высокочастотных и низкочастотных коэффициентов jpeg) и сгруппировать «потенциально» похожие изображения вместе. Это может уменьшить количество требуемых сравнений в 10-100 раз или даже больше в зависимости от качества используемой эвристики и набора данных. Хэширование может быть сделано даже для частей изображений. 30000 не очень большое число, если вы используете правильные методы.

0 голосов
/ 05 января 2011

Вы должны проверить, какое из 2 изображений самое маленькое, взять его размер и сравнить только пиксели в пределах размера прямоугольника.

...