您的位置:

用Python画梵高星空

梵高星空是荷兰画家梵高于1889年在法国圣雷米制作的一幅油画。这幅画展现了夜晚的天空,拥有引人入胜的细节和丰富的色彩。在这篇文章中,我们将介绍如何使用Python绘制梵高星空。

一、安装必备库

要用Python画梵高星空,需要安装一些必备的库,包括matplotlib、numpy和Pillow。matplotlib和numpy是Python中重要的科学计算和绘图库,而Pillow是Python中常用的图像处理库。

!pip install matplotlib
!pip install numpy
!pip install Pillow

二、准备数据

在开始绘制之前,我们需要准备作为数据的星空图像。我们可以从Google等搜索引擎中获取梵高星空的图像,然后使用Pillow库将其读入。对于这个指南,我已经准备好了一个名为“starry_night.jpg”的图像文件。

from PIL import Image
import numpy as np

# 读取图像
img = Image.open('starry_night.jpg')

# 将图像转换为numpy数组
arr = np.array(img)

三、绘制星空

绘制星空的代码分为4个步骤,即准备画布、绘制背景、绘制星星和显示结果。在这里,我们使用matplotlib库来完成这些步骤。

准备画布

我们首先创建一个图形对象,并添加一个子绘图区,以便在其中绘制星空。我们还将设置子绘图区的大小,使其与原始图像的分辨率相同。

import matplotlib.pyplot as plt

# 创建图形对象和子绘图区
fig, ax = plt.subplots(figsize=arr.shape[:2][::-1]/100, 
                       dpi=100)

# 将子绘图区设置为黑色背景
ax.set_facecolor('black')

绘制背景

我们使用imshow()函数将原始图像绘制到子绘图区的背景中。如果图像的颜色太亮太亮,可以使用set_distance()函数调整它们的属性。

# 将原始图像绘制为背景图像
ax.imshow(arr)

# 调整亮度和对比度
ax.set_adjustable('datalim')
ax.set_aspect('equal')
ax.margins(0, 0)

绘制星星

为了绘制星星,我们需要在画布上生成一些点,每个点都设置为随机位置和颜色。我们还可以调整这些点的大小和数量,以实现所需的视觉效果。在代码中,我们使用numpy库中的random函数生成随机点,然后使用matplotlib中的scatter函数将它们绘制到画布上。

# 生成随机点
num_stars = 1000
size_range = (5, 10)
colors = ['#8d9db6', '#ffe262', '#ff7473', '#fe8a71']

x = np.random.randint(0, arr.shape[1], num_stars)
y = np.random.randint(0, arr.shape[0], num_stars)
s = np.random.randint(*size_range, num_stars)
c = np.random.choice(colors, num_stars)

# 在画布上绘制星星
ax.scatter(x, y, s=s, c=c)

显示结果

最后,我们可以使用show()函数显示绘制后的结果。

# 显示结果
plt.show()

四、完成结果

在完成了所有这些步骤后,我们现在就可以得到一张令人印象深刻的梵高星空图像。关于完整的代码,请看下面:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
img = Image.open('starry_night.jpg')

# 将图像转换为numpy数组
arr = np.array(img)

# 创建图形对象和子绘图区
fig, ax = plt.subplots(figsize=arr.shape[:2][::-1]/100, 
                       dpi=100)

# 将子绘图区设置为黑色背景
ax.set_facecolor('black')

# 将原始图像绘制为背景图像
ax.imshow(arr)

# 调整亮度和对比度
ax.set_adjustable('datalim')
ax.set_aspect('equal')
ax.margins(0, 0)

# 生成随机点
num_stars = 1000
size_range = (5, 10)
colors = ['#8d9db6', '#ffe262', '#ff7473', '#fe8a71']

x = np.random.randint(0, arr.shape[1], num_stars)
y = np.random.randint(0, arr.shape[0], num_stars)
s = np.random.randint(*size_range, num_stars)
c = np.random.choice(colors, num_stars)

# 在画布上绘制星星
ax.scatter(x, y, s=s, c=c)

# 显示结果
plt.show()