Image processing OpenCV模板匹配和透明度
在模板匹配过程中,OpenCV处理图像透明度的方式是什么 问题是模板图像需要有透明的部分,因为在原始图像中,这些地方可能有任何东西Image processing OpenCV模板匹配和透明度,image-processing,opencv,computer-vision,template-matching,Image Processing,Opencv,Computer Vision,Template Matching,在模板匹配过程中,OpenCV处理图像透明度的方式是什么 问题是模板图像需要有透明的部分,因为在原始图像中,这些地方可能有任何东西 我尝试了所有的方法,但没有一种产生积极的结果(例如,原始图像中模板的位置没有被正确检测到)。我认为您正在尝试OpenCV中所称的模板与遮罩匹配。我认为您可以尝试在模板上设置ROI(感兴趣区域)。(请注意,在这个问题中,ROI设置在目标图像上,而不是模板上,但过程是相同的)。我不确定,但透明度通道的处理方式与任何其他通道一样。如果模板中的像素是“透明的”,那么在主图像
我尝试了所有的方法,但没有一种产生积极的结果(例如,原始图像中模板的位置没有被正确检测到)。我认为您正在尝试OpenCV中所称的模板与遮罩匹配。我认为您可以尝试在模板上设置ROI(感兴趣区域)。(请注意,在这个问题中,ROI设置在目标图像上,而不是模板上,但过程是相同的)。我不确定,但透明度通道的处理方式与任何其他通道一样。如果模板中的像素是“透明的”,那么在主图像上也应该是“透明的”。我只是在这里猜测。OpenCV似乎不像您希望的那样处理alpha 您有两个选择:
misha@misha-desktop:~/Desktop/stackoverflow$ python cross-correlation.py map-blue.png building-maskz-blue.png
(163, 244)
最后,这是我的建议
PS.这是什么游戏?如果您尝试用黑色RGB颜色替换alpha通道,
SQDIFF/SQDIFF\N
选项将是一个解决方案。
至少这是我解决同样问题的方法。从我的结果可以明显看出,这种方法对较亮的像素值很敏感,我抓住了这个机会。我遇到了同样的问题,我想到了一个解决方案。假设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));
然后,通过该数字对相关性进行规范化应该会得到您(和我)想要的值。两幅图像中未遮罩的像素的平均乘积
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));
Image imCorr=referenceImage.MatchTemplate(templateImage,Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCORR);
Image-imCorrMask=referenceImageMask.MatchTemplate(templateMask,Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCORR);
_imCorr=_imCorr.Mul(_imcorrsmask.Pow(-1));
更新:实际上,这个解决方案不起作用。由于opencv中的互相关实现使用DFT,因此会出现数字问题,您无法使用第二个互相关来纠正第一个问题。我有一个稍微有点死板的解决方案来解决这个问题,它实际上似乎工作得相当好:用噪声替换模板图像的alpha通道,这或多或少使透明区域在匹配过程中统计上不重要 例如,我的用例涉及在iOS屏幕截图中搜索表情符号。iOS键盘背景会根据上下文更改颜色,如果您在模板图像中使用特定背景颜色,则匹配过程会出现问题 这是alpha上的原始模板图像:
以下是已处理的模板,其中包含alpha通道的噪声填充:
我通过OpenCV文档中提供的发送了经过处理的模板图像。无论是在深色背景还是浅色背景下,都能以合理的置信度找到匹配项 在黑暗背景下搜索: 在灯光背景上搜索:
相比之下,将模板的alpha通道保持透明(或提交到深色或浅色背景)不会返回可接受的匹配。OpenCV 3.0为模板与屏蔽模板的匹配提供了本机支持。请参阅: 参数: 图像 模板 结果 方法 掩码搜索模板的掩码。它必须具有与templ相同的数据类型和大小。它不是默认设置的 [稍微离题] 请注意,模板匹配与遮罩的参考图像(较大的图像)是不可能的。这是有意义的,因为OpenCV使用基于FFT的模板匹配 因此,如果只需要在参考图像的特定区域执行模板匹配,则需要实现自己的方法或屏蔽cv::matchTemplate的输出
从头开始实现它可以弥补您只想在非常特定的区域(例如:哈里斯角附近)搜索模板的情况。OpenCV将透明度作为图像的一部分处理,而不是忽略它,这可能会导致意外的结果。我的处理方式,