Определение, является ли изображение более или менее похожим на изображение цели - PullRequest
0 голосов
/ 22 января 2012

Я пытаюсь придумать быстрый алгоритм для следующей проблемы.

Учитывая изображение цели G и два изображения A и B, определите, какой из A или B больше похож на G. Примечаниечто изображения A, B и G. имеют одинаковое измерение.

Более похоже, я имею в виду, что оно больше похоже на изображение G. В целом.

Есть идеи для алгоритмов?Я делаю это в Objective-C, и у меня есть возможность сканировать каждый пиксель в изображениях A, B и G.

Я реализовал следующее: сканировать каждый пиксель, определить абсолютную ошибкув каждом из значений красного, зеленого и синего для значений от A до G и от B до G. Значение с меньшей ошибкой больше похоже.Работает нормально, но очень медленно.

Ответы [ 4 ]

1 голос
/ 22 января 2012

Невозможно сделать лучше, чем X*Y, где X, Y - размеры изображения. Так как вам нужно сканировать каждый пиксель ввода в любом случае.

Тем не менее, вы можете попробовать одну из техник - отсканировать случайные пиксели на изображении и найти разницу. Как только вы увидите изображение, значительно похожее или не похожее на изображение A или B, вы можете остановиться.

# X, Y are the dimensions
sim_A = 0
sim_B = 0
while( abs(sim_A - sim_B) > MAX_DISSIMILARITY):
    rand_x = random(X)
    rand_y = random(Y)
    sim_A += dissimilar(img_G, img_A, rand_X, rand_Y)
    sim_B += dissimilar(img_G, img_B, rand_X, rand_Y)
1 голос
/ 22 января 2012

Вы можете попробовать использовать алгоритм SIFT (Преобразование функции с инвариантным масштабом). Поскольку вы только что упомянули, что вы хотите найти, какое изображение БОЛЬШЕ похоже на изображение цели, то я думаю, что это лучший алгоритм. Он в основном извлекает инвариантные элементы изображения (функции, которые не меняются при изменении интенсивности света, масштаба, перспективы и т. Д.), А затем создает их вектор характеристик. Затем вы можете использовать этот векторный объект, чтобы сравнить его с другими изображениями. Вы можете проверить это и это для дальнейшего использования. В идеале есть библиотеки компьютерного зрения, которые упрощают работу (я думаю, что было бы трудно читать и записывать изображения в объективе C без какой-либо библиотеки компьютерного зрения). OpenCV (библиотека компьютерного зрения с открытым исходным кодом) лучше всего подходит для подобных вещей. Он имеет много встроенных функций для обработки обычных вещей с изображениями / видео. Надеюсь, это поможет:)

0 голосов
/ 14 февраля 2012

Лучший способ, как я выяснил, заключается в следующем:

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

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

0 голосов
/ 22 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...