多次克隆一个NumPy数组

3
我将一张图片加载到了一个numpy数组中,并需要在两个不同的阈值下对其进行二值化处理。
import numpy as np
import cv2

cap = cv2.Videocapture(0)
_,pic = cap.read()
pic1 = pic
pic2 = pic

pic1[pic1 > 100] = 255
pic2[pic2 > 200] = 255

这段代码会修改所有的图片,但我只想修改pic1和pic2这两张图片。


4小时前出现了类似的问题。代码在不需要时自动更新变量 - 重复。什么情况下不同的变量引用相同的内容,而不是创建副本? - hpaulj
1个回答

4
在 Python 中,对象和变量有所不同。变量是赋给对象的名称;而一个对象可以在内存中有多个名称。
通过执行 pic1 = pic; pic2 = pic,您将相同的对象分配给多个不同的变量名,因此您最终会修改相同的对象。
您想要使用 np.ndarray.copy 创建副本。
pic1 = pic.copy()
pic2 = pic.copy()

或者也可以类似地使用np.copy——

pic1, pic2 = map(np.copy, (pic, pic))

这种语法实际上使得克隆pic变得非常容易:

pic1, pic2, ... picN = map(np.copy, [pic] * N)

其中N是您想要创建的副本数量。


对我来说,这比 pic1 = pic.copy(); pic2 = pic.copy() 更整洁,尽管我想这是个人口味问题。 - cs95
我认为这种简化会使代码变得不太易读。但无论如何,这只是个人偏好。 - llllllllll
@liliscent 当然,我能够理解。我从Andras Deak那里学到了这个技巧,并且发现它非常简洁...当然,这并不适合胆小的人:p - cs95
地图函数会增加还是减少处理时间?我希望使用代码处理流。(我试图确定2个对象的存在) - Hojo.Timberwolf
1
@Hojo.Timberwolf 这个差别很小,不用太担心。如果你不感兴趣,可以看一下它下面的备选项。 - cs95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接