gpt4 book ai didi

python - 提高输出两个图像之间不同像素的 Python 函数的性能

转载 作者:太空宇宙 更新时间:2023-11-03 21:33:29 25 4
gpt4 key购买 nike

我正在从事一个计算机视觉项目,希望构建一个快速函数来比较两个图像并仅输出两个图像的像素之间差异足够大的像素。其他像素设置为 (0,0,0)。实际上,我希望相机检测物体并忽略背景。

我的问题是函数运行速度不够快。有哪些方法可以加快速度?

def get_diff_image(fixed_image): 
#get new image
new_image = current_image()

#get diff
diff = abs(fixed_image-new_image)

#creating a filter array
filter_array = np.empty(shape = (fixed_image.shape[0], fixed_image.shape[1]))
for idx, row in enumerate(diff):
for idx2, pixel in enumerate(row):
mag = np.linalg.norm(pixel)
if mag > 40:
filter_array[idx][idx2] = True
else:
filter_array[idx][idx2] = False

#applying filter
filter_image = np.copy(new_image)
filter_image[filter_array == False] = [0, 0, 0]
return filter_image

最佳答案

正如其他人所提到的,您在此代码中最大的减速是迭代 Python 中的每个像素。由于 Python 是一种解释型语言,因此这些迭代比 numpy 在底层使用的 C/C++ 中的等效项花费的时间长得多。

方便的是,您可以为 numpy.linalg.norm 指定一个轴,这样您就可以在一个 numpy 命令中获取所有量级。在这种情况下,您的像素位于轴 2 上,因此我们将采用该轴上的标准,如下所示:

mags = np.linalg.norm(diff, axis=2)

这里,mags 将具有与 filter_array 相同的形状,并且每个位置将保存相应像素的大小。

在 numpy 数组上使用 bool 运算符返回 bool 数组,因此:

filter_array = mags > 40

删除循环后,整个事情看起来像这样:

def get_diff_image(fixed_image): 
#get new image
new_image = current_image()

#get diff
diff = abs(fixed_image-new_image)

#creating a filter array
mags = np.linalg.norm(diff, axis=2)
filter_array = mags > 40

#applying filter
filter_image = np.copy(new_image)
filter_image[filter_array == False] = [0, 0, 0]
return filter_image

但仍有更高的效率有待提高。

正如 pete2fiddy 所指出的,向量的大小不依赖于它的方向。绝对值运算符只改变方向,不改变大小,所以我们这里不需要它。甜!

最大的剩余性能增益是避免复制图像。如果您需要保留原始图像,请首先为输出数组分配零,因为归零内存通常是硬件加速的。然后,只复制所需的像素。如果您不需要原始图像并且只打算使用过滤后的图像,那么就地修改图像将提供更好的性能。

这是一个包含这些更改的更新函数:

def get_diff_image(fixed_image): 
#get new image
new_image = current_image()

# Compute difference magnitudes
mags = np.linalg.norm(fixed_image - new_image, axis=2)

# Preserve original image
filter_image = np.zeros_like(new_image)
filter_image[mag > 40] = new_image[mag > 40]
return filter_image

# Avoid copy entirely (overwrites original!)
# new_image[mag < 40] = [0, 0, 0]
# return new_image

关于python - 提高输出两个图像之间不同像素的 Python 函数的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45259307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com