Вычисления различия между изображениями

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

Предположим, что у нас очень простой фрейм данных:

dat <- data.frame(x = 1:4,
                  y = 5:8)

, и мы хотели бы написать функцию, которая создает новый столбец z, который представляет собой сумму столбцов x и y.

Очень распространенный камень преткновения здесь состоит в том, что естественная (но некорректная) попытка часто выглядит так:

foo <- function(df,col_name,col1,col2){
      df$col_name <- df$col1 + df$col2
      df
}

#Call foo() like this:    
foo(dat,z,x,y)

Проблема здесь в том, что df$col1 t оценить выражение col1. Он просто ищет столбец в df, буквально называемый col1. Это поведение описано в ?Extract в разделе «Рекурсивные (похожие на список) объекты».

Самое простое и наиболее часто рекомендуемое решение - это просто переключиться с $ на [[ и передать аргументы функции как строки:

new_column1 <- function(df,col_name,col1,col2){
    #Create new column col_name as sum of col1 and col2
    df[[col_name]] <- df[[col1]] + df[[col2]]
    df
}

> new_column1(dat,"z","x","y")
  x y  z
1 1 5  6
2 2 6  8
3 3 7 10
4 4 8 12

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

Следующие два варианта более продвинутые. Многие популярные пакеты используют эти методы, но использование их хорошо требует большей осторожности и умения, поскольку они могут вводить тонкие сложности и непредвиденные точки отказа. Этот раздел книги Хэдли Advanced R является отличной ссылкой для некоторых из этих проблем.

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

new_column2 <- function(df,col_name,col1,col2){
    col_name <- deparse(substitute(col_name))
    col1 <- deparse(substitute(col1))
    col2 <- deparse(substitute(col2))

    df[[col_name]] <- df[[col1]] + df[[col2]]
    df
}

> new_column2(dat,z,x,y)
  x y  z
1 1 5  6
2 2 6  8
3 3 7 10
4 4 8 12

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

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

new_column3 <- function(df,col_name,expr){
    col_name <- deparse(substitute(col_name))
    df[[col_name]] <- eval(substitute(expr),df,parent.frame())
    df
}

Просто для удовольствия я все еще использую deparse(substitute()) для имени нового столбца , Здесь будет работать все следующее:

> new_column3(dat,z,x+y)
  x y  z
1 1 5  6
2 2 6  8
3 3 7 10
4 4 8 12
> new_column3(dat,z,x-y)
  x y  z
1 1 5 -4
2 2 6 -4
3 3 7 -4
4 4 8 -4
> new_column3(dat,z,x*y)
  x y  z
1 1 5  5
2 2 6 12
3 3 7 21
4 4 8 32

Итак, короткий ответ в основном: передать имена столбцов data.frame в виде строк и использовать [[ для выбора отдельных столбцов. Только начинайте разбираться в eval, substitute и т. Д., Если вы действительно знаете, что делаете.

27
задан 2 revs 6 August 2009 в 22:25
поделиться

7 ответов

Очень самые простые меры будут основанными на ошибке RMS подходами, например:

Они, вероятно, образовывают гель с Вашими понятиями мер по расстоянию, но их результаты действительно только значимы, если у Вас есть два изображения, которые уже очень близки, как то, если Вы смотрите на то, как хорошо конкретная схема сжатия сохранила исходное изображение. Кроме того, тот же результат любого сравнения может означать много разных вещей, в зависимости от какой артефакты, там (смотрите на бумагу, которую я цитирую ниже для некоторых фотографий в качестве примера RMS/PSNR, может вводить в заблуждение).

Вне их, существует целое поле исследования, посвященного подобию изображения. Я не эксперт, но здесь являюсь несколькими указателями:

  • Большая работа вошла в подходы с помощью сокращение размерности (PCA, SVD, анализ собственного значения, и т.д.), чтобы выбрать основные компоненты изображения и сравнить их через различные изображения.

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

  • Все еще, другие попытались создать меры подобия, которые обходят некоторые дефекты ошибки RMS и PSNR. Была довольно прохладная статья на пространственная область структурное подобие (SSIM) мера, которая пытается подражать восприятию народами ошибки изображения вместо прямых, математических понятий ошибки. Те же парни сделали улучшенную translation/rotation-invariant версию с помощью анализ вейвлета в данная статья на WSSIM.

  • похоже, что TinEye использует характеристические векторы со значениями для партии из атрибутов, чтобы сделать их сравнение. Если Вы ищете вокруг на их сайте, Вы в конечном счете добираетесь до страница IdeГ© Labs, и , их FAQ имеет некоторых (но не слишком многие) специфические особенности алгоритма:

    Q: Как визуальный поиск работает?

    А: IdГ©e’s визуальная поисковая технология использует сложные алгоритмы для анализа сотен атрибутов изображения, таких как цвет, форма, структура, яркость, сложность, объекты и регионы. Эти атрибуты формируют компактную цифровую подпись, которая описывает появление каждого изображения, и эти подписи вычисляются и индексируются нашим программным обеспечением. При выполнении визуального поиска эти подписи быстро сравнены нашей поисковой системой для возврата визуально подобных результатов.

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

24
ответ дан Todd Gamblin 28 November 2019 в 05:32
поделиться

Одна техника состоит в том, чтобы использовать цветные гистограммы . Можно использовать алгоритмы машинного обучения для нахождения подобных изображений на основе repesentation, который Вы используете. Например, наиболее часто используемое алгоритм k-средств . Я видел другие решения пытаться проанализировать вертикальные и горизонтальные строки в изображении после использования граничное обнаружение . анализ Структуры также используется.

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

6
ответ дан Chris de Vries 28 November 2019 в 05:32
поделиться

Рассмотрите использование с потерями сжатие вейвлета и сравнение самых высоких элементов уместности изображений.

4
ответ дан Sparr 28 November 2019 в 05:32
поделиться

То, что делает TinEye, является своего рода долго обсуждением изображения или частей его (см. их FAQ). Это - вероятно, не реальная хеш-функция, так как они хотят подобные "хеши" для подобного (или почти идентичный) изображения. Но все, что они должны сделать, сравнивает тот хеш и вероятно подстроки его, чтобы знать, подобны ли изображения/идентичны или содержится ли каждый в другом.

1
ответ дан Joey 28 November 2019 в 05:32
поделиться

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

1
ответ дан John Ellinwood 28 November 2019 в 05:32
поделиться

вот некоторый код, который я написал, 4 года назад в java yikes, который действительно отображает сравнения с помощью гистограмм. не смотрите ни на какую часть его кроме buildHistograms ()

https://jpicsort.dev.java.net/source/browse/jpicsort/ImageComparator.java? rev=1.7& view=markup

, возможно, его полезное, по крайней мере если Вы используете java

1
ответ дан mkoryak 28 November 2019 в 05:32
поделиться

Методы корреляции заставят соответствие выскочить. Если они - JPEGs, Вы могли бы сравнить доминирующие коэффициенты для каждого 8x8 блок и получить достойное соответствие. Это не точно корреляция, но она основана на трансносу косинуса, таким образом, это - двоюродный брат.

0
ответ дан John 28 November 2019 в 05:32
поделиться
Другие вопросы по тегам:

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