作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
SQDIFF 定义为 openCV definition . (我相信他们省略了 channel )
在初级 numpy Python 中应该是
A = np.arange(27, dtype=np.float32)
A = A.reshape(3,3,3) # The "image"
B = np.ones([2, 2, 3], dtype=np.float32) # window
rw, rh = A.shape[0] - B.shape[0] + 1, A.shape[1] - B.shape[1] + 1 # End result size
result = np.zeros([rw, rh])
for i in range(rw):
for j in range(rh):
w = A[i:i + B.shape[0], j:j + B.shape[1]]
res = B - w
result[i, j] = np.sum(
res ** 2
)
cv_result = cv.matchTemplate(A, B, cv.TM_SQDIFF) # this result is the same as the simple for loops
assert np.allclose(cv_result, result)
这是相对较慢的解决方案。我读过
sliding_window_view
但不能正确。
# This will fail with these large arrays but is ok for smaller ones
A = np.random.rand(1028, 1232, 3).astype(np.float32)
B = np.random.rand(248, 249, 3).astype(np.float32)
locations = np.lib.stride_tricks.sliding_window_view(A, B.shape)
sqdiff = np.sum((B - locations) ** 2, axis=(-1,-2, -3, -4)) # This will fail with normal sized images
将失败
MemoryError
即使结果很容易符合内存。我怎样才能产生与
cv2.matchTemplate
类似的结果以这种更快的方式运行?
最佳答案
作为最后的手段,您可以在切片中执行计算,而不是“一次性”计算。np.lib.stride_tricks.sliding_window_view
返回 查看 的数据,所以它不会消耗大量的内存。
表达式 B - locations
不能使用 View ,并且需要 RAM 来存储形状为 (781, 984, 1, 248, 249, 3) 的浮点元素数组。
用于存储的总 RAM B - locations
是 781*984*1*248*249*3*4
= 569,479,908,096 字节。
为了避免需要存储B - locations
立即在 RAM 中,我们可以计算 sqdiff
在瓦片中,当“瓦片”计算需要较少的 RAM 时。
一个简单的瓷砖划分使用每一行作为一个瓷砖 - 在 sqdiff
的行上循环,并逐行计算输出。
例子:
sqdiff = np.zeros((locations.shape[0], locations.shape[1]), np.float32) # Allocate an array for storing the result.
# Compute sqdiff row by row instead of computing all at once.
for i in range(sqdiff.shape[0]):
sqdiff[i, :] = np.sum((B - locations[i, :, :, :, :, :]) ** 2, axis=(-1, -2, -3, -4))
import numpy as np
import cv2
A = np.random.rand(1028, 1232, 3).astype(np.float32)
B = np.random.rand(248, 249, 3).astype(np.float32)
locations = np.lib.stride_tricks.sliding_window_view(A, B.shape)
cv_result = cv2.matchTemplate(A, B, cv2.TM_SQDIFF) # this result is the same as the simple for loops
#sqdiff = np.sum((B - locations) ** 2, axis=(-1, -2, -3, -4)) # This will fail with normal sized images
sqdiff = np.zeros((locations.shape[0], locations.shape[1]), np.float32) # Allocate an array for storing the result.
# Compute sqdiff row by row instead of computing all at once.
for i in range(sqdiff.shape[0]):
sqdiff[i, :] = np.sum((B - locations[i, :, :, :, :, :]) ** 2, axis=(-1, -2, -3, -4))
assert np.allclose(cv_result, sqdiff)
关于python - NumPy 模板匹配 SQDIFF 与 `sliding window_view`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68122570/
SQDIFF 定义为 openCV definition . (我相信他们省略了 channel ) 在初级 numpy Python 中应该是 A = np.arange(27, dtype=np.
我是一名优秀的程序员,十分优秀!