有没有类似 numpy 方法可以让我的代码更快?

cbwuti44  于 2023-02-19  发布在  其他
关注(0)|答案(2)|浏览(164)

我正在做一个代码,部分归一化强度的输入图像。因为我找不到相应的函数Numpy库,我做了一个代码如下:

def arealNorm(img,kernel_size = 7): #Img should me gray
    img_norm = np.zeros(img.shape)
    for v in range(kernel_size,img.shape[0]-kernel_size):
        for u in range(kernel_size,img.shape[1]-kernel_size):
            MaxV = np.max(img[v-kernel_size:v+kernel_size,u-kernel_size:u+kernel_size])
            minV = np.min(img[v-kernel_size:v+kernel_size,u-kernel_size:u+kernel_size])
            newval = (img[v,u]-minV)/(MaxV-minV)
            img_norm[v,u] = newval
    return img_norm

因为它应该访问图像的每个像素,所以这段代码运行得非常慢。
有没有类似 numpy 方法来转换我的代码,使其工作得更快?

csbfibhn

csbfibhn1#

一种加快代码速度的方法是使用内置函数scipy.ndimage.filters.generic_filter,该函数将用户定义的函数应用于输入图像中的每个邻域。
下面是一个使用generic_filter的示例实现:

from scipy.ndimage.filters import generic_filter

def arealNorm(img, kernel_size=7):
  def local_norm(patch):
    max_val = np.max(patch)
    min_val = np.min(patch)
    return (img - min_val) / (max_val - min_val)

  img_norm = generic_filter(img, local_norm, size=kernel_size)
  return img_norm
gv8xihay

gv8xihay2#

感谢@Michael Butscher,我将代码最终确定为:

def arealNorm(img,kernel_size = 7): #Img should me gray
    #img_norm = np.zeros(img.shape)
    img_max = ndi.filters.maximum_filter(img,size = kernel_size)
    img_min = ndi.filters.minimum_filter(img,size = kernel_size)
    img_norm = (img - img_min)/(img_max-img_min)

    return img_norm

相关问题