我一直在使用嵌套for循环将RGB图像转换为Hex值的图像数组,但对于大图像来说它太慢了。有没有人知道一个快速的方法和/或一个可以帮助我切换回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]))
答案 0 :(得分:5)
使用beaker的想法,你也可以消除双重for循环:
def tohex(array):
array = np.asarray(array, dtype='uint32')
return ((array[:, :, 0]<<16) + (array[:, :, 1]<<8) + array[:, :, 2])
答案 1 :(得分:4)
字符串操作可能很慢。直接的数学方法是:
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'
答案 2 :(得分:1)
不确定这是否更快,但您可以这样做:
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