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

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


person mrN    schedule 05.01.2011    source источник
comment
нет ли даже сходства в названиях? В противном случае вы бы закончили (при условии, что найдете алгоритм, который справится) с ситуацией сравнения N: M, возможно, это поможет вам stackoverflow.com/questions/2037205/, но помните, что если у вас есть 1000 изображений, это будет 999999 операций сравнения   -  person Hannes    schedule 05.01.2011
comment
начните поддерживать базу данных, если вы этого не сделали. если вы сделали ошибку в прошлом, это не значит, что вам нужно продолжать и искажать весь свой код / ​​логику вокруг этой ошибки.   -  person Poelinca Dorin    schedule 05.01.2011
comment
Вау, это будет очень дорого с точки зрения циклов процессора. Вам нужно будет уменьшить размер каждого изображения A, используя тот же алгоритм, который вы использовали в первый раз (A - это изображение большего размера из двух). Если уменьшенные размеры A и B эквивалентны, сохраните эту информацию как-нибудь и перейдите к следующей паре. Это может быть O (N²), поэтому вам следует дважды подумать, если вы имеете дело с большим объемом данных. Я думаю, тебе стоит исправить свою базу данных. Не важно что.   -  person jwueller    schedule 05.01.2011
comment
@poelinca, да, чтобы начать поддерживать в новой базе данных, мне нужно извлечь уникальное изображение ... @hannes, уникальности в названии нет. У меня около 30 000+ картинок   -  person mrN    schedule 05.01.2011
comment
@elusive, я раньше не поддерживал ни одной базы данных, но я тоже пытаюсь, для этого мне нужны уникальные и самые большие изображения ....   -  person mrN    schedule 05.01.2011
comment
@mrNepal: дано 10 миллисекунд на каждое сравнение: 30000*30000*10/1000/60/60/24 = 104.17. На это понадобится чуть больше ста дней. Wohoo!   -  person jwueller    schedule 05.01.2011
comment
@mrNepal, чтобы имена были случайными, или вы можете хотя бы сгруппировать их по имени?   -  person Hannes    schedule 05.01.2011
comment
@hannes, нет ... это совершенно случайно   -  person mrN    schedule 05.01.2011


Ответы (4)


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

person Ivan    schedule 06.01.2011
comment
Вопрос не в том, почему вы должны или не должны обнаруживать похожие изображения в PHP - вы не можете знать все варианты причин, по которым людям нужно сравнивать изображения в PHP. Сказать, что нужно делать это вручную, НЕ является хорошим ответом на актуальный вопрос. - person Dave Hilditch; 27.04.2017

Установите 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);
person Xavier Barbosa    schedule 06.01.2011

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


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

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

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

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

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

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

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

person Community    schedule 05.01.2011
comment
Да, они были обрезаны и изменены, изображения имеют размер 480 x 272, 800 x 600, 1024 x 768, 1280 x 1024, 1600 x 1200, 1600 x 1080, 1920 x 1080, 1920 x 1200, 2560 x 1600. Должно быть около 3500 уникальных изображений и около 9 с каждого снимка делаются точные копии. О категоризации ... Я поместил эти изображения примерно в 30 папок, каждая из которых содержит по 1000 изображений каждая, при превышении лимита размера будет создана и размещена папка, имя файла будет случайным, чтобы принести разные изображения. - person mrN; 06.01.2011
comment
Затем я случайным образом выбираю около 20 изображений из каждой папки и создаю список файлов. Затем я запускаю их через функцию, в которой изображения сортируются по размеру и автоматически копируются на мое соответствующее устройство, если они существуют. - person mrN; 06.01.2011
comment
Алгоритм обрезки выполняется автоматически при загрузке ..... Я меняю размер до высоты, затем изображение центрируется до определенного разрешения, обычно я предоставляю размер изображения 2560 x 1600. Если я сначала загрузил изображение большего размера, будет получено изображение 2560 x 1600, а исходное изображение будет отброшено. - person mrN; 06.01.2011
comment
Разве я не могу создать сценарий для сравнения изображений, например, программное обеспечение CBIR, такое как iMatch или другие? - person mrN; 06.01.2011
comment
Причина, по которой я помечаю php, потому что изображения находятся в сети, и я использую локальный веб-сайт для управления ими, и весь веб-сайт разработан на php, и я хочу, чтобы код php изолировал другие файлы и отображал только самые большие изображения. - person mrN; 06.01.2011
comment
ИМО, такой язык, как C ++, или такой инструмент, как imagemagick, будет намного быстрее для обработки изображений. Вы должны сделать на PHP что-то, для чего вам нужен онлайн-интерфейс и / или что-то, что не является одноразовой задачей. Конечно, нет ничего плохого в том, чтобы попробовать библиотеку PHP GD (но я сомневаюсь, что в ней есть какие-либо функции, у которых нет более быстрой альтернативы). - person ; 11.01.2011
comment
@mrNepal: Когда вы говорите 9 точных копий - я предполагаю, что это те копии, которые вы хотите сопоставить. Я имел в виду, что будет сложно сопоставить изображение с его обрезанной версией. Если все копии обрезаны с оригинала, но являются точными копиями, это не должно быть проблемой. Второе предложение Ивана. - person ; 11.01.2011

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

person TJHeuvel    schedule 05.01.2011