2015-01-13 1 views
1

У меня есть 2 изображения текста, где правая часть первого изображения перекрывается с левой стороны второй (2 частичные фотографии одной и той же страницы текста, взятые слева направо правильно). Я хотел бы сшить изображения, и я пытаюсь найти подходящий подход. Я попробовал пример с функцией поиском ОРБА + грубым согласованием признака силы с сайта OpenCV http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_matcher/py_matcher.html#matcherВыровнять 2 перекрывающиеся фотографии страницы текста

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

Как я могу сопоставить этот вид изображений с текстом более надежно с соответствием функций? Должен ли я указывать некоторые разные параметры, отличные от параметров для алгоритма поиска ORB? использовать другой алгоритм с разными параметрами?

Если нет возможности сопоставления с другим подходом с открытым CV, я могу использовать для этого выравнивания?

Mat p1 = new Mat("part1.jpg", LoadMode.GrayScale); 
Mat p2 = new Mat("part2.jpg", LoadMode.GrayScale); 

var orb = new ORB(); 

Mat ds1; 
var kp1 = DetectAndCompute(orb, p1, out ds1); 

Mat ds2; 
var kp2 = DetectAndCompute(orb, p2, out ds2); 

var bfMatcher = new BFMatcher(NormType.Hamming, crossCheck: true); 
var matches = bfMatcher.Match(ds1, ds1); 

var tenBestMatches = matches.OrderBy(x => x.Distance).Take(10); 

var res = new Mat(); 
Cv2.DrawMatches(p1, kp1, p2, kp2, tenBestMatches, res, flags: DrawMatchesFlags.DrawRichKeypoints); 


using (new Window("result", WindowMode.ExpandedGui, res)) 
{ 
    Cv2.WaitKey(); 
} 

private static KeyPoint[] DetectAndCompute(ORB orb, Mat p1, out Mat ds1) 
{ 
    var kp1 = orb.Detect(p1); 
    ds1 = new Mat(); 
    orb.Compute(p1, ref kp1, ds1); 
    return kp1; 
} 

image description

ответ

1

Интересный вопрос. Что касается подхода ORB, то, что мне кажется, это может привести ко многим ложным срабатываниям из-за предмета (печатные письма на бумаге), которые мы пытаемся обработать. Во-первых, у нас есть сложность возможных функций для обнаружения - различные символы, объединенные вместе, относительно небольшие по сравнению с размером объекта. Увеличение количества объектов быстро увеличивает их возможное количество. Во-вторых, вы можете обнаружить одни и те же буквы в начале какого-либо слова, принадлежащие разным словам, поэтому вы не можете просто полагаться отдельно на каждый обнаруженный матч, а не на сбор информации. Обычно я пытаюсь настроить размер патча детекторного ордера (C++ case), пытаясь сбалансировать его размер. И попробуйте SIFT или SURF, возможно, у них будут лучшие результаты в вашем случае.

Другой подход, безусловно, грубая сила. Исходя из приведенного вами примера, должно быть возможно обнаружить отдельные слова (пороговое -> обнаружение blob). Итак, давайте предположим, что мы обнаружили капли с этими словами. Допустим, что у нас есть некоторые A и B, обнаруженные слова из левого и правого изображений соответственно. Тогда мы должны найти максимум функции перекрытия() на каждой паре слов в А х B:

поз = ARG_MAX {(а, б) в А х B: перекрытия (а, б)}

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

Как правило, вопрос не из легких и потому интересен для исследования.

+0

Благодарим вас за ответ. Пробовал изменять размер патча, он не работает. Теперь попытаемся подобрать подобие изображения. Пробовал PhaseCorellate, но он дает много ложных срабатываний. Будут искать и попробовать другие методы. – axk

Смежные вопросы