Я не тестировал его полностью, но похоже что-то вроде этого:
import org.apache.spark.deploy.SparkHadoopUtil
import org.apache.hadoop.fs.{FileSystem, Path, LocatedFileStatus, RemoteIterator}
import java.net.URI
val path: String = ???
val hconf = SparkHadoopUtil.get.newConfiguration(sc.getConf)
val hdfs = FileSystem.get(hconf)
val iter = hdfs.listFiles(new Path(path), false)
def listFiles(iter: RemoteIterator[LocatedFileStatus]) = {
def go(iter: RemoteIterator[LocatedFileStatus], acc: List[URI]): List[URI] = {
if (iter.hasNext) {
val uri = iter.next.getPath.toUri
go(iter, uri :: acc)
} else {
acc
}
}
go(iter, List.empty[java.net.URI])
}
listFiles(iter).filter(_.toString.endsWith(".csv"))
findimagedupes довольно хорош. Можно работать "findimagedupes-v изображения цифрового отпечатка", чтобы позволить ему распечатать "проницательный хеш", например.
Я не знаю алгоритм позади него, но , Microsoft Live Image Search всего добавила эта возможность. Picasa также имеет способность определить поверхности в изображениях и поверхности групп тот подобный взгляд. Большую часть времени это - тот же человек.
Некоторая технология машинного обучения как метод опорных векторов, нейронная сеть, наивный классификатор Байеса или байесовская сеть была бы лучшей в этом типе проблемы. Я записал один каждый из первых трех для классификации рукописных цифр, который является по существу распознаванием образов изображения.
Существует DPEG, Дублирующийся менеджер Медиа , но его код не открыт. Это - очень старый инструмент - я не забываю использовать его в 2003.
Вы могли использовать разность, чтобы видеть, ДЕЙСТВИТЕЛЬНО отличаются ли они.. Я предполагаю, что это удалит много бесполезного сравнения. Затем для алгоритма я использовал бы вероятностный подход.. что является возможностями, что они выглядят одинаково.. Я основывал это на сумме rgb в каждом пикселе. Вы могли также найти некоторые другие метрики, такие как яркость и наполнить как этот.
Если у Вас есть много изображений, цветная гистограмма могла бы использоваться для получения грубой близости изображений прежде, чем сделать сравнение полного образа каждого изображения друг против друга один (т.е. O (n^2)).
измените размеры изображения к 1x1 эльф..., если они точны, существует маленькая вероятность, они - то же изображение... теперь изменяют размеры его к 2x2 изображение эльфа, если все 4 эльфа точны, существует большая вероятность, они точны... тогда 3x3, если все 9 эльфов точны... хороший шанс и т.д. тогда 4x4, если все 16 эльфов точны... лучший шанс.
и т.д.
выполнение его этот путь, можно ли сделать эффективность improvments..., если 1x1 пиксельная сетка выключена много, почему проверка беспокойства 2x2 сетка? и т.д.
Цветная гистограмма хороша для того же изображения, которое изменялось, передискретизировалось и т.д.
, Если Вы хотите соответствовать фотографиям различных людей того же ориентира, это более хитро - смотрят на классификаторы Хаара. Opencv является большой свободной библиотекой для обработки изображений.
Взаимная корреляция или фазовая корреляция сообщит вам, являются ли изображения одинаковыми, даже с шумом, ухудшением качества и горизонтальным или вертикальным смещением. Использование методов на основе БПФ сделает его намного быстрее, чем алгоритм, описанный в вопросе.
Однако обычный алгоритм не работает для изображений, которые не имеют одинаковый масштаб или поворот. Вы можете предварительно повернуть или масштабировать их, но это действительно интенсивно. По-видимому, вы также можете выполнить корреляцию в лог-полярном пространстве, и оно будет инвариантно к вращению, перемещению и масштабированию, но я не знаю деталей достаточно хорошо, чтобы это объяснить.
Пример MATLAB: Регистрация изображение, использующее нормализованную кросс-корреляцию
Википедия называет это « фазовой корреляцией » а также описывает , делающий его инвариантным к масштабу и повороту :
Метод может быть расширен для определения разницы поворота и масштабирования между двумя изображениями, сначала преобразовав изображения в логополярные координаты. Благодаря свойствам преобразования Фурье, параметры поворота и масштабирования могут быть определены способом, инвариантным к переносу.