千图成像就是用很多张图片拼接成一张完整的图片,需要一张背景图像和一个图像库。根据背景图的结构用图像库中的图像进行拼接,最终形成新的拼接图像。
原理
将背景图像切割为若干小块,切割的越细生成的图像的效果越好,或者直接使用背景图像中的每个像素点;然后用图像库中与之最相近的图像拼接完成。
颜色相近
- 灰度图像
直接计算所有像素灰度值的平均值,取最接近N张图后供后期再次筛选。 - 彩色图像
分别计算R/G/B的平均值,对于一张图像得到的是一个类似于[20, 30, 40]的数组,然后计算欧式距离,取最接近n张图像供后期再次筛选。
结构相似
我们不能单纯的以为两张图像中包含的颜色差不多就判断为最相似,还需要判断颜色的“位置”是否相似。
- 提取图像的结构,颜色对结构的意义不大,所以直接将图像库中的所有图像转换为灰度图像。
- 将每张图像resize为(8,8),然后计算所有像素值的平均值。
- 将resize之后的图像中的每个像素点分别与平均值进行比较,高于或等于平均值的记为1,小于平均值的记为0,得到每张图像的一个长度为64类似于[0,1,1,0,1,0…,0,1,1]的编码。
- 对于背景图像中切割的小图像块,按顺序(如从左上角到右下角),也进行上述操作,然后分别图像库中每张图像的编码进行比较,相同位数最多的图像即为最像素的图像。
两张图像相似的感知哈希算法(Perceptual hash algorithm),它的作用是对每张图片生成一个“指纹”(fingerprint)字符串,然后比骄傲不同图片的指纹。结果越接近,就说明图片越相似。
感知哈希算法简单实现:
- 缩小尺寸
将图片缩小到8x8的尺寸,总共有64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片的差异。- 简化色彩
将缩小后的图片,转为64级灰度,即所有像素点总共有64种颜色。- 计算平均值
计算所有64个像素的平均灰度值。- 比骄傲像素的灰度
将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0.- 计算哈希值。
将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用了同样的次序就行。- 计算汉明距离
得到指纹后,就可以对比不同的图片,看64位中有多少位是不一样的。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。
参考资料
千图成像!祝可爱的小伙伴们圣诞快乐
【Python还能干嘛】爬取微信好友头像完成马赛克拼图(千图成像)~
相似图片搜索的原理
在线创意照片马赛克神器!(懒人图云)