【问题标题】:What does the TM_CCORR and TM_CCOEFF in opencv mean?opencv 中的 TM_CCORR 和 TM_CCOEFF 是什么意思?
【发布时间】:2019-04-02 07:45:07
【问题描述】:

opencv 中的 TM_CCORR 和 TM_CCOEFF 是什么意思?我发现 TM_CCORR 代表相关系数。然而,TM_CCOEFF 接缝也因其命名而成为相关系数。

你知道缩写代表什么吗?

TM_SQDIFF = T模板M匹配Square差异erence

TM_CCOEFF = T模板M匹配C或相关系数icient ?

TM_CCORR = T模板M匹配Corr高兴???

【问题讨论】:

  • 查看OpenCV doc了解确切的公式。
  • 谢谢@HansHirse。但是,在 TM_CCORR 和 TM_CCOEFF 之间看起来非常相似的只有公式,没有公式的解释。但是这个缩写是什么意思?都是相关系数吗?

标签: opencv computer-vision opencv3.0


【解决方案1】:

请参阅“学习 OpenCV 3:使用 OpenCV 库在 C++ 中使用计算机视觉” 作者:阿德里安·凯勒、加里·布拉德斯基

https://books.google.com.au/books?id=SKy3DQAAQBAJ&lpg=PT607&ots=XGg5zrJXPp&dq=TM_CCOEFF&pg=PT606#v=onepage&q=TM_CCOEFF&f=false

根据书:

TM_CCORR = 互相关

TM_CCOEFF = 相关系数

FWIW:TM_CCOEFF 方法中的−1/(w⋅h)⋅∑x″,y″T(x″,y″) 仅用于a)使模板和图像为零均值,b)使图像的暗部分为负值,图像的亮部分为正值。

这意味着当模板和图像的明亮部分重叠时,您将在点积中获得正值,以及当黑暗部分与黑暗部分重叠时(-ve 值 x -ve 值给出 +ve 值) . 这意味着您在明亮部分匹配和暗部分匹配方面都获得了 +ve 分数。

当您在模板上设置暗色 (-ve) 并在图像上设置亮色 (+ve) 时,您将获得 -ve 值。当你在模板上有亮 (+ve) 和在图像上暗 (-ve) 时,你也会得到 -ve 值。 这意味着您在不匹配时得到负分。

另一方面,如果您没有−1/(w⋅h)⋅∑x″,y″T(x″,y″) 术语,即在TM_CCORR 方法中,那么当模板和图像之间存在不匹配时,您不会受到任何惩罚。实际上,此方法是测量图像中与模板形状相同的最亮像素集的位置。 (这就是为什么标志、足球和梅西腿上方的区域在匹配结果中的强度很高)。

【讨论】:

    【解决方案2】:

    正如 HansHire 所提到的,official documentation 在窗口滑动时提供了用于像素求和的公式。此外,Python OpenCV docs 显示示例:

    TM_CCOEFF
    

    TM_CCORR
    

    请注意文档说:

    您可以看到使用 cv2.TM_CCORR 的结果并不像我们预期的那样好。

    如果您想使用始终保持不变的屏幕截图或图像部分(a-la Sikuli)(不是照明/变换可以改变的真实世界的相机帧),请使用matchTemplate,否则尽量避免它。它仅适用于特定用例,并且在实际结果方面不同的求和函数之间没有太大差异。

    要解决您对缩写 TM_CCORRTM_CCOEFF 代表什么的评论?:

    100% 我真的不知道,但这不会阻止我猜测 :)))

    我的直觉是,基于文档公式,TM_CCORR 是模板和图像之间的直接(“最简单”)关联:

    结果像素是模板像素与模板中每个像素的图像像素之间的点积之和。

    当模板“滑动”通过图像时,计算结果图像。

    TM_CCOEFF 但不是当前模板像素 (T),而是使用更复杂的“系数”(T') (T(x′,y′)−1/(w⋅h)⋅∑x″,y″T(x″,y″))(类似地(I' 使用)。

    我对数学符号的理解非常有限,但据我所知,CORR 版本与COEFF 不同,它考虑了模板和图像的尺寸以及总和像素强度。

    唯一支持的其他方法是TM_SQDIFF,顾名思义,公式确认使用模板和图像像素强度之间的平方距离。

    这 3 种主要方法中的每一种都有标准版本。

    好的,这就是我对缩写含义的看法(例如,直接(点积)相关性与更复杂(没有双关语)的相关性)

    但这意味着什么?

    实际上,我主要关注的是TM_CCORRTM_CCOEFF 最有可能匹配最亮的像素,而TM_SQDIFF 则相反:最暗的值可能匹配(请参阅链接的示例图像)。

    我会从TM_CCOEFF 开始,然后如果当前图像的结果没有返回一致的结果,请修改参数,但如前所述,我只会将其用于非常非常受控条件。

    对于不是屏幕截图或模板的实时数据,它们是同一图像的一部分(a-la “Waldo 在哪里”),我会研究对象检测(例如,使用 HOG 作为特征描述符训练 SVM)

    【讨论】:

    • 谢谢。你还知道缩写 TM_CCORR 和 TM_CCOEFF 代表什么吗?
    • 感谢您所追求的彻底性,我在上面提供了更多信息。希望它涵盖了实践。如果您真的想为此陷入困境:选项1如果您对c ++感到满意,请查看implementation,选项2:使用您喜欢的语言并编写自己的相关函数,首先用原始数字测试它们,然后编写另一个可以遍历所有img像素的方法,然后遍历每个图像像素的所有模板像素,计算相关性并存储结果。
    【解决方案3】:

    以下公式给出了 T(x,y) 的居中版本:

    T′(x′,y′)=T(x′,y′)−1/(w⋅h)⋅∑x′′,y′′T(x′′,y′′)

    与 I′ 有点不同,因为它在内核 (w, h) 中以 I 为中心。

    I′(x+x′,y+y′)=I(x+x′,y+y′)−1/(w⋅h)⋅∑x′′,y′′I(x+ x′′,y+y′′)

    我认为理想情况下 TM_CCORR_NORMED 和 TM_CCOEFF_NORMED 应该给出相似的结果。 由于计算机四舍五入,可能会出现差异,因为 TM_CCOEFF_NORMED 通常使用接近零的数字进行操作。

    更新

    T' = T - m,其中 m 是 T 的平均值

    I' = I - I * M,其中 M 是大小为 (w, h) 的均值滤波矩阵

    TM_CCOEFF  = T' * I' = (T - m) * (I - I * M) =
               = ((T - m) * I) * (U - M)
               = TM_CCORR * SHARPNESS - m * (I * SHARPNESS)
    
           
    

    其中 U - 是单位滤镜,SHARPNESS = U - M 是锐度滤镜。

    所以,TM_CCOEFF 是 TM_CCORR 的锐度,经过一些归一化。

    【讨论】:

      猜你喜欢
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多