如何将函数映射到OPENCV图像中的RGB值



我正在阅读通过OpenCV捕获的图像,并希望将函数映射到图像中的每个像素值。输出是m x n x 3 numpy阵列,其中m和n是图像的长度和宽度的坐标,三个值是每个像素的相应蓝色,绿色和红色值。

我首先想到将嵌套的循环运行到图像中的每个值。但是,运行需要很长时间,因此我正在寻找一种更有效的方法来快速循环图像。

这是嵌套的循环:

a = list()
for row in img:
    for col in row:
        a.append(np.sqrt(np.prod(col[1:])))
adjusted = np.asarray(a).reshape((img.shape[0], img.shape[1]))

此代码有效,但我想使其运行速度更快。我知道矢量化可能是一个选择,但是我不知道如何将其应用于数组的一部分而不是整个数组。为此,我认为我可以将其重塑为 img.reshape((np.prod(img.shape[:2]),3)),然后在每个三个值的每组中循环,但是我不知道要使用的正确函数/迭代器。

另外,如果OpenCV/numpy/scipy具有另一个功能,那么这将是一个很好的帮助。我也对其他选择开放,但我想给出一些我的想法。

最后,我想进行输入并计算红色和绿色值的几何平均值,并创建几何均值的N X M数组。任何帮助将不胜感激!

可以使用np.prod()中的axis参数对此进行矢量化。设置axis=-1将导致产品仅在最后一个轴上采用。

仅在最后两个通道上执行此产品,索引数组仅使用img[..., 1:]

提取这些通道

您可以用以下行替换代码:

adjusted = np.sqrt(np.prod(img[..., 1:], axis=-1))

为了娱乐,让我们使用一些模拟数据来介绍这两个函数:

import numpy as np
img = np.random.random((100,100,3))
def original_function(img):
  a = []
  for row in img:
      for col in row:
          a.append(np.sqrt(np.prod(col[1:])))
  adjusted = np.asarray(a).reshape((img.shape[0], img.shape[1]))
  return adjusted
def improved_function(img):
  return np.sqrt(np.prod(img[:,:,1:], axis=-1))
>>> %timeit -n 100 original_function(img)
100 loops, best of 3: 55.5 ms per loop
>>> %timeit -n 100 improved_function(img)
100 loops, best of 3: 115 µs per loop

速度提高了500倍!numpy vectorization的美丽:(

最新更新