不同方法的

时间:2018-03-24 12:23:33

标签: image opencv image-processing opencv3.0 template-matching

我经常搜索以找到下面提到的方法的阈值。

methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
            'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', cv2.TM_SQDIFF_NORMED']

我也试图自己解决这些问题,但我只能找到最大值为1.0的3种方法的阈值。其他方法值在10 ^ 5的范围内。我想知道这些方法的界限。

有人能指出我正确的方向吗?我的议程是遍历模板匹配的所有方法并获得最佳结果。我查看了文档和源代码,但没有运气。

这些是我得到的值,我可以理解* NORMED方法的值为0-1。

cv2.TM_CCOEFF -- 25349100.0
cv2.TM_CCOEFF_NORMED -- 0.31208357214927673
cv2.TM_CCORR -- 616707328.0
cv2.TM_CCORR_NORMED -- 0.9031367897987366
cv2.TM_SQDIFF -- 405656000.0
cv2.TM_SQDIFF_NORMED -- 0.737377941608429

1 个答案:

答案 0 :(得分:2)

opencv documentation matchTemplate中所述,结果是每个像素的差异总和(因方法而异),因此对于未规范化的方法,阈值会随着模板的大小而变化。

您可以查看每种方法的公式,并根据CV_8UC1图像的最大像素差异为255来计算模板类型的阈值。

enter image description here

因此,假设您有2个灰度图像,最小的图像是 10x10 在这种情况下,对于TM_SQDIFF,最小距离 10x10x0 ^ 2 = 0 (图像相同),最大值 10x10x255 ^ 2 = 6502500 (一张图片完全是黑色,另一张图片是白色),这会产生 [0,6502500] 边界。

当然可以计算未定义尺寸[A,B]。

对于TM_CCORR,它将是 AxBxmax(T(x',y')I(x + x',y + y'))= 65025AB

你可以继续计算剩下的方法,记住如果你有不同的CV_8UC图像类型(如32FC或32SC) - 你需要用相应的值替换255(max(float)max(int32))