前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >隐藏在【python】代码中的诗意 -- 利用字符复现照片

隐藏在【python】代码中的诗意 -- 利用字符复现照片

作者头像
万事可爱^
发布2025-01-23 19:06:39
发布2025-01-23 19:06:39
6700
代码可运行
举报
运行总次数:0
代码可运行

大家好,今天我们要一起探索如何利用 Python 复现一张照片,给它加上一点“艺术感”。你可能会觉得“照片转字符画?这应该会很难吧。”放心!看完下面的内容你会觉的其实不过如此。

我们将利用 Python 的一些基本库和技巧,将照片转换成字符画——这些字符看起来像图像的像素,通过巧妙地排列组合,就能“复原”原图了,接下来让我看看它到底是怎么实现的。

接下来的事情我将用大名鼎鼎的lena图像来作为演示,图片我放在下面了,有需要的可以自取。

第一章:准备工作

安装必要的库

首先,咱们得准备一些工具。你不可能用手工工具来做这件事,是吧?所以我们需要安装几个 Python 库。打开命令行或者终端,输入以下命令安装:

代码语言:javascript
代码运行次数:0
复制
pip install pillow numpy
  • Pillow:这是一个非常常用的图像处理库,它能帮助我们读取和操作图片。
  • NumPy:它是一个强大的科学计算库,用来处理数组和矩阵,在我们的字符画转换中很有用。

安装完这些库后,咱们就可以开始我们的“绘画”之路了。

第二章:加载照片

好了,工具准备完毕。接下来,我们需要导入必要的库,并加载我们的照片。

代码语言:javascript
代码运行次数:0
复制
from PIL import Image
import numpy as np

# 加载照片
image_path = 'lena.png'  # 替换成你的图片路径
img = Image.open(image_path)

这里面的文件路径可以用绝对路径(直接复制图片路径),也可以像上面一样使用相对路径(上面的相对路径是因为和脚本在同一个文件夹下,所以较为简便)。

当然你也可以随便找一张自己喜欢的照片,不管是风景照还是自拍照,都会变得有趣。

在进行转换之前,最好先看看我们原始的图片:

代码语言:javascript
代码运行次数:0
复制
img.show()

这行代码会弹出一个窗口显示你的图片,确保它被正确加载。

第三章:将图片转换为灰度

这一步非常关键。字符画没有颜色,只有亮度的变化。因此,我们需要将图片转换为灰度图。灰度图的每个像素都会有一个亮度值,表示它从黑到白的程度。

代码语言:javascript
代码运行次数:0
复制
# 转换为灰度图
pixels = np.array(img.convert('L'))
pixels.show()

你会看到一张黑白照片,它的色彩已经被“剥离”了,但其实它包含了足够的信息来转换成字符画。 好的,接下来我们继续!进入“魔法”阶段了,这是整个过程最有趣的部分,如何将灰度图转换成字符画,让我们的小照片变得生动有趣。


第四章:将灰度值映射为字符

现在我们已经有了灰度图,每个像素的亮度值都在 0(黑色)到 255(白色)之间。那么,如何将这些灰度值映射成不同的字符呢?别着急,我们来一个简单的映射:我们可以用一些字符的密度来代表不同的灰度值。

例如:

  • 空格(' ')表示最亮的部分(白色)
  • 点('.')表示稍微暗一点的区域
  • 字母('@')和其他字符则代表越来越暗的区域(接近黑色)

我们为每个灰度值选一个字符,越亮的区域使用空格,越暗的区域则用更密集的字符。

定义字符集

我们定义一个字符集,按照亮度从最亮到最暗排列,来映射灰度值:

代码语言:javascript
代码运行次数:0
复制
# 选择字符集,这些字符从空白到最密集
chars = ['@', '#', '8', '&', '%', '$', '*', '+', '=', '-', ':', '.', ' ']

接着,我们可以根据图片来调整图像的大小,并且进行图像的灰度化处理,将彩色图处理成灰度图,接着根据每个像素的灰度值,决定它应该用哪个字符,我们可以根据灰度值的范围来进行映射。

当然如果你觉得这幅字符画非常有艺术感,你可以将它保存成文本文件,方便日后查看或分享。

下面是完整代码。

代码语言:javascript
代码运行次数:0
复制
from PIL import Image

if __name__ == '__main__':
    image_file = 'lena.png'
    height = 100

    img = Image.open(image_file)
    img_width, img_height = img.size
    width = int(2.1 * height * img_width // img_height)
    img = img.resize((width, height), Image.Resampling.LANCZOS)
    pixels = np.array(img.convert('L'))
    print('type(pixels) = ', type(pixels))
    print(pixels.shape)
    print(pixels)
    chars = '@, #, 8, &, %, $, *, +, =, -, :, .,  '
    N = len(chars)
    step = 1000 // N
    print(N)
    result = ''
    for i in range(height):
        for j in range(width):
            result += chars[pixels[i][j] // step]
        result += '\n'
    with open('lena.txt', mode='w') as f:
        f.write(result)

如果你觉得这幅字符画非常有艺术感(当然,肯定有),你可以将它保存成文本文件,方便日后查看或分享。

最后的结果如下图所示

第七章:小小总结

恭喜你!通过这篇简单的教程,你已经学会了如何使用 Python 将照片转化为有趣的字符画了!是不是很酷?你不仅学到了图像处理的基础知识,还学会了如何将数字世界的图像“转化”为另一种艺术形式。

当然,这个字符画转换不仅仅适用于照片,你还可以试试将任何你喜欢的图片转换成字符画,或者用它来制作一些有趣的项目,展示给朋友们。

结语:让我们一起变得更加诗意

通过这个简单的教程,你发现了 Python 的一些基础应用:图像处理、灰度值映射、字符画生成等。更重要的是,你领略了如何将这些技术融入到日常的有趣项目中。以后你也可以利用这些方法来创造更多与众不同的作品哦!

希望你通过这篇博客能够得到一些启发,让你的编程之路更加精彩。如果你对字符画或者其他有趣的 Python 项目有兴趣,欢迎在评论区分享你的想法或提问,我们一起讨论进步!

这么有诗意的事情你确定不点个赞再走嘛QAQ!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一章:准备工作
    • 安装必要的库
  • 第二章:加载照片
  • 第三章:将图片转换为灰度
  • 第四章:将灰度值映射为字符
    • 定义字符集
  • 第七章:小小总结
  • 结语:让我们一起变得更加诗意
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档