我写了一个生成2个彩色图像块的函数:
def generate_block():
x = np.ones((50, 50, 3))
x[:,:,0:3] = np.random.uniform(0, 1, (3,))
show_image(x)
y = np.ones((50, 50, 3))
y[:, :, 0:3] = np.random.uniform(0, 1, (3,))
show_image(y)
然后我想将这两种颜色组合起来形成一个渐变,即从一种颜色到另一种颜色的1个图像。我不确定如何继续,任何建议?使用np.linspace()我可以形成一维的步骤数组,但那么呢?
答案 0 :(得分:4)
这是你在找什么?
def generate_block():
x = np.ones((50, 50, 3))
x[:, :, 0:3] = np.random.uniform(0, 1, (3,))
plt.imshow(x)
plt.figure()
y = np.ones((50, 50, 3))
y[:,:,0:3] = np.random.uniform(0, 1, (3,))
plt.imshow(y)
plt.figure()
c = np.linspace(0, 1, 50)[:, None, None]
gradient = x + (y - x) * c
plt.imshow(gradient)
return x, y, gradient
要按照您的建议使用np.linspace
,我已经使用了广播,这是一个非常强大的工具;阅读更多here。
c = np.linspace(0, 1, 50)
创建一个形状(50,)
的数组,其中包含从0到1的50个数字,均匀分布。添加[:, None, None]
会使此数组3D形状为(50, 1, 1)
。在(x - y) * c
中使用它时,由于x - y
为(50, 50, 3)
,因此最后2个维度会进行广播。 c被视为一个数组,我们称之为形状(50, 50, 3)
的d,这样对于范围(50)中的i,d[i, :, :]
是一个形状(50, 3)
的数组,其中填充了{{ 1}}。
所以渐变的第一行是c[i]
,这只是x[0, :, :] + c[0] * (x[0, :, :] - y[0, :, :])
第二行是x[0, :, :]
等。x[1, :, :] + c[1] * (x[1, :, :] - y[1, :, :])
行是i
和x[i]
的重心,系数y[i]
和1 - c[i]
您可以在c。
的定义中使用[None,:,None]进行逐列变化答案 1 :(得分:0)
感谢卡米列里(P. Camilleri)的出色回答。 我添加了一个列式变化示例,该示例使用给定的RGB值和生成大小为(HEIGHT_LIMIT,WIDTH_LIMIT)的Image。最后,我将其转换为可以保存的图像。
WIDTH_LIMIT = 3200
HEIGHT_LIMIT = 4800
def generate_grad_image(rgb_color=(100,120,140)): # Example value
x = np.ones((HEIGHT_LIMIT, WIDTH_LIMIT, 3))
x[:, :, 0:3] = rgb_color
y = np.ones((HEIGHT_LIMIT, WIDTH_LIMIT, 3))
y[:,:,0:3] = [min(40 + color, 255) for color in rgb_color]
c = np.linspace(0, 1, WIDTH_LIMIT)[None,:, None]
gradient = x + (y - x) * c
im = Image.fromarray(np.uint8(gradient))
return im