Создайте локальные функции для каждой ключевой точки с помощью SIFT

У меня есть изображение, и я хочу найти ключевые точки с помощью детектора SIFT и сгруппировать их, затем я хочу сгенерировать локальные функции для каждой ключевой точки с помощью SIFT, не могли бы вы помочь мне, как я могу это сделать? Пожалуйста, дайте мне какие-либо предложения, я очень ценю вашу помощь


person Baran Barani    schedule 24.07.2012    source источник


Ответы (2)


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

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

Также я бы предложил SURF. Это быстрее и не обременено патентами.

Взгляните на примеры из OpenCV, если вам нужны конкретные инструкции по извлечению и сравнению дескрипторов.

person Darcara    schedule 24.07.2012
comment
@ Darcara: Большое спасибо за ваши предложения, они были действительно полезны. Я собираюсь сделать это в Matlab. Я хочу найти сходство в одном изображении, например, если вы скопируете одну часть изображения и вставите ее в другую часть того же изображения, я хочу найти эти области копирования и вставки. Как вы думаете, я могу использовать SURF для этой цели? или у вас есть другие предложения? - person Baran Barani; 25.07.2012
comment
@Baran Barani: Если он только скопирован и вставлен, но не изменен (масштаб, поворот, яркость и т. д.), то да, он может работать, если патч достаточно большой. Для небольших исправлений вам потребуется гораздо больше обнаруженных функций, и это увеличит количество ложных срабатываний. Взгляните на документ Суперразрешение из одного изображения. Они ищут похожие пятна на одном и том же изображении. Кроме того, вы можете найти границу вставки патчей, поскольку они могут не сочетаться с новым окружением, в зависимости от типа изображения. - person Darcara; 25.07.2012
comment
Спасибо за ваши предложения, я прочитаю эту статью, для меня важно обнаружить поврежденную область при вращении или масштабировании, а в некоторых случаях это может быть небольшой участок, как вы думаете, я могу использовать SIFT для поиска дубликатов областей даже в небольших частях ? - person Baran Barani; 05.08.2012
comment
Да, хотя у SIFT есть ограничение, если изображение слишком сильно трансформируется. Чтобы знать наверняка, вам нужно взглянуть на свои тестовые случаи. Если вам нужно обнаружение несанкционированного доступа, вы можете посмотреть Image Fingerprinting - person Darcara; 05.08.2012
comment
именно то, что я хочу, это обнаружение несанкционированного доступа, снятие отпечатков изображений работает для сравнения каждого изображения с другими изображениями, я хочу искать только одно изображение, а не сравнивать 2 изображения друг с другом. В одном изображении, если я скопирую одну часть и вставлю ее в другую часть того же изображения, она сможет ее обнаружить. Пожалуйста, дайте мне знать, если у вас есть другие предложения, большое спасибо. - person Baran Barani; 06.08.2012
comment
Кстати, SURF тоже запатентован. - person Matthias Odisio; 19.12.2012

Если вы используете opencv, вот команды для этого, иначе, если вы используете Matlab, см. ссылку СООТВЕТСТВИЕ_использованию серфинга


ИСПОЛЬЗОВАНИЕ OPENCV::

// вы можете изменить параметры по вашему требованию

    double hessianThreshold=200; 
    int octaves=3;
    int octaveLayers=4;
    bool upright=false;
    vector<KeyPoint>keypoints;

//Детектор обнаруживает ключевые точки на изображении, здесь изображение RGBIMAGE типа Mat

SurfFeatureDetector detector( hessianThreshold, octaves, octaveLayers, upright );
detector.detect(RGB_IMAGE, keypoints);

//Экстрактор вычисляет локальные признаки вокруг ключевых точек

SurfDescriptorExtractor extractor;
Mat descriptors;
extractor.compute( last_ref, keypoints, descriptors);

// все локальные признаки ключевых точек хранятся в строках друг за другом в матрице дескрипторов...

Надеюсь, это полезно :)

person G453    schedule 26.07.2012