Сравнение 2 картинок
Здравствуйте Гость ( Вход | Регистрация )
![]() ![]() ![]() |
Сравнение 2 картинок
TaTaPuH |
![]() ![]()
Отправлено
#1
|
Пользователь ![]() ![]() ![]() Группа: Пользователь Сообщений: 93 Регистрация: 29.12.2004 Пользователь №: 6072 ![]() |
Я уже задавал этот вопрос и мне дали хороший ответ в котором посоветовали делать данную операцию вычисляя взаимную корреляцию. Самостоятельно сделать этого у меня не получилось. :( Мог бы кто-то выложить пример. :lol: Сейчас я делаю это простым сравниванием яркости одинаковых пикселей на картинке, в результате чего получаю грубую и часто неправильную оценку. :angry: Очень нуждаюсь в помощи. :unsure: Спасибо. |
Digimaster |
![]()
Отправлено
#2
|
Engineer ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Super Moderator Сообщений: 1113 Регистрация: 18.10.2004 Из: Moscow Пользователь №: 4520 ![]() |
Можно поинтересоваться вашим образованием? От вашего ответа будет зависеть вид рекомендаций.
|
TaTaPuH |
![]()
Отправлено
#3
|
Пользователь ![]() ![]() ![]() Группа: Пользователь Сообщений: 93 Регистрация: 29.12.2004 Пользователь №: 6072 ![]() |
Неполное среднее :unsure:
Т.К. школьник я еще :blush: |
Digimaster |
![]()
Отправлено
#4
|
Engineer ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Super Moderator Сообщений: 1113 Регистрация: 18.10.2004 Из: Moscow Пользователь №: 4520 ![]() |
Понятно, тогда коротко не получится. Формулу написать или как?
|
TaTaPuH |
![]()
Отправлено
#5
|
Пользователь ![]() ![]() ![]() Группа: Пользователь Сообщений: 93 Регистрация: 29.12.2004 Пользователь №: 6072 ![]() |
Да, если не составит труда.
Напишу как я делаю это сейчас: Т.К. Рисунок черно-белый + оттенки черного то я сравниваю по 1 из компонент цвета. Беру константу и считаю кол-во точек, которые меньше константы и принимаю это значение за общее. Потом просто смотрю точки на одинаковых местах если они тоже меньше константы то увеличиваю число одинаковых точек. Потом считаю отношение всех к одинаковым. Но увы данный способ очень недейственный и дает грубую или же неправильную оценку |
Digimaster |
![]()
Отправлено
#6
|
Engineer ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Super Moderator Сообщений: 1113 Регистрация: 18.10.2004 Из: Moscow Пользователь №: 4520 ![]() |
Так, если я еще матанализ не забыл, то...
Вычисление двумерной взаимной корреляции. Предположим простейший случай: Имеется две матрицы (прямоугольные массивы) одинаковой размерности. Каждый элемент матрицы является числом, означающим яркость соответствующей точки черно-белого изображения. (Для цветного немного по-другому считается). Изображения центрированы друг-относительно друга, поэтому достаточно вычислить одно число, а не двумерную функцию взаимной корреляции. Формула будет такая: F = SUMMA{ a[i,j] * b[i,j] } где F - взаимная корреляция, a[i,j] - одно изображение, b[i,j] - другое изображение. Чем больше число F - тем выше степень совпадения. Если изображения смещены, то необходимо вычислить двумерную функцию взаимной корреляции и определить ее максимум. Для сравнения степени совпадения с другими образцами изображений нужно сравнить их F. Вот вам упрощенная теория. Написать по этой формуле программку - хорошее и приятное упражнение. Оставляю это удовольствие для вас. |
TaTaPuH |
![]()
Отправлено
#7
|
Пользователь ![]() ![]() ![]() Группа: Пользователь Сообщений: 93 Регистрация: 29.12.2004 Пользователь №: 6072 ![]() |
Можно поподробнее про картинки со смещением а то у меня именно такие и первый способ неправильно работает
|
Digimaster |
![]()
Отправлено
#8
|
Engineer ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Super Moderator Сообщений: 1113 Регистрация: 18.10.2004 Из: Moscow Пользователь №: 4520 ![]() |
Ok, попробуем дальше :)
Кстати, я забыл сказать, что перед сравнением матрицы a и b обычно нормируют, чтобы избежать аномально больших F, если в картинке всего одна яркая точка, но настолько яркая, что перемножение с даже не яркой точкой другой картинки приведет к появлению большого F. Так вот, чтобы такого не было, можно проделать следующее: 1) Складываем все элементы матрицы a. 2) Делим каждый элемент матрицы a на получившееся число. Таким образом яркость любой точки новой матрицы a будет меньше или равна единице. Тоже самое проделываем с матрицей b. Если не хочется использовать плавающую точку, то можно отнормировать не к единице, а, скажем, к 1000 или любому другому числу для обеспечения необходимой точности. При вычислениях не забывайте о возможных переполнениях. Используйте переменные достаточной точности (размера). Для "чайников" лучше всего применять плавающую точку. Там переполнения добиться сложно. Пусть все вычисления будут в double. На современных процессорах быстродействие пострадает не сильно. Теперь про двумерную корреляцию. Двумерная функция (если объяснять на картошке, как Чапаев) это функция двух переменных. Геометрически это поверхность в 3х мерном пространстве. У нас случай дискретный, поэтому поверхность вырождается в совокупность отсчетов. Т. е. вместо одного F мы должны получить матрицу (массив) таких F. Как это делается: В простейшем случае вы брали матрицу a и прикладывали к матрице b. Элемент к элементу. Скажем элемент a[1,1] прикладывался к b[1,1]; a[2,3] к b[2,3] и т.д. Полученные пары перемножали, результаты умножений складывали в переменную F (См. формулу в предыдущем посте). Теперь мы сделаем немного по-другому. Представьте, что вы приложили матрицы со смещением. Это как две книги друг на друге, но одна сдвинута вверх и влево. В таком кривом положении мы вычисляем F. Но как быть с элементами, которые оказались "за границей"? Можно представить, что за границей матрицы все элементы равны нулю, тогда все, что вылезло не будет влиять на результат. Теперь берем одну матрицу и сдвигаем на один элемент вправо. Снова вычисляем F. И так далее. Когда сдвинули достаточно далеко (нет смысла смещать матрицы друг относительно друга настолько сильно, что ни один элемент не перемножится), то пора перейти назад и на строчку ниже. Таким образом наши матрицы "проползут" одна по другой по змейке (или вернее строка за строкой), каждый раз вычисляя F. В конце концов у нас будет матрица результат, состоящая из F. Какой из этих F нам нужен? Догадаетесь? ;) |
TaTaPuH |
![]()
Отправлено
#9
|
Пользователь ![]() ![]() ![]() Группа: Пользователь Сообщений: 93 Регистрация: 29.12.2004 Пользователь №: 6072 ![]() |
Спасибо за доступный ответ :lol: :lol: :lol:
|
TaTaPuH |
![]()
Отправлено
#10
|
Пользователь ![]() ![]() ![]() Группа: Пользователь Сообщений: 93 Регистрация: 29.12.2004 Пользователь №: 6072 ![]() |
Спасибо еще раз, работает ! :) :) :) :)
при этом очень хорошо даже суперрр Сообщение отредактировал TaTaPuH - 12.03.2005, 23:28 |
Digimaster |
![]()
Отправлено
#11
|
Engineer ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Super Moderator Сообщений: 1113 Регистрация: 18.10.2004 Из: Moscow Пользователь №: 4520 ![]() |
Рад за вас. Если в основе программы лежит математика, то такая программа просто обязана работать хорошо :)
P.S. Подобная математика широко используется во многих местах. Даже радиолокаторы используют корреляционные методы... (Только не говорите: "Ах! Вот откуда ноги растут!" Лично я радиолокаторы не конструировал.) |
![]() ![]() ![]() ![]() |
Форум работает на движке Invision Power Board. Все
права принадлежат
IPB
inc.
Realcoding.net ©
2003-2005 | Контакт с администратором:
admin@realcoding.net