繁体   English   中英

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

[英]How to map a function to RGB values in an opencv image

我正在读取通过 opencv 捕获的图像,并希望将函数映射到图像中的每个像素值。 输出是一个 mxnx 3 numpy 数组,其中 m 和 n 是图像的长宽坐标,三个值是每个像素对应的蓝色、绿色和红色值。

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

这是嵌套的 for 循环:

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 有另一个功能可以做到这一点,那将是一个很大的帮助。 我也对其他选择持开放态度,但我想提出一些我的想法。

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

这可以使用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 向量化的美妙之处:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM