Отобразите алгоритм сравнения

Две опции, которые не требуют копирования полного набора:

for e in s:
    break
# e is now an element from s

Или...

e = next(iter(s))

, Но в целом, наборы не поддерживают индексацию или разрезание.

43
задан snowflake 9 May 2012 в 06:52
поделиться

7 ответов

аналогичный вопрос был задан год назад и получил множество ответов, в том числе вопрос о пикселизации изображений, который я собирался предложить, по крайней мере, в качестве этапа предварительной квалификации. (поскольку это довольно быстро исключит очень непохожие изображения).

Там также есть ссылки на еще более ранние вопросы, на которые есть еще больше ссылок и хороших ответов.

Вот реализация с использованием некоторых идей с Scipy, используя ваши три изображения (сохраненные как im1.jpg, im2.jpg, im3.jpg соответственно). Окончательный результат показывает im1 по сравнению с самим собой в качестве базовой линии, а затем каждое изображение по сравнению с другими.

>>> import scipy as sp
>>> from scipy.misc import imread
>>> from scipy.signal.signaltools import correlate2d as c2d
>>>
>>> def get(i):
...     # get JPG image as Scipy array, RGB (3 layer)
...     data = imread('im%s.jpg' % i)
...     # convert to grey-scale using W3C luminance calc
...     data = sp.inner(data, [299, 587, 114]) / 1000.0
...     # normalize per http://en.wikipedia.org/wiki/Cross-correlation
...     return (data - data.mean()) / data.std()
...
>>> im1 = get(1)
>>> im2 = get(2)
>>> im3 = get(3)
>>> im1.shape
(105, 401)
>>> im2.shape
(109, 373)
>>> im3.shape
(121, 457)
>>> c11 = c2d(im1, im1, mode='same')  # baseline
>>> c12 = c2d(im1, im2, mode='same')
>>> c13 = c2d(im1, im3, mode='same')
>>> c23 = c2d(im2, im3, mode='same')
>>> c11.max(), c12.max(), c13.max(), c23.max()
(42105.00000000259, 39898.103896795357, 16482.883608327804, 15873.465425120798)

Обратите внимание, что im1 по сравнению с самим собой дает оценку 42105, im2 по сравнению с im1 не за горами, но im3 по сравнению с любым из других дает намного меньше половины этого значения. Вы' Мне пришлось поэкспериментировать с другими изображениями, чтобы увидеть, насколько хорошо это может работать и как вы могли бы его улучшить.

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

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

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

37
ответ дан 26 November 2019 в 23:00
поделиться

Я сделал это с помощью сравнения гистограмм изображений. Мой основной алгоритм был следующим:

  1. Разделить изображение на красный, зеленый и синий
  2. Создать нормализованные гистограммы для красного, зеленого и синего каналов и объединить их в вектор (r0 ... rn, g0 ... gn, b0 ... bn) где n - количество "сегментов", 256 должно быть достаточно
  3. вычесть эту гистограмму из гистограммы другого изображения и вычислить расстояние

вот код с numpy и pil

r = numpy.asarray(im.convert( "RGB", (1,0,0,0, 1,0,0,0, 1,0,0,0) ))
g = numpy.asarray(im.convert( "RGB", (0,1,0,0, 0,1,0,0, 0,1,0,0) ))
b = numpy.asarray(im.convert( "RGB", (0,0,1,0, 0,0,1,0, 0,0,1,0) ))
hr, h_bins = numpy.histogram(r, bins=256, new=True, normed=True)
hg, h_bins = numpy.histogram(g, bins=256, new=True, normed=True)
hb, h_bins = numpy.histogram(b, bins=256, new=True, normed=True)
hist = numpy.array([hr, hg, hb]).ravel()

, если у вас есть две гистограммы, вы можете получить расстояние следующим образом:

diff = hist1 - hist2
distance = numpy.sqrt(numpy.dot(diff, diff))

Если два изображения идентичны, расстояние равно 0, чем больше они расходятся, тем больше расстояние.

Для меня это сработало довольно хорошо, но с графикой, такой как текст и логотипы, не получилось.

13
ответ дан 26 November 2019 в 23:00
поделиться

