画像素画

观察

先看了会大佬的像素作品(32*32),感觉像素画主要就是把关键特征保留下来。

动手

看了个b站的视频,感觉还不错,决定自己也动手临摹一下。

找了张图。

我临摹的

虽然很不甘心,但是我的美术功底好像确实也就到此为止了,实在是太丑了!

图片像素化

既然我自己画不行,那就只能让电脑来画了。

纯算法

个人还是喜欢用纯算法的方式解决问题(可解释性强)。

改进图像缩放

从本质上来说,图像缩放就是去除冗余像素的过程,但是却无法生成一幅赏心悦目的像素画。

其根本原因在于没有突出重要部位的颜色(色差不明显),而是一味的使用均值平滑缩放。

因此,可以先按照缩放比例,将原图像分块,再剔除块内的偏离值,最后取平均值映射到新图像的相应位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Every channel
for page in range(0, channel):
mean = np.mean(block[:, :, page])
std = np.std(block[:, :, page])

# 剔除2σ异常值
numMaxEdge = mean + 1 * std
numMinEdge = mean - 1 * std
usefulNum = []

for blockRow in range(0, pixelBlockHeight):
for blockCol in range(0, pixelBlockWidth):

# 如果在范围内,加入有效值数组内
if (block[blockRow, blockCol, page] <= numMaxEdge) and (block[blockRow, blockCol, page] >= numMinEdge):
usefulNum.append(block[blockRow, blockCol, page])

# print(len(usefulNum))
config.17研究像素画[blockNumRow, blockNumCol, page] = np.mean(usefulNum)

偏移量为2σ

偏移量为1σ

感觉还是缺了点味道,像素画的魅力还是在于强烈的色差(尽量少的颜色)。

Kmeans

考虑到像素化的诞生应该是先选色,于是准备用 Kmeans 聚类算法先将要用的颜色挑出来。

1
2
# 构造聚类器(基本都缺省)
estimator = KMeans(config.keamsNum, init='k-means++')

色卡

效果其实并不理想,因为这张图像的眼睛和头发的颜色很相近,因此如果不能将眼睛单独识别成一个颜色,那生成的图像必然是不合格的。

但是除非用 AI 识别脸部寻找眼睛,或者用脸部定义眼睛,不然几乎没有办法能单独分辨眼睛。

看似陷入了僵局,但其实还有两种办法。

  1. 让用户自己取色,数量不限。
  2. 改进 Kmeans 算法,增加边缘算子,如果不在同一区域内,则大幅提高像素的色距,从而避免将其分为一类。

自主取色

自主取色(不限数量),然后给每个像素判断离哪个颜色近,就用哪个替代(以下取色均为 8 种)。

BGR

由于 Opencv 默认是 BGR,不小心把 RGB 输进去了,所以色卡翻转了,不过意外的挺好看。

再通过之前改进的图像缩放,即可实现如下效果。

BGR64

RGB

RGB64

RGB色卡

缩放时采用最大池化

感觉和之前的平均池化差别并不是很明显,主要原因也是因为 64*64 太小了,不过这样可以保证选的颜色就是最终的颜色,不会被弱化掉。

改进 Kmeans

自定义初始点

想想其实也可能基于自定义的初始点去执行聚类算法。

色卡

基于上述选用的八色进行聚类,得到如上的色卡,基本上与之前的色卡差别不大。

增加边缘距离

试了用 Sobel 算子进行边缘检测。

Sobel算子

其实从这张图像中能看出不少的问题:

  1. 有些边缘会由于不明显而被隐去
  2. 有些地方有边缘但其实属于同一区域
  3. 边缘的权值
  4. 如何判断两点间是否连通(无边缘)

其实给 Kmeans 增加边缘距离的辅助判断,本质上是从一维距离到二维距离的升维(色彩空间与距离空间),目前并没有合适的思路去配比权值。

如果以后能找到相关论文再继续探索下去。

<2022.6.4> 多空间模式聚类

找了找相关论文,没什么太多的收获。个人感觉,如果单纯的用色彩欧几里得距离与空间欧几里得距离混合聚类的效果不会特别好。

因为其本质是为了分离那些虽然是同一个颜色,但其实不是一个物体的东西(比如头发和衣服)。

说到底,还是要加强边缘距离,但是又很难保证不同的图像被同一算子锐化后的特征大致相似(得先理解各个锐化算子的本质与区别)。

AI

找到了一个利用 AI 将图片像素化的网站 Pixelme

Pixelme网站生成的

效果还是很不错的,不过由于他会自动裁切出人物所在区域以及会剔除背景,所以可能还需要后期自己微调一下。

修改像素化图像

把像素化后的图像导入 Aseprite 后即可自主编辑。