Python|用Python生成NFT超像素风格头像

【Python|用Python生成NFT超像素风格头像】Python|用Python生成NFT超像素风格头像

文章图片

Python|用Python生成NFT超像素风格头像

文章图片

Python|用Python生成NFT超像素风格头像

文章图片

Python|用Python生成NFT超像素风格头像

文章图片


我们是三界外团队 , 聚焦 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) 方法 , 是一种线性聚类的方法 , 能够将色度接近的邻近像素做聚合 。 下面简单对比了马赛克方式和 SLIC 的效果 。 (想要马赛克代码的同学 , 也可以关注后私信我~)

SLIC原理超像素分割 SLIC 是一种迭代聚类算法 。 出自 PAMI2012 论文 SLIC Superpixels Compared to State-of-the-art Superpixel Methods 。 超像素概念出自于图像分割技术 , 是指有相似纹理、颜色、亮度的相邻的有视觉意义的不规则连续像素块 。

通过图像局部近似性的描述 , 能够把图像的结构语义信息做一层提取 。 用少量的超像素代替大量的像素来做图片表征 , 降低后处理复杂度 。 经常被用在 CV 中的预处理环节 , 广泛用于分割、姿态估计、目标监测等场景 。
slic 算法的逻辑 , 先看一下下图 , 不用被这么多的细节吓到 。 简单讲 , 就两部分:
1)局部 k-means , k-means 算法会遍历所有的像素点 , 但依托图像自身的语义相邻特点 , 我们每次只需要搜索聚类中心附近的像素块就够 , 能够较好的缩减计算量 ;
2) 图像差异距离公式 , 这个公式需要同时能计算得到‘色彩距离’和’像素距离’;

  局部k-meanskmeans 的逻辑 , 通过初始化 K 个类簇的中心点 。 遍历紧邻像素区块 , 计算每个像素 和 K个中心点的‘距离’ , 将最近的一个类簇关联到当前像素 。
距离‘距离’等于  ’空间距离’ +‘色彩距离’ 。 空间距离 , 像素点在图片中本身就有 x、y 的空间概念 , 聚类中心同样以归属到当前类像素的 x、y 均值表示 。 这部分直接用欧式距离计算 。 色彩距离用 CIELab 色彩空间l , a , b表示 , 可以简单理解为与 RGB 一致 , 但优于 RGB 表示的一种色彩模式 。 更多 CIELab 的背景知识见附录 。