нет такой опции AFAIK нет. Я думаю, вы можете проверить идентификатор sys.databases.owner_sid = 0x01.

Я не думаю, что вам нужно беспокоиться о том, что MS изменит имена системных баз данных. если бы они сделали это, вам не пришлось бы беспокоиться об этом по крайней мере лет 20 :)

затем вычитание значений пикселей из двух изображений. Если разница не равна нулю, то вы можете сдвинуть одно из изображений на 1 пиксель в каждом направлении и сравнить снова, если разница меньше, чем на предыдущем шаге, вы можете повторить сдвиг в направлении градиента и вычитание до разницы ниже определенного порога или снова увеличивается. Это должно работать, если радиус ядра размытия больше, чем сдвиг изображений.

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

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

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

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

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

6
ответ дан 26 November 2019 в 23:00
поделиться

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

Если эта разница больше установленного вами порога, изображения не равны, и вы можете перейти к следующему. Затем можно будет проанализировать изображения с меньшим порогом.

Я действительно думаю, что в лучшем случае вы можете радикально сократить возможные совпадения, но вам нужно будет лично сравнить возможные совпадения, чтобы определить, что они действительно равны.

Я могу » Я действительно показываю код, как это было давным-давно, и я использовал Хорос / Кантату для этого курса.

2
ответ дан 26 November 2019 в 23:00
поделиться

Думаю, вы могли бы сделать что-то вроде этого:

  • оценить вертикальное / горизонтальное смещение эталонного изображения по сравнению со сравнительным изображением. а простой SAD (сумма абсолютной разности) с векторами движения подойдет.

  • сдвиньте сравнительное изображение соответствующим образом

  • вычислите корреляцию Пирсона, которую вы пытались сделать

Измерение сдвига несложно.

  • Возьмите область (скажем, 32x32) на сравнительном изображении.
  • Сдвинуть его на x пикселей по горизонтали и на y пикселей по вертикали.
  • Вычислить SAD (сумму абсолютных разностей) относительно исходного изображения
  • Сделайте это для нескольких значений x и y в небольшом диапазоне (-10, +10)
  • Найдите место, где разница минимальна
  • Выберите это значение в качестве вектора движения сдвига

Примечание:

Если SAD становится очень высоким для всех значений x и y, то вы в любом случае можете предположить, что изображения сильно различаются и измерение сдвига не требуется.

0
ответ дан 26 November 2019 в 23:00
поделиться

Во-первых, корреляция - это очень ресурсоемкая, довольно неточная мера сходства. Почему бы просто не воспользоваться суммой квадратов, если различия между отдельными пикселями?

Простое решение, если максимальный сдвиг ограничен: сгенерировать все возможные сдвинутые изображения и найти то, которое лучше всего соответствует. Убедитесь, что вы вычисляете переменную соответствия (т. Е. Корреляцию) только для подмножества пикселей, которые могут быть сопоставлены во всех смещенных изображениях. Кроме того, ваш максимальный сдвиг должен быть значительно меньше, чем размер ваших изображений.

Если вы хотите использовать некоторые другие передовые методы обработки изображений, я предлагаю вам взглянуть на SIFT , это очень мощный метод, который ( теоретически в любом случае) может правильно сопоставлять элементы на изображениях независимо от перемещения, поворота и масштаба.

1
ответ дан 26 November 2019 в 23:00
поделиться

Вам действительно нужно лучше сформулировать вопрос, но, глядя на эти 5 изображений, кажется, что все организмы ориентированы одинаково. Если это всегда так, вы можете попробовать выполнить нормализованную взаимную корреляцию между двумя изображениями и принять максимальное значение в качестве степени сходства. Я не знаю нормализованной функции взаимной корреляции в Python, но есть аналогичная функция fftconvolve () , и вы можете выполнить круговую кросс-корреляцию самостоятельно:

a = asarray(Image.open('c603225337.jpg').convert('L'))
b = asarray(Image.open('9b78f22f42.jpg').convert('L'))
f1 = rfftn(a)
f2 = rfftn(b)
g =  f1 * f2
c = irfftn(g)

Это не будет работать как записано, так как изображения имеют разные размеры, а выходные данные вообще не взвешиваются и не нормализуются.

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

6
ответ дан 26 November 2019 в 23:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: