用Python生成NFT超像素风格头像
发布日期:2022/7/12 10:16:32 浏览量:
我们是三界外团队,聚焦 XR、3D 重建与生成技术,努力探索 Web3 mev 与 资产合成。
TLDR;
通读本文,你将具备用自己的 python 代码,将任意照片转化成超像素风格的图片。想直接拿来就跑的同学,可以留言获取~
像素NFT
近年NFT非常火热,即便币圈整体缩水,并未熄灭大家投入NFT的热情。传奇的一笔NFT交易,发生在 CryptoPunks(加密朋克),一共有一万枚,每一枚都是一张像素点组成的头像。CryptoPunk #3100是一个带着头带的外星人,大约一年前以767万美元的价格售出,后续被挂到接近1亿美金的报价(当时的 35000枚ETH)。
除了web3先驱加巨鳄们的参与,饶舌明星 Snoop Dogg 以及 Eminem 都是无聊猿 NFT 的持有者,在6月还为此创作了一首歌 ‘From The D 2 The LBC ’。
笔者的朋友 Allen 老师,也参加了社区的NFT发行,据透露最重要的投入就是设计师。于是,我向有没有一些简单的方法, 可以把任意一张照片,都做成超像素风头像。
像素化照片的方法,简易做法是采用马赛克方式,将图片切分为NxM的棋盘格,每个格子取像素的均值做填充。但成像效果上,在局部的连续性上不友好,比如银桑的眼睛、剑柄和DeadPool的剑柄。经过进一步的调研,找到了 SLIC (Simple Linear Iterative Clustering Superpixel_PAMI2011-2.pdf) 方法,是一种线性聚类的方法,能够将色度接近的邻近像素做聚合。下面简单对比了马赛克方式和 SLIC 的效果。(想要马赛克代码的同学,也可以关注后私信我~)
SLIC原理
超像素分割 SLIC 是一种迭代聚类算法。出自 PAMI2012 论文 SLIC Superpixels Compared to State-of-the-art Superpixel Methods。超像素概念出自于图像分割技术,是指有相似纹理、颜色、亮度的相邻的有视觉意义的不规则连续像素块。
通过图像局部近似性的描述,能够把图像的结构语义信息做一层提取。用少量的超像素代替大量的像素来做图片表征,降低后处理复杂度。经常被用在 CV 中的预处理环节,广泛用于分割、姿态估计、目标监测等场景。
slic 算法的逻辑,先看一下下图,不用被这么多的细节吓到。简单讲,就两部分:
- 局部 k-means,k-means 算法会遍历所有的像素点,但依托图像自身的语义相邻特点,我们每次只需要搜索聚类中心附近的像素块就够,能够较好的缩减计算量 ;
- 图像差异距离公式,这个公式需要同时能计算得到‘色彩距离’和’像素距离’;
局部k-means
kmeans 的逻辑,通过初始化 K 个类簇的中心点。遍历紧邻像素区块,计算每个像素 和 K个中心点的‘距离’,将最近的一个类簇关联到当前像素。
距离
‘距离’等于 ’空间距离’ +‘色彩距离’。空间距离,像素点在图片中本身就有 x、y 的空间概念,聚类中心同样以归属到当前类像素的 x、y 均值表示。这部分直接用欧式距离计算。色彩距离用 CIELab 色彩空间 l,a,b 表示,可以简单理解为与 RGB 一致,但优于 RGB 表示的一种色彩模式。更多 CIELab 的背景知识见附录。
因此,每个像素,以及聚类中心点,都将被表示成一个5维向量, CIELAB色彩空间的 l、a、b ,以及当前像素或聚类中心在图片的 x 和 y 空间位置。
直接按照欧氏距离计算,色彩偏差,与空间位置偏差,即
但,这样的计算方式,在图片过大、超像素宽度过小时,带来计算上偏向于色差或距离的问题。所以进一步需要做归一化。
其中 Ns = S,即超像素平均宽度,Nc 表示图片中最大色差 (通常设定一个经验值即可,如论文默认用 10,为了做出比较有风格化的图片,色差超参 Nc = m 可以调大,越大像素的融合效应越强)。进一步精简得到
SLIC实现
预处理
图片的读取,以及将 RGB 色彩空间转换到 LBA,skimage.color 提供了转换函数 rgb2lab,转换原理自行检索。
初始化
K 表示超级像素在当前图的个数,N 为当前图形的像素个数即 ’图片长 x 图片高‘,M 表示色度强弱表示对于图片聚类中心选择的权重,越大则影响越小。从风格化的角度看,K 越大,超级像素越多,则对应的结果越精细,M 越小则对应的图片越精细,反之亦然。超像素区块宽度 S~sqrt(N/K),可以通过像素点个数和 K 计算得到。
初始化,按照 S 步长宽度得到 S x S 大小的区块,并且指定区块中心的像素为中心点。并且将每个像素关联到的聚类标签初始化为 l(x,y) = -1, 到聚类中心的距离记为 d(x,y) = ∞ 。
距离函数
为了便于理解和实现,我们定义了 Pixel 类,是一个结构体,包含了一个像素 lba 色彩信息以及像素点 x、y 位置。Cluster 类实现了,聚类中心的更新,以及初始化位置优化调整 move3x3, move3x3 是为了防止当前选择的聚类中心落在了色差较大的轮廓边缘上。
SLIC过程
保存图片
requirements
pillow
skimage
numpy
matploblib
附录
不同于常用的 RGB 色彩空间,采用 CIELAB(国际照明委员会)色彩空间表示,LAB的特点在于比RGB更为平滑,对肉眼视觉的感官衡量更为贴近。弥补了 RGB 与 CMYK 两种彩色模式的不足,是Photoshop用来从一种色彩模式向另一种色彩模式转换时使用的一种内部色彩模式。LAB模式也是由三个通道组成,分别是 l,a,b,其中 I 代表亮度,数值范围为 [0, 100],a 表示从绿色到红色的分量,数值范围为[-128, 127],b 表示蓝色到黄色的分量,数值范围为 [-128, 127]。
马上咨询: 如果您有业务方面的问题或者需求,欢迎您咨询!我们带来的不仅仅是技术,还有行业经验积累。
QQ: 39764417/308460098 Phone: 13 9800 1 9844 / 135 6887 9550 联系人:石先生/雷先生