有没有一种类似于NumPy的方法可以让我的代码运行更快?

huangapple go评论83阅读模式
英文:

Is there any numpy-like way to make my code faster?

问题

以下是您要翻译的内容:

  1. 我正在编写一段部分归一化输入图像强度的代码由于我找不到NumPy库的相应函数我创建了以下代码
  2. ```python
  3. def arealNorm(img, kernel_size=7): #图像应为灰度图
  4. img_norm = np.zeros(img.shape)
  5. for v in range(kernel_size, img.shape[0] - kernel_size):
  6. for u in range(kernel_size, img.shape[1] - kernel_size):
  7. MaxV = np.max(img[v - kernel_size:v + kernel_size, u - kernel_size:u + kernel_size])
  8. minV = np.min(img[v - kernel_size:v + kernel_size, u - kernel_size:u + kernel_size])
  9. newval = (img[v, u] - minV) / (MaxV - minV)
  10. img_norm[v, u] = newval
  11. return img_norm

由于它需要访问图像的每个像素,这段代码运行非常慢。

是否有一种类似于NumPy的方法可以使我的代码运行更快?

  1. <details>
  2. <summary>英文:</summary>
  3. I am making a code that partially normalizes intensity of an input image. Since I could not find corresponding function of Numpy library, I made a code like following:

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

  1. Since it should access every pixel of the image this code works very slowly.
  2. Is there any numpy-like way to convert my code to work faster ?
  3. </details>
  4. # 答案1
  5. **得分**: 1
  6. 使用内置函数scipy.ndimage.filters.generic_filter来加速这段代码的一种方法。该函数将用户定义的函数应用于输入图像中的每个邻域。
  7. 以下是使用generic_filter的示例实现:
  8. ```python
  9. from scipy.ndimage.filters import generic_filter
  10. def arealNorm(img, kernel_size=7):
  11. def local_norm(patch):
  12. max_val = np.max(patch)
  13. min_val = np.min(patch)
  14. return (img - min_val) / (max_val - min_val)
  15. img_norm = generic_filter(img, local_norm, size=kernel_size)
  16. return img_norm
英文:

One approach to speed up this code is to use the built-in function scipy.ndimage.filters.generic_filter. This function applies a user-defined function to each neighborhood in the input image.

Here is an example implementation using generic_filter:

  1. from scipy.ndimage.filters import generic_filter
  2. def arealNorm(img, kernel_size=7):
  3. def local_norm(patch):
  4. max_val = np.max(patch)
  5. min_val = np.min(patch)
  6. return (img - min_val) / (max_val - min_val)
  7. img_norm = generic_filter(img, local_norm, size=kernel_size)
  8. return img_norm

答案2

得分: 1

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

  1. def arealNorm(img, kernel_size=7): # Img should me gray
  2. # img_norm = np.zeros(img.shape)
  3. img_max = ndi.filters.maximum_filter(img, size=kernel_size)
  4. img_min = ndi.filters.minimum_filter(img, size=kernel_size)
  5. img_norm = (img - img_min) / (img_max - img_min)
  6. return img_norm
英文:

Thanks to @Michael Butscher , I finalized my code as :

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

huangapple
  • 本文由 发表于 2023年2月16日 12:14:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/75467793.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定