大家好,今天我们要一起探索如何利用 Python 复现一张照片,给它加上一点“艺术感”。你可能会觉得“照片转字符画?这应该会很难吧。”放心!看完下面的内容你会觉的其实不过如此。
我们将利用 Python 的一些基本库和技巧,将照片转换成字符画——这些字符看起来像图像的像素,通过巧妙地排列组合,就能“复原”原图了,接下来让我看看它到底是怎么实现的。
接下来的事情我将用大名鼎鼎的lena图像来作为演示,图片我放在下面了,有需要的可以自取。
首先,咱们得准备一些工具。你不可能用手工工具来做这件事,是吧?所以我们需要安装几个 Python 库。打开命令行或者终端,输入以下命令安装:
pip install pillow numpy
安装完这些库后,咱们就可以开始我们的“绘画”之路了。
好了,工具准备完毕。接下来,我们需要导入必要的库,并加载我们的照片。
from PIL import Image
import numpy as np
# 加载照片
image_path = 'lena.png' # 替换成你的图片路径
img = Image.open(image_path)
这里面的文件路径可以用绝对路径(直接复制图片路径),也可以像上面一样使用相对路径(上面的相对路径是因为和脚本在同一个文件夹下,所以较为简便)。
当然你也可以随便找一张自己喜欢的照片,不管是风景照还是自拍照,都会变得有趣。
在进行转换之前,最好先看看我们原始的图片:
img.show()
这行代码会弹出一个窗口显示你的图片,确保它被正确加载。
这一步非常关键。字符画没有颜色,只有亮度的变化。因此,我们需要将图片转换为灰度图。灰度图的每个像素都会有一个亮度值,表示它从黑到白的程度。
# 转换为灰度图
pixels = np.array(img.convert('L'))
pixels.show()
你会看到一张黑白照片,它的色彩已经被“剥离”了,但其实它包含了足够的信息来转换成字符画。 好的,接下来我们继续!进入“魔法”阶段了,这是整个过程最有趣的部分,如何将灰度图转换成字符画,让我们的小照片变得生动有趣。
现在我们已经有了灰度图,每个像素的亮度值都在 0(黑色)到 255(白色)之间。那么,如何将这些灰度值映射成不同的字符呢?别着急,我们来一个简单的映射:我们可以用一些字符的密度来代表不同的灰度值。
例如:
' '
)表示最亮的部分(白色)'.'
)表示稍微暗一点的区域'@'
)和其他字符则代表越来越暗的区域(接近黑色)我们为每个灰度值选一个字符,越亮的区域使用空格,越暗的区域则用更密集的字符。
我们定义一个字符集,按照亮度从最亮到最暗排列,来映射灰度值:
# 选择字符集,这些字符从空白到最密集
chars = ['@', '#', '8', '&', '%', '$', '*', '+', '=', '-', ':', '.', ' ']
接着,我们可以根据图片来调整图像的大小,并且进行图像的灰度化处理,将彩色图处理成灰度图,接着根据每个像素的灰度值,决定它应该用哪个字符,我们可以根据灰度值的范围来进行映射。
当然如果你觉得这幅字符画非常有艺术感,你可以将它保存成文本文件,方便日后查看或分享。
下面是完整代码。
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!