Если Вы используете JVM Sun и интересуетесь использованием внутренней памяти приложения (сколько из выделенной памяти Ваше приложение использует), я предпочитаю включать встроенный вход сборки "мусора" JVMs. Вы просто добавляете-verbose:gc к команде запуска.
Из документации Sun:
параметр командной строки-verbose:gc печатает информацию в каждом наборе. Обратите внимание, что формат вывода-verbose:gc подвержен изменениям между выпусками платформы J2SE. Например, здесь производится из большого серверного приложения:
[GC 325407K->83000K(776768K), 0.2300771 secs] [GC 325816K->83372K(776768K), 0.2454258 secs] [Full GC 267628K->83769K(776768K), 1.8479984 secs]
Здесь мы видим два незначительных набора и один главный. Числа прежде и после стрелки
325407K->83000K (in the first line)
указывают на объединенный размер живых объектов прежде и после сборки "мусора", соответственно. После незначительных наборов количество включает объекты, которые не обязательно живы, но не могут быть исправлены, или потому что они непосредственно живы, или потому что они в или сосланы от штатного поколения. Число в круглой скобке
(776768K) (in the first line)
является общим свободным местом, не считая пространство в постоянном поколении, которое является общей "кучей" минус одни из пробелов оставшегося в живых. Незначительный набор взял приблизительно четверть секунды.
0.2300771 secs (in the first line)
Для большего количества информации см.: http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
Построение цветовой гистограммы для каждого изображения. Затем, когда вы хотите сопоставить изображение с коллекцией, просто упорядочите список по тому, насколько близка их гистограмма к гистограмме выбранного изображения.
Количество сегментов будет зависеть от того, насколько точными вы хотите быть. Тип данных, объединенных в сегмент, будет определять, как вы расставляете приоритеты для поиска.
Например, если вас больше всего интересует оттенок, вы можете определить, в какой сегмент входит каждый отдельный пиксель изображения, как:
def bucket_from_pixel(r, g, b):
hue = hue_from_rgb(r, g, b) # [0, 360)
return (hue * NUM_BUCKETS) / 360
] Если вам также нужен общий сопоставитель, вы можете выбрать сегмент на основе полного значения RGB.
Используя PIL, вы можете использовать встроенную функцию гистограмма
. Гистограммы «близости» могут быть рассчитаны с использованием любой меры расстояния по вашему желанию. Например, расстояние L1 может быть:
hist_sel = normalize(sel.histogram())
hist = normalize(o.histogram()) # These normalized histograms should be stored
dist = sum([abs(x) for x in (hist_sel - hist)])
L2 будет:
dist = sqrt(sum([x*x for x in (hist_sel - hist)]))
Нормализация
просто заставляет сумму гистограммы равняться некоторому постоянному значению (1.0 отлично работает). Это важно для правильного сравнения больших изображений с маленькими. Если вы собираетесь использовать расстояния L1, вам следует использовать меру L1 в normalize
. Если L2, то L2.
На ваш вопрос уже дан ответ. Взгляните на эти другие ответы SO:
Алгоритм поиска похожих изображений
Как я могу количественно определить разницу между двумя изображениями?