我正在使用python中的一个程序,该程序使用与openCV中的addWeighted
函数非常相似的函数。不同之处在于它实际上并没有添加代表图像的numpy数组,而是在任何特定坐标处使用哪个像素更亮并使用该值。
然而,我发现,尽管这些函数的功能非常相似,但addWeighted
功能要快得多。所以我的问题是,如何修改我当前的解决方案同样快?有没有办法可以使用multiprocessing
模块或类似的东西?
以下是代码:
image = np.zeros(image_1.shape)
for row_index, row in enumerate(image_1):
for col_index, col in enumerate(row):
pixel_1 = image_1[row_index, col_index]
pixel_2 = image_2[row_index, col_index]
sum_1 = int(pixel_1[0]) + int(pixel_1[1]) + int(pixel_1[2])
sum_2 = int(pixel_2[0]) + int(pixel_2[1]) + int(pixel_2[2])
if sum_2 > sum_1:
image[row_index, col_index] = pixel_2
else:
image[row_index, col_index] = pixel_1
其中image_1
和image_2
都是代表图像的numpy数组,两者具有相同的形状(720, 1280, 3)
。
答案 0 :(得分:2)
一种矢量化方法是 -
mask = image_2.astype(int).sum(-1) > image_1.astype(int).sum(-1)
out = np.where(mask[...,None], image_2, image_1)
步骤:
转换为int
dtypes,沿最后一个轴求和并执行逐元素比较。这会给我们一个面具。
将np.where
与此掩码一起使用,扩展为相同的编号。作为输入数组的dims进行选择。这采用NumPy broadcasting
的概念以矢量化方式进行选择。所以,这值得一看。
注意:或者,我们也可以使用keepdims=True
来保留号码。求和时的暗淡,从而避免在下一步中延长暗淡。