【问题标题】:Numpy Image Arrays: How to efficiently switch from RGB to HexNumpy 图像数组:如何有效地从 RGB 切换到 Hex
【发布时间】:2014-10-06 23:22:54
【问题描述】:

我一直在使用嵌套的 for 循环将 RGB 图像转换为十六进制值的图像数组,但是对于大图像来说太慢了。有谁知道可以帮助我从 RGB 切换回 HEX 的快速方法和/或库?

编辑: @ragingSloth

这是我想出的,但对于我的需要来说太慢了:

def rgb_to_hex(array):
    (x, y, z) = array.shape
    for v in range(0, x):
        for u in range(0, y):
            array[v, u] = int('%02x%02x%02x' % (array[v, u, 0], array[v, u, 1], array[v, u, 2]))

【问题讨论】:

  • 你做得怎么样? opencv 可能有适合你的东西。
  • 我不得不承认我在 python 方面不是世界第一,所以我不得不问:什么是 Hex 图像?
  • @ragingSloth 这是我粗略想出来的,它很慢!def rgb_to_hex(array): (x, y) = array.shape for v in range(0, x): for u in range(0, y): array[v, u] = int('%03d%03d%03d' % (array[v, u, 1], array[v, u, 2], array[v, u, 3]))
  • 所以你试图获取 3 个 RGB 值并将它们打包到一个 int 中?
  • @beaker 是的,这才是真正的目标。如果您可以将其作为六位小数,我也可以使用它,但是是的,这个想法是从 3 RGB 到一个单一的 int。

标签: python arrays image numpy


【解决方案1】:

利用beaker的思路,也可以消除双for循环:

def tohex(array):
    array = np.asarray(array, dtype='uint32')
    return ((array[:, :, 0]<<16) + (array[:, :, 1]<<8) + array[:, :, 2])

【讨论】:

  • 非常酷...我喜欢矢量化位。我想我需要更多地研究 Python! :D
【解决方案2】:

字符串操作可能很慢。直接的数学方法是:

array[v, u] = ((array[v, u, 0]<<16) + (array[v, u, 1]<<8) + array[v, u, 2])

这将 RGB 表示的 3 个字节组合成一个 int:

>>> A = [123, 255, 255]
>>> B = (A[0]<<16) + (A[1]<<8) + A[2]
>>> B
8126463
>>> hex(B)
'0x7bffff'

【讨论】:

    【解决方案3】:

    不确定这是否更快,但您可以这样做:

    hexarr = np.vectorize('{:02x}'.format)
    

    然后在一个 RGB 数组上运行它:

    In [67]: a = (np.random.rand(2,5,3)*255).astype('u1')
    
    In [68]: a
    Out[68]:
    array([[[149, 145, 203],
            [210, 234, 219],
            [223,  50,  26],
            [166,  34,  65],
            [213,  78, 115]],
    
           [[191,  54, 168],
            [ 85, 235,  36],
            [180, 140,  96],
            [127,  21,  24],
            [166, 210, 128]]], dtype=uint8)
    
    In [69]: hexarr(a)
    Out[69]:
    array([[['95', '91', 'cb'],
            ['d2', 'ea', 'db'],
            ['df', '32', '1a'],
            ['a6', '22', '41'],
            ['d5', '4e', '73']],
    
           [['bf', '36', 'a8'],
            ['55', 'eb', '24'],
            ['b4', '8c', '60'],
            ['7f', '15', '18'],
            ['a6', 'd2', '80']]],
          dtype='|S2')
    

    您可以使用view 折叠第三个维度:

    In [71]: hexarr(a).view('S6')
    Out[71]:
    array([[['9591cb'],
            ['d2eadb'],
            ['df321a'],
            ['a62241'],
            ['d54e73']],
    
           [['bf36a8'],
            ['55eb24'],
            ['b48c60'],
            ['7f1518'],
            ['a6d280']]],
          dtype='|S6')
    

    不幸的是,这似乎并没有快很多(只是快两倍多):

    In [89]: timeit rgb_to_hex(a)
    1 loops, best of 3: 6.83 s per loop
    
    In [90]: timeit hexarr(a).view('S6')
    1 loops, best of 3: 2.54 s per loop
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2018-08-22
      • 1970-01-01
      • 2018-09-28
      • 2016-08-26
      • 2017-12-22
      相关资源
      最近更新 更多