- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在以下示例中,使用 cv2.matchTemplate 方法计算 A、B 数组的互相关。结果存储在C数组中:
import cv2
import numpy as np
A=np.ones((3,3), dtype=np.uint8)
B=np.array([[1,2,3],[4,5,6],[7,8,9]], dtype=np.uint8)
C=cv2.matchTemplate( A, B, cv2.TM_CCORR )
>>> A
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]], dtype=uint8)
>>> B
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=uint8)
>>> C
array([[ 45.]], dtype=float32)
让我们使用 scipy 实现相同的示例:
import cv2
import numpy as np
import scipy
import scipy.signal
A = np.ones((3,3), dtype=np.uint8)
B = np.array([[1,2,3],[4,5,6],[7,8,9]], dtype=np.uint8)
C = scipy.signal.correlate2d(A,B)
>>> C
array([[ 9, 17, 24, 15, 7],
[15, 28, 39, 24, 11],
[18, 33, 45, 27, 12],
[ 9, 16, 21, 12, 5],
[ 3, 5, 6, 3, 1]], dtype=uint8)
现在让我们使用 Octave 实现相同的示例:
octave:4> A=ones(3,3)
A =
1 1 1
1 1 1
1 1 1
octave:5> B=[1 2 3; 4 5 6; 7 8 9]
B =
1 2 3
4 5 6
7 8 9
octave:6> C=xco
xcorr xcorr2 xcov
octave:6> C=xcorr2(A,B)
C =
9 17 24 15 7
15 28 39 24 11
18 33 45 27 12
9 16 21 12 5
3 5 6 3 1
通过比较结果我们可以看到opencv的方法产生了明显不同的结果。
有人可以解释一下 2D 互相关的各种实现之间的区别吗?
为了正确计算 2D 互相关,我应该对我的 opencv 代码进行哪些更改?
谢谢大家
放克
最佳答案
好吧,首先我们需要引用 OpenCV 文档:
cv2.matchTemplate(image, templ, method[, result]) → result
result
– 比较结果图。必须是单 channel 32位 float 。如果图像是 W x H
并且 templ
是 w x h
,那么结果是 (W-w+1) x (H-h +1)
。使用 3x3 图像和 3x3 模板,您的结果将是一个 (3-3+1)x(3-3+1) = (1x1)
矩阵,这就是方法实际上确实返回了。
TM_CCORR
方法使用的公式如下:
现在让我们看看这个实现与其他实现之间的区别。
scipy.signal.correlate2d(in1, in2, mode='full', boundary='fill', fillvalue=0)[source]
结果大小由 mode
参数决定。使用默认参数 full
意味着结果大小将为 (W+w-1) x (H+h-1)
。但是,将模式更改为 valid
将导致 (W-w+1) x (H-h+1)
结果,这与通过以下方式实现的结果相同OpenCV.
C = xcorr2(A,B)
结果矩阵的大小为:
C_rows = A_rows + B_rows - 1
C_cols = A_cols + B_cols - 1
使用 3x3 图像和 3x3 模板,您的结果将是一个 (3+3-1)x(3+3-1)=(5x5)
矩阵。
该方法使用的公式看起来与 OpenCV 使用的公式不同,但实际上只是同一方程的不同形式。
所有三个实现中使用的公式似乎是相同的。这些方法之间存在差异的原因在于处理边界条件的方式。互相关是通过在图像矩阵上“滑动”模板矩阵并将给定单元格的结果总和设置为图像和模板中重叠单元格的乘积之和来实现的。但是,对于图像中的边缘情况,除非模板是 1x1 矩阵,否则它将与图像的边缘重叠(示例见下图)。这种情况可以通过填充或环绕图像来处理。在第一种情况下,图像被放大并用零填充以确保模板不会超出图像。
在 SciPy 和 Octave 中,默认方法是填充图像,这将生成比输入图像大的图像(实际上,在两个 3x3 矩阵的情况下,结果是 5x5,因为模板悬在当以图像的边缘单元格为中心时,图像总共有 2 行和 2 列)。在 OpenCV 中,默认方法是删除模板悬在图像上方的边缘情况,在这种情况下,这意味着模板的唯一有效位置恰好位于图像的中心。这解释了值为 45 的单个结果单元格:模板所有元素的总和乘以 1。
要回答有关如何使用 OpenCV 的 Matlab 实现获得相同结果的问题:只需扩大输入矩阵,使其大小为(W+w-1) x (H+h-1)
,将图像置于新矩阵的中心,并用 0 填充图像外部的区域:
A=padarray(np.ones((3,3), dtype=np.uint8), [1, 1])
关于python - 在 Python 中使用 OpenCV 的 matchTemplate 方法进行二维互相关的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31561513/
第一段代码工作正常,并给出了我需要的结果。我现在想做的是让它在 'as num' 上返回 3 个数字值对于“as num”上的 3 个不同值,对于同一列上的 3 个不同位置 SELEC
我想分析一些数据以编写定价算法。以下日期可用: 我需要三个变量/维度的函数/相关因子,它显示三个维度(pers_capacity、卧室数量、浴室数量)增长时中位数(价格)的变化。例如Y(#pers_c
正如标题所说 - 我的 Sprite Kit 游戏时不时地在后台崩溃,总是出现此错误 - Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Sub
假设我尝试保存以下数据,并且Songs模型的name属性上设置了Phalcon \ Mvc \ Model \ Validator \ PresenceOf验证器 // Get an existing
我有一个 if 控件,如下所示; if (Directory.Exists(System.IO.Path.Combine(systemPath, "Reports", companyName))
有人可以告诉我我们使用 ReadLine() 从文件 (.txt) 中读取特定行吗?现在我想读取文件的全部内容(不仅仅是第一行)。为此我需要使用什么方法。我用谷歌搜索了很多,但找不到解决方案。 我的代
我相信在大学时我用从 C 派生的语言为 FPGA 编写了一个程序。我了解 VHDL 和 verilog 等语言。但是,我不明白的是程序员在使用哪个方面有多少选择?它依赖于FPGA吗?我将使用 Xili
我有一个 if 控件,如下所示; if (Directory.Exists(System.IO.Path.Combine(systemPath, "Reports", companyName))
如何在运行时更改 Dashcode (Javascript) 中图像对象的源? 我试过: var image = document.getElementById("image").object;ima
我有几个相互关联的类,它们将被多种不同的算法使用 例子: struct B; struct A { B* parent; }; struct B { std::vector child
我正在开发一个网站,用户在客户收到的表中输入金额,如果任何客户没有提供分期付款(金额),则用户不会在表中输入任何金额,并且用户希望获取违约者的信息客户以10天为基础。所以我的问题是应该定义什么表和属性
我试图从上一个条目中选择一个值,并每次将该数字加一。我让它工作到选择当前条目值(默认 1000)并递增 1 并重新插入该值(因此每次最终都是 1001)。我需要它来选择该字段的最后一个条目,这样它将变
我不擅长“制作”查询。假设这是我的数据库: artist pics ------------------- -
最近,我要为我的网站做一个即时通知系统。我听说 COMET 在这种情况下必不可少。 我已经搜索 PHP 和 Comet 一段时间了,但是,我发现的指南和文章似乎只是循环中的 ajax 请求。例如,有一
我正在开发一款 iOS 游戏,我希望 clown 在场景外生成,然后向下移动。我的想法是全部创建它们,并将它们以 360 像素的距离放置在不可见的场景中。 像这样: SKSpriteNode *clo
我有以下子订单表。 mysql> select * from suborder; +-------------+------------------+ | order_state | bookin
这可能是一个有点初学者的问题,但考虑到在 Java 中调试编码是相当相关的:什么时候编码与 String 对象相关? 假设我有一个要保存到文件中的字符串对象。 String 对象本身是否使用某种我应该
首先我想说我是 CPP 的新手(我从 cpp11 开始):)考虑以下实体:学生(名字+姓氏)和组(描述+更多学生)。我在 C++ 中创建了以下 2 个类: class Student { privat
我正在尝试在单击该复选框时同步更新我的数据库。我决定使用 aJax,但它似乎无法识别 ajax。 代码:将成为 Switch_Active(this.id) 函数的元素 ... Deactivat
我正在创建一个菜单。菜单如下。 $('.category').mouseover(function() { $(this).removeClass('category').addClass('cate
我是一名优秀的程序员,十分优秀!