【问题标题】:Apply Function foreach Pixel in Numpy Array在 Numpy 数组中应用函数 foreach Pixel
【发布时间】:2018-07-02 10:33:28
【问题描述】:

我有一个类似的功能:

def calcChromaFromPixel(red, green, blue):
    r = int(red)
    g = int(green)
    b = int(blue)
    return math.sqrt(math.pow(r - g, 2) + 
                     math.pow(r - b, 2) + 
                     math.pow(g - b, 2))

我有一个 RGB 图像,它已经转换为一个形状类似于 [width, height, 3] 的 numpy 数组,其中 3 是颜色通道。

我想要做的是将该方法应用于每个像素并从结果中构建平均值。我已经完成了显而易见的事情并使用两个循环遍历数组,但这似乎是一件非常缓慢的事情......有没有更快更漂亮的方法来做到这一点?!

谢谢:)

【问题讨论】:

  • “这似乎是一件很慢的事情” - 是它很慢,还是只是看起来很慢?跨度>
  • 请显示两个循环解决方案

标签: python numpy


【解决方案1】:

代码:

import math
import numpy as np
np.random.seed(1)

# FAKE-DATA
img = np.random.randint(0,255,size=(4,4,3))
print(img)

# LOOP APPROACH
def calcChromaFromPixel(red, green, blue):
    r = int(red)
    g = int(green)
    b = int(blue)
    return math.sqrt(math.pow(r - g, 2) +
                     math.pow(r - b, 2) +
                     math.pow(g - b, 2))

bla = np.zeros(img.shape[:2])
for a in range(img.shape[0]):
    for b in range(img.shape[1]):
        bla[a,b] = calcChromaFromPixel(*img[a,b])
print('loop')
print(bla)

# VECTORIZED APPROACH
print('vectorized')
res = np.linalg.norm(np.stack(
        (img[:,:,0] - img[:,:,1],
         img[:,:,0] - img[:,:,2],
         img[:,:,1] - img[:,:,2])), axis=0)
print(res)

输出:

[[[ 37 235 140]
  [ 72 137 203]
  [133  79 192]
  [144 129 204]]

 [[ 71 237 252]
  [134  25 178]
  [ 20 254 101]
  [146 212 139]]

 [[252 234 156]
  [157 142  50]
  [ 68 215 215]
  [233 241 247]]

 [[222  96  86]
  [141 233 137]
  [  7  63  61]
  [ 22  57   1]]]
loop
[[ 242.56545508  160.44313634  138.44132331   97.21111048]
 [ 246.05283985  192.94040531  291.07730932   98.66103588]
 [ 124.99599994  141.90842117  207.88939367   17.20465053]
 [ 185.66636744  133.02631319   77.82030583   69.29646456]]
vectorized
[[ 242.56545508  160.44313634  138.44132331   97.21111048]
 [ 246.05283985  192.94040531  291.07730932   98.66103588]
 [ 124.99599994  141.90842117  207.88939367   17.20465053]
 [ 185.66636744  133.02631319   77.82030583   69.29646456]]

【讨论】:

  • @Kristjan Kiolein:我的代码中的两个循环看起来很像……感谢您的解决方案!我测量了两种解决方案的时间(以秒为单位)。 - “2LoopSolution”:1.074279546737671 秒 - 矢量化:0.015357732772827148 秒非常感谢!
  • 哦我忘了...在我的测试中我使用了 512x512 px 图片
猜你喜欢
  • 2017-08-18
  • 2017-08-20
  • 2019-09-30
  • 2019-07-25
  • 2014-04-20
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
相关资源
最近更新 更多