Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing OpenCV模板匹配和透明度_Image Processing_Opencv_Computer Vision_Template Matching - Fatal编程技术网

Image processing OpenCV模板匹配和透明度

Image processing OpenCV模板匹配和透明度,image-processing,opencv,computer-vision,template-matching,Image Processing,Opencv,Computer Vision,Template Matching,在模板匹配过程中,OpenCV处理图像透明度的方式是什么 问题是模板图像需要有透明的部分,因为在原始图像中,这些地方可能有任何东西 我尝试了所有的方法,但没有一种产生积极的结果(例如,原始图像中模板的位置没有被正确检测到)。我认为您正在尝试OpenCV中所称的模板与遮罩匹配。我认为您可以尝试在模板上设置ROI(感兴趣区域)。(请注意,在这个问题中,ROI设置在目标图像上,而不是模板上,但过程是相同的)。我不确定,但透明度通道的处理方式与任何其他通道一样。如果模板中的像素是“透明的”,那么在主图像

在模板匹配过程中,OpenCV处理图像透明度的方式是什么

问题是模板图像需要有透明的部分,因为在原始图像中,这些地方可能有任何东西


我尝试了所有的方法,但没有一种产生积极的结果(例如,原始图像中模板的位置没有被正确检测到)。

我认为您正在尝试OpenCV中所称的模板与遮罩匹配。我认为您可以尝试在模板上设置ROI(感兴趣区域)。(请注意,在这个问题中,ROI设置在目标图像上,而不是模板上,但过程是相同的)。

我不确定,但透明度通道的处理方式与任何其他通道一样。如果模板中的像素是“透明的”,那么在主图像上也应该是“透明的”。我只是在这里猜测。

OpenCV似乎不像您希望的那样处理alpha

您有两个选择:

  • 编写您自己的使用alpha通道的互相关方法
  • 变换图像,使alpha通道变得无关紧要
  • 因为第一个选项很简单,所以我将在这里探讨第二个选项。我将重复使用前面提供给您的示例代码。如果将互相关直接应用于图像,则背景会干扰模板匹配(尤其是浅背景部分)。如果您使用颜色通道,您会发现蓝色通道中的匹配会给出正确的结果。这取决于图像内容,不是解决问题的一致方法

    另一个选项是对图像和模板执行边缘检测(例如),然后执行互相关。这里是边缘检测图像(我在GIMP的Luma通道上使用了Sobel边缘检测器,然后进行了一些强度拉伸)

    如您所见,此处的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将透明度作为图像的一部分处理,而不是忽略它,这可能会导致意外的结果。我的处理方式,