Python 将图像阵列[n,宽度,高度]重新整形为[n,高度,宽度,通道]
我的图像由一位数组成,宽度=32,高度=60。我正在尝试将它们连接起来,以获得最多5位数的图像 我正在制作一位数的图像,如下所示Python 将图像阵列[n,宽度,高度]重新整形为[n,高度,宽度,通道],python,numpy,reshape,Python,Numpy,Reshape,我的图像由一位数组成,宽度=32,高度=60。我正在尝试将它们连接起来,以获得最多5位数的图像 我正在制作一位数的图像,如下所示 def gen(n=10, max_digs=1, width=32): capgen = ImageCaptcha(width=width, height=60) data = [] target = [] for i in range(n): x = np.random.randint(0, 10 ** max_di
def gen(n=10, max_digs=1, width=32):
capgen = ImageCaptcha(width=width, height=60)
data = []
target = []
for i in range(n):
x = np.random.randint(0, 10 ** max_digs)
img = misc.imread(capgen.generate(str(x)))
img = np.mean(img, axis=2)[:, :width]
data.append(img.flatten())
target.append(x)
return np.array(data), np.array(target)
然后我尝试用以下方法连接它们
def generate_dataset(X, y):
X_len = X.shape[0]
X_gen = np.zeros((X_len, height, width * n_len, 1), dtype=np.uint8)
y_gen = [np.zeros((X_len, n_class), dtype=np.uint8) for i in range(n_len)]
# generate random numbers of digits
n_digit = random.randint(1, 6)
for j in range(X_len):
n_digit = random.randint(1, 5)
for i in range(n_digit):
index = random.randint(0, X_len - 1)
image = X[index]
label = y[index]
X_gen[j][:, i*height:width + i * width, 0] = image
y_gen[i][j][label] = 1
for i in range(n_digit, n_len):
y_gen[i][j][10] = 1
return X_gen, y_gen
但是,它给了我一个错误“无法将输入数组从形状(32,60)广播到形状(60,0)”好的,似乎左侧和右侧的形状不匹配
X_gen[j][:, i*height:width + i * width, 0]
形状为(60,32),图像形状为(32,60)
也许试试下面的方法看看是否有效
X_gen[j][:, i*height:width + i * width, 0] = image.T
更新
最后,此更改解决了问题:
X_gen[j][:, i*width: (i+1)*width, 0] = image.T
如果您能提供一些示例输入和所需的输出,这将很有帮助。@Allen X输入具有形状(n,32,60),我希望将输出作为(n,60,32*n_len,1),这与(n,60,160,1)相对应。@Allen同样,如果我在开始时将图片生成为60*60。哪一行出错了?@Allen X_gen[j][:,i*height:width+i*width,0]=image我试过了,但不是它说的;“无法将输入数组从形状(60,32)广播到形状(60,4)”X_gen.shape,height和weight的输出是什么?(10,60,160,1)对应于(n,height,width,channel)您可以在错误行之前分别打印(X_gen.shape),print(j),print(i),print(height),print(width)0 60 32吗