我有这种形状的图像阵列:
(50000, 32, 32, 3)
50000
是图像数32, 32
是高度和宽度3
是范围为0-1
的RGB值我想将其转换为2D形状:
(50000, 1024)
在这里,我将在一行中显示50000张图片,
RGB值将被转换为十六进制值
我已经经历了很多转换过程,到堆栈溢出,发现了一些。
我知道,如果我的数组是具有已转换值的3D数组,则可以轻松地使用reshape()
函数将其转换为2D。
现在,我正在搜索的是转换RGB值和调整数组形状的最简单方法
这行一两行还是应该使用外部函数?
答案 0 :(得分:2)
首先使用您喜欢的任何功能将最后一维的RGB值转换为十六进制值。这个SO answer可能会有帮助。
然后重塑可在任意尺寸上使用:
import numpy as np
def rgb2hex(r, g, b):
return '#%02x%02x%02x' % (r, g, b)
vfunc = np.vectorize(rgb2hex)
a = (np.random.uniform(0,1,(10,5,5,3))*255).astype(int)
c = vfunc(a[:,:,:,0], a[:,:,:,1], a[:,:,:,2])
c.reshape((10,25))
答案 1 :(得分:1)
以下内容将RGB值合并为一个值
x=np.zeros((100,32,32,3))
x[:,:,:,0] = np.trunc(x[:,:,:,0]) + np.trunc(x[:,:,:,1] *256) + np.trunc(x[:,:,:,2] *65535)
y=x[:,:,:,0]
print(y.shape)
所得的y形状:(100,32,32)
接下来,您可以在y上使用重塑功能。
答案 2 :(得分:1)
为此,您首先需要重塑ndarray
(np.reshape
):
a = np.random.randint(1,10,(500, 32, 32, 3))
a_r = np.reshape(a, (500, 1024, 3))
print(a_r.shape)
# (500, 1024, 3)
现在,为了按照您的建议将沿最后一个维度的RGB
值转换为十六进制表示,您可以定义一个函数,该函数以简单的字符串格式返回三个值的十六进制表示:
def rgb_to_hex(x):
return '#{:02X}{:02X}{:02X}'.format(*rgb.reshape(3))
为了将转换应用于最后一个轴上的所有行,可以使用np.apply_along_axis
:
a_new = np.apply_along_axis(rgb2hex, axis=-1, arr=a_r).shape
print(a_new.shape)
# (500, 1024)