Соответствие и прозрачность шаблонов OpenCV - PullRequest
29 голосов
/ 21 января 2011

Как OpenCV обрабатывает прозрачность изображения во время сопоставления с шаблоном?

Проблема в том, что в шаблонном изображении должны быть прозрачные части, потому что в исходном изображении в этих местах может быть что угодно.

Я перепробовал все методы, и ни один из них не дал положительных результатов (например, положение шаблона на исходном изображении было определено неправильно).

Ответы [ 7 ]

18 голосов
/ 25 января 2011

Не похоже, что OpenCV обрабатывает альфу так, как вы этого хотите.

У вас есть два варианта:

  1. Напишите свой собственный метод взаимной корреляции, который будет использоватьальфа-канал
  2. Преобразуйте свои изображения, чтобы ваш альфа-канал стал неактуальным

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

Другой вариант - выполнить определение края (например, Sobel ) на изображении и шаблоне и выполнить перекрестное-корреляция тогда.Вот изображения, обнаруженные по краям (я использовал детектор краев Собеля на канале Luma в GIMP, а затем немного растяжения по интенсивности).

map

building

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

misha@misha-desktop:~/Desktop/stackoverflow$ python cross-correlation.py map-blue.png building-maskz-blue.png 
(163, 244)

Наконец, вот еще один связанный вопрос .

PS.Что это за игра?

9 голосов
/ 22 июля 2015

OpenCV 3.0 предлагает встроенную поддержку сопоставления шаблонов с замаскированными шаблонами.См. новую документацию :

Параметры:

image ...

templ ...

результат...

method ...

mask Маска искомого шаблона.Он должен иметь тот же тип данных и размер, что и шаблон.По умолчанию он не установлен.

[Небольшое отступление]

Обратите внимание, что сопоставление шаблона с замаскированными эталонными изображениями (увеличенное изображение) невозможно.И это имеет смысл, учитывая, что OpenCV использует сопоставление шаблонов на основе FFT.

Поэтому, если вам нужно выполнить сопоставление с шаблоном только в определенных областях ваших эталонных изображений, вам нужно будет реализовать собственный метод для этого или замаскировать вывод cv :: matchTemplate.

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

9 голосов
/ 09 декабря 2013

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

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

Вот необработанное шаблонное изображение на альфе:
raw template image on alpha

Вот обработанный шаблон с заполнением шума для альфа-канала:
enter image description here

Я отправил обработанное изображение шаблона через образец кода Template Matching , предоставленный в документации OpenCV. На темном или светлом фоне совпадение найдено с достаточной достоверностью.

Поиск на темном фоне:

matched on dark

Поиск на светлом фоне:

matched on light

Для сравнения, оставление прозрачного альфа-канала шаблона - или фиксация на темном или светлом фоне - не возвращало приемлемых совпадений.

1 голос
/ 20 сентября 2012

Опция SQDIFF/SQDIFF_N будет хорошим решением, если вы попытаетесь заменить альфа-канал черным цветом RGB. По крайней мере, это было моим решением той же проблемы. Из моего результата очевидно, что этот метод чувствителен к ярким пиксельным значениям, и я воспользовался возможностью.

0 голосов
/ 08 октября 2013

Я столкнулся с той же проблемой, и я подумал о решении. Предполагая, что referenceImageMask и templateMask имеют 1 в хороших пикселях и 0 в плохих. И эти referenceImage и templateImage уже замаскированы и также имеют 0 в плохих пикселях.

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

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

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

Image<Gray, float> imCorr = referenceImage.MatchTemplate(templateImage,      Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCORR);
Image<Gray, float> imCorrMask = referenceImageMask.MatchTemplate(templateMask, Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCORR);
_imCorr = _imCorr.Mul(_imCorrMask.Pow(-1));

ОБНОВЛЕНИЕ: на самом деле, это решение не работает. Поскольку реализация взаимной корреляции в opencv использует ДПФ, возникнут числовые проблемы, и вы не можете использовать вторую взаимную корреляцию для исправления первой.

0 голосов
/ 24 января 2011

Я не уверен, но канал прозрачности обрабатывается так же, как и любой другой канал.Если пиксель в шаблоне «прозрачный», он должен быть «прозрачным» и на основном изображении.Я просто догадываюсь здесь.

0 голосов
/ 23 января 2011

Я думаю, что вы пытаетесь сделать то, что в OpenCV называется сопоставлением шаблона с маской.Я думаю, что вы можете попробовать установить ROI (область интересов) на шаблоне. Этот ТАК вопрос показывает, как это сделать .(обратите внимание, что в этом вопросе ROI устанавливается на целевом изображении, а не на шаблоне, но процедура такая же).

...