首页 > 解决方案 > 在某一点应用过滤器

问题描述

我有一组非常大的过滤器(总共 9015 个,每个 910 x 910),我想将它们应用于图像中的某些特定点(< 10000)。基本上,这些过滤器尺寸非常大的原因是每个过滤器仅适用于一个点,但仍然考虑到整个图像。我想做的事情背后的数学(过滤器/卷积的应用)非常简单(也就是说,将图像按元素乘以过滤器,然后在每个维度中按元素求和。)以下是一个实现我用 python 和 numpy 编写(其中...表示内存中的某个区域来存储结果):

for q in range(3): # A variable to iterate through the color channels, given that the filters are only 2 dimensional
    for i in range (len(filters)):
            ... = np.floor(np.sum(np.sum(filters[:,:,i] * img[:,:,q], axis = 1), axis = 0) + 0.5)
# Note that filters[:,:,i] selects the correct filter for the current given point

但这在我非常强大的机器上需要很长时间(大约 280 秒)。鉴于这种情况,我尝试使用库函数来希望加快速度(因为我假设它们是高度优化的),但是类似的东西(这里重新应用了与上面相同的注释)

for q in range(3):
        for i in range (len(filters)):
            ... = scipy.ndimage.convolve(img[:,:,q], filters[:,:,i]))

没有多大帮助。(我什至无法计时。这几乎可以肯定是因为这里要完成的计算数量很多更高,因为它使用非常大的过滤器计算图像中每个点的单元格值。)此时,我正在寻找加快速度的方法,我仍然相信库函数是正确的方法。如果有一个函数在某一点进行卷积,或者正如我在标题中提到的那样,在某一点应用过滤器,我可以循环遍历更少的兴趣点(而不是整个图像),调用这个每个点的库函数。或者是否有一些函数需要一组索引来运行卷积?或者也许有一种方法可以重塑数据,使库卷积函数只在某些点运行?

python、numpy、scipy 等中是否有任何具有此功能的函数?

标签: pythonnumpyscipy

解决方案


推荐阅读