Python,Numpy,OpenCV - 创建一个修改过的(同样快速)“addWeighted”函数

时间:2017-07-17 05:27:09

标签: python opencv numpy image-processing

我正在使用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_1image_2都是代表图像的numpy数组,两者具有相同的形状(720, 1280, 3)

1 个答案:

答案 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来保留号码。求和时的暗淡,从而避免在下一步中延长暗淡。

相关问题