Numpy 如何更有效地实现关联?
这里的目标是使用numpy实现图像的卷积运算 我试图用填充选项实现卷积函数。但是,我的代码使用两个Numpy 如何更有效地实现关联?,numpy,opencv,matrix,graphics,computer-vision,Numpy,Opencv,Matrix,Graphics,Computer Vision,这里的目标是使用numpy实现图像的卷积运算 我试图用填充选项实现卷积函数。但是,我的代码使用两个for循环遍历行和列。因此,处理大型图像文件的速度非常慢 def correlate(I, h, pad): top, bottom, left, right = pad tmp = zero_padding(I, top, bottom, left, right) print("padded shape:", tmp.shape) max_dim = max(le
for循环
遍历行和列。因此,处理大型图像文件的速度非常慢
def correlate(I, h, pad):
top, bottom, left, right = pad
tmp = zero_padding(I, top, bottom, left, right)
print("padded shape:", tmp.shape)
max_dim = max(len(tmp.shape), len(h.shape))
while len(tmp.shape) < 3:
tmp = tmp[..., np.newaxis]
while len(h.shape) < 3:
h = h[..., np.newaxis]
if h.shape[-1] < I.shape[-1]:
if (I.shape[-1] == 3) & (h.shape[-1] == 1):
h = np.dstack([h,h,h])
else:
raise ValueError('dimension mismatch')
new_hight = tmp.shape[0] - h.shape[0] + 1
new_width = tmp.shape[1] - h.shape[1] + 1
result = np.ones((new_hight, new_width, tmp.shape[-1]))
for ver in range(new_hight):
for hor in range(new_width):
block = get_block(tmp, h, ver, hor)
mix = np.sum(np.sum(block*h, axis=0), axis=0)
result[ver, hor] = mix
return result
def关联(I、h、pad):
上、下、左、右=衬垫
tmp=零填充(I、顶部、底部、左侧、右侧)
打印(“填充形状:”,tmp.shape)
最大尺寸=最大(透镜(tmp形状)、透镜(h形状))
而透镜(tmp形状)<3:
tmp=tmp[…,np.newaxis]
而透镜(h形)<3:
h=h[…,np.newaxis]
如果h形[-1]
处理我的(5000、4000、3)个图像花了很长时间。自己实现这类功能很有教育意义。但是你学到的主要事情是,(a)覆盖边缘情况和(b)快速完成非常困难 您可能需要尝试中的相关函数和卷积函数。例如:
import numpy as np
from scipy.signal import correlate, convolve
a = np.random.random((100, 100, 3))
b = np.random.random((100, 100, 3))
corr = correlate(a, b, mode='same')
conv = convolve(a, b, mode='same')
您可以传递一个
方法
参数在频域中执行此操作,或者还有fftconvolve()
(这是method='fft'
使用的)。您可能希望两个选项都计时,因为根据您的数据,其中任何一个都可能更快。有很多库具有高效的实现,不要尝试用Python实现自己的库,它永远不会快。@CrisLuengo嗯,必须有人编写这些库。是的,他们用C或C++或FORTRAN编写它们。