[Python] 借助 Pillow 和 NumPy 生成与斐波那契数列有关的图案

背景

受到下图的启发(图片来源),我想到可以借助 Pillow\text{Pillow} Pillow 来生成类似的图案(为了降低难度,就不展示其中的圆周和数字了)。而这里又涉及矩阵的拼接操作,如果用 NumPy\text{NumPy} NumPy 来处理矩阵操作,会事半功倍。

最终的效果展示如下(我不确定上传的图片的分辨率是否会变低,我本地可以看到更清晰的效果)

在我本地,将图片放大后,可以看到有两个 11 1 像素的方块 ⬇️

正文

现在人工智能非常强大,即使有些细节没有想清楚,也可以让它们帮我们来进行完善。

核心逻辑

斐波那契数列的生成

斐波那契数列的生成比较直观,可以自己实现,然后让人工智能来优化,或者直接让人工智能来完成也行。(因为我觉得这部分逻辑属于"重要但简单"的那种,可以不必亲力亲为)

矩阵拼接

我们需要将不同大小的矩阵进行拼接,我在下图中标出了部分矩阵的边长 ⬇️

我们需要不断将新的矩阵拼接到现有矩阵的旁边(上下左右 里的某一侧)。如果不想自己查阅 api\text{api} api 的文档的话,可以借助人工智能。下图展示了我使用 trae 的过程 (完整的回答比较长,图里只截取了开头的部分)⬇️

像素处理

Pillow\text{Pillow} Pillow 的 Tutorial 中介绍了很多相关知识。trae 帮我优化代码后,使用了 fromarray 这个方法。(我自己写的代码里,用的是 Image.new 这个方法)

完整的代码

经过 trae 的优化,最终版本的完整代码如下 ⬇️

python 复制代码
import numpy as np
from PIL import Image

FIB_COUNT = 13
COLOR_CANDIDATES = ["r", "o", "y", "g", "b"]
COLOR_MAP = {
    "r": (255, 0, 0),  # red
    "o": (255, 165, 0),  # orange
    "y": (255, 255, 0),  # yellow
    "g": (0, 255, 0),  # green
    "b": (0, 0, 255),  # blue
}


def generate_fibonacci(count):
    result = [0] * count
    result[0] = 1
    if count > 1:
        result[1] = 1
        for i in range(2, count):
            result[i] = result[i - 1] + result[i - 2]
    return result


def build_board():
    board = None
    for index, fib in enumerate(generate_fibonacci(FIB_COUNT)):
        square = np.full(
            (fib, fib), COLOR_CANDIDATES[index % len(COLOR_CANDIDATES)]
        )
        if board is None:
            board = square
            continue
        if index % 4 == 1:
            board = np.concatenate((board, square), axis=1)
        elif index % 4 == 2:
            board = np.concatenate((square, board), axis=0)
        elif index % 4 == 3:
            board = np.concatenate((square, board), axis=1)
        else:
            board = np.concatenate((board, square), axis=0)
    return board


def board_image(board):
    height, width = board.shape
    rgb = np.zeros((height, width, 3), dtype=np.uint8)
    for code, color in COLOR_MAP.items():
        rgb[board == code] = color
    return Image.fromarray(rgb)


def main():
    board = build_board()
    img = board_image(board)
    img.show()
    img.save('fib.png')


if __name__ == "__main__":
    main()

请将以上代码保存为 main.py\text{main.py} main.py。使用如下的命令可以运行 main.py\text{main.py} main.py

bash 复制代码
python3 main.py

运行之后,您本地应该会生成一个名为 fib.png\text{fib.png} fib.png 的图片文件。

参考资料

相关推荐
YYYing.1 分钟前
【Python系列 (一) 】Python基础疑难杂症
开发语言·python
AINative软件工程5 分钟前
LLM 应用的 Observability 三件套:Metrics、Logs、Traces 的生产级接入工程实践
后端·python·架构
Summer-Bright24 分钟前
深度 | OpenAI 甩出 722 篇数学论文,但黎曼猜想并没有被证明
人工智能·数学·openai
JCHT1818181 小时前
源头厂家免拆维护:HT-6500H引领政企会议室革新
大数据·python
朝朝辞暮i9 小时前
VLA 系统学习第 4 课:一个 Batch 进入神经网络后,模型到底是怎么“学会”的?
人工智能·python·神经网络·vla
Ada's10 小时前
【计算机基础系列】003:Python数据结构
开发语言·数据结构·python
2601_9628857210 小时前
如何用 Python 计算 TRIX 三重指数平滑均线指标?
开发语言·python
还卿一钵无情泪11 小时前
Unsloth 微调 构建自己的大模型 没有GPU也能微调
linux·开发语言·人工智能·python·大模型·nlp·unsloth
蜗牛互联网13 小时前
Python消费Responses SSE事件:增量文本、超时与取消
java·开发语言·人工智能·后端·python
statistican_ABin13 小时前
中国国际旅游发展分析报告—基于世界银行国际旅游数据的多维度分析
python·机器学习·旅游