在Python中将图像转换为ASCII字符照

1. 引言

使用Python进行图像处理,非常快捷方便,往往简短几行代码就可以实现功能强大的效果。在这篇文章中,我们将使用Python来将图像转换为ASCII字符照,如下所示:

在Python中将图像转换为ASCII字符照

别说闲话了,我们开始吧。

[En]

Cut the gossip and let’s get started.

2. ASCII字符映射表

首先,我们将创建一个包含所有ASCII字符的字符串,这些字符将用于生成ASCII字符照片。如下:

ascii_characters_by_surface = "^\",:;Il!i~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$"
</code></pre>
<p>上述字符按照显示时单个字符所占用的空间进行排序,比如字​ <code>​'​</code>​显示时占有最小的空间,而字符​ <code>​$​</code>​占用的空间最大。</p>
<h2>3. 计算单个像素亮度</h2>
<p>我们知道,彩色图像中的单个像素可以表示成一个三元组,其中每个元素取值都介于0和255之间,分别表示红色,绿色和蓝色的值。这些值越高,表示相应通道的亮度越大。例如,白色像素的三元组表示为​ <code>​(255,255,2555)​</code>​。</p>
<p>这也意味着我们可以得到的单个像素点出亮度的最大值将是765,即​ <code>​(255,255,255)​</code>​。代码表示如下:</p>
<pre><code>(r, g, b) = pixelpixel_brightness = r + g + bmax_brightness = 255 * 3
</code></pre>
<h2>4. 将像素转换为ASCII字符</h2>
<p>接着我们可以将像素转换为ASCII字符。</p>
<p>首先,我们需要计算亮度权重。为了将亮度权重定义为ASCII字符列表的长度除以最大亮度值,如下:</p>
<pre><code>brightness_weight = len(ascii_characters_by_surface) / max_brightness
</code></pre>
<p>之后,对于给定的像素,我们可以从ASCII字符列表中找到其对应的索引,如下所示:</p>
<pre><code>index = int(pixel_brightness * brightness_weight) - 1
</code></pre>
<p>最后,通过返回与该索引对应的字符,我们可以将单个像素转换为字符:<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>Finally, we can convert a single pixel to a character by returning the character corresponding to this index:</font></em></details></p>
<pre><code>return ascii_characters_by_surface[index]
</code></pre>
<h2>5. 转换图像</h2>
<p>接着,我们将使用​ <code>​Pillow ​</code>​模块来加载一张图像,读取其所有像素,并将其转换为元组​ <code>​(r,g,b)​</code>​的形式。</p>
<p>首先,我们需要导入模块并读取图像:<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>First, we need to import the module and read the image:</font></em></details></p>
<pre><code>from PIL import Imageimage = Image.open('image.jpg')(width, height) = image.size
</code></pre>
<p>之后,我们将遍历所有像素并逐个读取:<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>After that, we will traverse all the pixels and read them one by one:</font></em></details></p>
<pre><code>for y in range(0, height - 1):    for x in range(0, width - 1):        px = image.getpixel((x, y))
</code></pre>
<p>我们将这些读取到的每个像素通过映射得到其相应的ASCII字符,并为图像的每一行创建一个输出字符串:</p>
<pre><code>ascii_art = []for y in range(0, height - 1):    line = ''    for x in range(0, width - 1):        px = image.getpixel((x, y))        line += convert_pixel_to_character(px)    ascii_art.append(line)
</code></pre>
<h2>6. 结果输出</h2>
<p>最后,我们将结果写入输出文本文件:<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>Finally, we write the result to the output text file:</font></em></details></p>
<pre><code>def save_as_text(ascii_art):    with open("image.txt", "w") as file:        for line in ascii_art:            file.write(line)            file.write('\n')        file.close()
</code></pre>
<h2>7. 主函数调用</h2>
<p>最后,我们按如下方式编写调用程序:<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>Finally, we write the calling program as follows:</font></em></details></p>
<pre><code>from PIL import Imageascii_characters_by_surface = "^\",:;Il!i~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$"def main():    image = Image.open('image.jpg')    # you can first resize the image if needed    # image = image.resize((width, height))    ascii_art = convert_to_ascii_art(image)    save_as_text(ascii_art)if __name__ == '__main__':    main()

8. 输出结果

我们将所有输出写入一个文本文件,因此我们在文本编辑器中打开生成的文件并缩小以查看最终效果,如下所示:

[En]

We will write all the output to a text file, so we open the generated file in a text editor and zoom out to see our final effect, as follows:

在Python中将图像转换为ASCII字符照

9. 总结

本文重点介绍了如何使用Python来一步一步的实现将图像转化为ASCII字符照,并给出了完整的代码实现。

您学废了嘛?

在Python中将图像转换为ASCII字符照

关注上述公众号,后台回复&#x200B;<em>ascii</em>&#x200B;​即可获取完整代码

Original: https://blog.51cto.com/u_15506603/5541967
Author: sgzqc
Title: 在Python中将图像转换为ASCII字符照

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/504495/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球