当前位置:首页>python>用Python偷学梵高:30行代码复现大师笔触

用Python偷学梵高:30行代码复现大师笔触

  • 2026-10-11 08:35:45
用Python偷学梵高:30行代码复现大师笔触
    梵高是后印象派代表画家,其绘画风格以‌强烈鲜艳的色彩‌、‌粗犷动感的笔触‌及‌深刻的情感表达‌为核心特征 。他的作品突破了传统写实,强调主观感受的再现,对后世表现主义影响深远 。‌
下面是梵高经典的代表作之一《星空》
    笔触与线条:动态、扭曲、富有节奏感‌
‌    漩涡状与曲线笔触‌:夜空中的星云、星星和月亮均以‌旋转、流动的曲线‌描绘,形成强烈的动态感。X射线扫描显示,每平方厘米包含12–15道笔触,颜料层厚度达7毫米,使用猪鬃硬笔快速堆叠‌。两种线条交互‌:画面结合‌歪扭的长线‌(如柏树、山峦)与‌破碎的短线‌(如星点、云纹),营造出“眩目奇幻”的视觉效果‌。柏树如火焰‌:前景的柏树被夸张为‌黑色火舌状‌,直冲云端,既象征生命挣扎,也呼应日本浮世绘《神奈川冲浪里》中的波浪形态‌。‌
    色彩运用:表现性、高对比、情感化‌
‌主色调为钴蓝与黄橙‌:夜空以‌深蓝为主,星星、月亮用‌明黄形成强烈补色对比,增强视觉张力‌。非写实色彩‌:色彩并非再现自然,而是表达内心情绪——蓝色象征忧郁,黄色代表希望或神性,整体色调“单纯完整却隐含焦灼”‌。
    构图与空间:动静对比、高视点、变形夸张‌
‌动静对比‌:躁动的天空(漩涡、流动)与宁静的村庄(平直线条、方形灯光)形成戏剧性反差‌。高视点风景‌:借鉴老勃鲁盖尔及印象派手法,从高处俯瞰场景,但极度主观化‌。形象夸张变形‌:教堂尖塔被拉长至现实的3倍;月亮直径放大5倍;星星呈“光晕”或“火球”状,非真实天文现象‌。‌
    精神内涵:主观情感投射、宇宙哲思‌
    画面并非写生,而是梵高在精神崩溃后对宇宙的‌内心投射‌,体现“困惑、痛苦与矛盾的缠绕”‌。柏树连接大地与星空,象征‌生命与宇宙的联结‌;村庄虽静却“照不到光”,暗示其孤独与绝望‌。融合日本浮世绘构图、德拉克洛瓦的动感,以及个人对“神性”的理解(如引用雨果“上帝是月蚀中的灯塔”)‌。
    有人说,我想用豆包实现一下,那就给豆包一张内容图,再给它一张梵高的星空,然后附上相应的指令“请帮我把第一张图片的风格迁移到第二张图片上”,然后就能得到以下的效果图:
    看起来似乎不太行,是不是梵高绘画这么多的技巧,豆包AI学不会啊?Python能实现吗?事实告诉我们,Python中几十行代码轻松搞定!
    我们给梵高的星空图片进行学习,然后给一张内容的图片,其实就是让Python将绘画艺术风格进行迁移!运行Python代码后,我们就可以得到以下效果图:
部分代码如下:
# 加载图像
content = load_image("内容图.jpg", max_size=512)
style = load_image("艺术图.jpg", shape=content.shape[-2:])
# 初始化生成图像(使用内容图像作为起点)
generated = content.clone().requires_grad_(True)
# 初始化模型和优化器
model = VGG16().to(device)
optimizer = optim.LBFGS([generated])
# 获取特征
def get_features(image):
    features = model(image)
return [feature.detach() for feature in features]
content_features = get_features(content)
style_features = get_features(style)
# 计算风格特征的Gram矩阵
style_grams = [gram_matrix(feat) for feat in style_features]
print("开始进行绘画风格转化...")
step = [0]
while step[0] <= num3:
def closure():
# 梯度清零
optimizer.zero_grad()
# 获取生成图像的特征
generated_features = model(generated)
# 计算内容损失(conv4_3)
content_loss = torch.mean(
            (generated_features[3] - content_features[3]) ** 2)
# 计算风格损失
style_loss = 0
for gen_feat, style_gram in zip(generated_features, style_grams):
            gen_gram = gram_matrix(gen_feat)
            style_loss += torch.mean((gen_gram - style_gram) ** 2)
        style_loss /= len(style_grams)
# 总损失
total_loss = num2 * content_loss + num1 * style_loss
# 反向传播
total_loss.backward()
# 显示进度
if step[0] % show_every == 0 and step[0] <= num3 and step[0] != 0:
print(f"Step {step[0]}:")
print(f"Content Loss: {content_loss.item():.2f}")
print(f"Style Loss: {style_loss.item():.2f}")
print("-------------------")
# 保存中间结果
image = tensor_to_image(generated)
            image.save(f"第{step[0]}次转换的结果.jpg")
        step[0] += 1
return total_loss
    optimizer.step(closure)
final_image = tensor_to_image(generated)
final_image.save("最终转换结果.jpg")
如果想要艺术绘画风格迁移Python代码,在后台回复“绘画风格”即可获取!

最新文章

随机文章