使用numpy生成彩色图像渐变

Boa*_*Boa 5 python arrays numpy python-2.7

我写了一个生成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)
Run Code Online (Sandbox Code Playgroud)

然后,我想将这两种颜色组合起来以形成渐变,即1种图像从一种颜色变为另一种颜色。我不确定如何继续,有什么建议吗?使用np.linspace()我可以形成一维步骤数组,但是那又是什么呢?

P. *_*eri 6

这是你想要的 ?

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
Run Code Online (Sandbox Code Playgroud)

np.linspace按照您的建议使用,我使用了广播,它是numpy中非常强大的工具。在这里阅读更多。

c = np.linspace(0, 1, 50)创建一个形状数组,(50,)其中包含50个从0到1的数字,它们之间的间距均匀。加法[:, None, None]使该数组3D形状为shape (50, 1, 1)。在中使用时(x - y) * c(由于x - y为)(50, 50, 3),最后2个维度都会进行广播。c被视为形状的数组,我们将其称为shape的d (50, 50, 3),这样对于range(50)中的i,d[i, :, :]是一个(50, 3)填充有的形状的数组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[i]

在此处输入图片说明

您可以使用c的定义中的[None,:,None]进行列式变化。