英文:
Is there any numpy-like way to make my code faster?
问题
以下是您要翻译的内容:
我正在编写一段部分归一化输入图像强度的代码。由于我找不到NumPy库的相应函数,我创建了以下代码:
```python
def arealNorm(img, kernel_size=7): #图像应为灰度图
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的方法可以使我的代码运行更快?
<details>
<summary>英文:</summary>
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
Since it should access every pixel of the image this code works very slowly.
Is there any numpy-like way to convert my code to work faster ?
</details>
# 答案1
**得分**: 1
使用内置函数scipy.ndimage.filters.generic_filter来加速这段代码的一种方法。该函数将用户定义的函数应用于输入图像中的每个邻域。
以下是使用generic_filter的示例实现:
```python
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
英文:
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:
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
答案2
得分: 1
感谢 @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
英文:
Thanks to @Michael Butscher , I finalized my code as :
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论