簡體   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