Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy 如何更有效地实现关联?_Numpy_Opencv_Matrix_Graphics_Computer Vision - Fatal编程技术网

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

这里的目标是使用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(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编写它们。