Java字符画生成器

本文介绍了一种新的ASCII艺术生成算法,通过灰度处理、直方图均衡化和彩色图处理,以解决早期ASCII艺术中字符集少、图像处理不足的问题,提升图像转换效果。
摘要由CSDN通过智能技术生成

效果

依次是原图、一般处理效果、直方图均衡化后效果
在这里插入图片描述
在这里插入图片描述

源码

虽然说是Java,但实际上是使用Kotlin写的。

https://github.com/FrankMilesFrms/AsciiArt

介绍

在计算机发展早期,由于网络通信不够发达,加上计算机终端对图形显示能力有限,当时人们使用简单字符来组合成图像成为一种风尚。随着技术进步,由此衍生出“颜文字”“字符画”等ASCII艺术,但是在生成算法时,因为选取字符集少、图像没处理等问题,使得效果不佳。本文以提出一种新的生成算法,通过灰度处理等多种算法处理图像,使得针对不同图像能有较好的处理效果。

实现思路

导入的图像有RGB三个通道,意味着每个像素点至少有3个代表颜色的数值,如果直接依据RGB对应不同的字符,则非常复杂,因为输出的图像不包含色彩,所以转化为黑白的程度就能大致对应图像。而不同的灰度对应的字符,则需要预先对字符进行选取,以便于使得每个字符尽可能缩小匹配灰度范围。如上文所展示一样

对于传入的图片进行预处理,一般图片的直方图能够充满整个色域,但是有的时候存在偏亮或者偏暗的图片,那时候再套用相同的算法,效果图可能就不那么理想,这里改进的方法是直方图均衡化,目的是让图片的直方图尽可能地平整(因为图片的像素点的亮度是离散的,无法做到真正的平整),覆盖尽量宽的亮度,从而提高图片的对比度。

当然,有时候有大块背景的简单图片,对图像进行直接翻译成字符画,反而容易弄巧成拙,使得背景变得斑驳,而且对于字符画,我们更加倾向于通过简化或改变图像的表示形式,使得图像更易于展示重点,使得更多符号有具体意义,忽略背景表达。因此使图像二值化显得尤为重要。

总之,先选取足够多的字符用于匹配灰度,对于整体偏暗的图像,我们需要进行图像直方图均衡化,对于一般人物图像或者想简化图像,可以对图像二值化。

字符集选用和预处理

以字符为载体,首要考虑的是对字符的选取。选取字符集后,再对输入的图像进行预处理。

字符集选用直接关乎到结果,因为字符画的特殊性,采用英文等宽字符就显得十分必要。所以选取Unicode中常用的英文字符及标点,量取他们应该的灰度。选取方法如下:
选用等宽字体,这里定义在同等条件下,固定面积为S下的图片中,设绘制字符集F中的字符i占的像素点数为f(i),则对应的像素集合为:

P={x∈F|f(x)}

算法实现思路:

字符的选取:
在这里插入图片描述

对于每个字符,先进行等条件绘制,并保存绘制后图像,以下是实现方法和输出结果:
在这里插入图片描述
在这里插入图片描述

对于每张图片,统计黑色点的数量,并记录对应字符,截取对应表展示如下:
在这里插入图片描述
在这里插入图片描述

由此,顺序按照灰度值输出,其结果如下
在这里插入图片描述
在这里插入图片描述

字符集对应灰度处理方法

因为图像处理后,图像表达的灰度范围在[0,255]区间内,由此得到灰度值为x的点所对应的字符公式:

G(x)=p(x/255*M),M=max⁡{P}

其中p(x)指的是与x最接近的像素值的字符。

其实现方法如下,首先是对灰度值等比例扩大:
在这里插入图片描述

对于查找最近值,使用二分法即可解决问题:
在这里插入图片描述

图像处理

灰度直方图均衡化

将原始图像的直方图变换成在整个灰度范围内均匀分布的形式。为此采用的步骤如下:
1) 统计每个像素值个数,并计算占总体比例,记录下本图像中的最大的像素值;
在这里插入图片描述

2) 一次从最小的像素值比例开始累加,例如:像素值1占比2%,像素值2占比3%,像素值3占比1%,依次累加后,分别为2%,5%,6%。这个过程也称为累计直方图统计;
在这里插入图片描述

3) 将统计好的累加比乘以最大像素值,而后将该值赋给原本的像素值。即上一条中的像素值2变换为“最大像素值乘以5%”,以此类推,各个像素值均通过该变化成为新像素值。

在这里插入图片描述

处理前后对比如下:

PS灰度处理后
在这里插入图片描述
直方图均衡化

在这里插入图片描述

彩图均衡化

处理前
在这里插入图片描述
处理后
在这里插入图片描述

OTSU二值化

在这里插入图片描述

尾声

本文章截取自项目说明文件,转载需注明出处。

最后,感谢Robert C. Martin指导我规范编写代码的格式。

  • 25
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值