Я столкнулся с той же проблемой, и я подумал о решении. Предполагая, что 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 использует ДПФ, возникнут числовые проблемы, и вы не можете использовать вторую взаимную корреляцию для исправления первой.