前言
偶然看到营销号视频利用ps实现马赛克效果的图片,利用大量胡歌的图片实现出一张胡歌的照片,效果如下
因最近在了解图片相关的技术,仔细分析了一下,将图片切割成n多个小图片,然后再去找和这些小图片相似的贴进去,这样不就成了吗?理论存在,实践开始~
分析过程
一张图片要变成马赛克照片,实际上就是将图片切割成n份,每一份的去搜索相似的图片颜色相近,结构相近的,然后替换即可,以下我利用超级偶像张国荣来演示
当图片分隔到一定小的情况下,我们只需要取颜色相同,结构大概的图片去替换掉那一小块图片即可
颜色值相近算法有 颜色直方图``rgb均值
等,结构相同的有 orb``ahash``dhash
等 (算法来自google搜索)
尝试一遍 过后,直方图对比速度较慢,orb对于一些小的结构变化不大的图片无法对比
所以目前选用了 rbg均值``ahash
,选用ahash
也是因为他速度快
rgb均值算法
np.array([
np.mean(piece[:, :, 0]),
np.mean(piece[:, :, 1]),
np.mean(piece[:, :, 2])
])
复制代码
ahash
img = Image.open(file).convert('RGB').resize((mini_image_w, mini_image_h),Image.ANTIALIAS)
image = np.array(img.convert('L').resize((8, 8), Image.ANTIALIAS))
width, height = image.shape
avg = image.mean()
return np.array([1 if image[i, j] > avg else 0 for i in range(width) for j in range(height)])
复制代码
为什么要选用两种算法?是因为提供准确率,利用rbg均值 取出色值最相同的n张图片,然后再利用 ahash
取出最相同的一张,这样大大提高的图片相似度
实现过程
千图成像实现过程需要大量的背景图片,这可难不到python,爬虫学得好~ 牢饭吃到饱
以下提供爬取豆瓣张国荣图片的代码,仅供学习参考
利用xpath和request 爬取照片
# -*- utf-8 -*-
import requests
from lxml import etree
url = "https://movie.douban.com/celebrity/1003494/photos/?type=C&start=%s&sortby=like&size=a&subtype=a"
headers = {
'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1',
'referer':'https://movie.douban.com/celebrity/1003494/photos/?type=C&start=30&sortby=like&size=a&subtype=a'
}
for i in range(20):
print('第%d页' % i)
html = etree.HTML(requests.get(url % (i * 30), headers=headers).content.decode())
img_links = html.xpath('//*[@class="cover"]/a/img/@src')
for img_link in img_links:
body = requests.get(img_link, headers=headers).content
with open('./bg-1/' + img_link.split('/')[-1].split('.')[0] + '.jpg', 'wb') as f:
f.write(body)
复制代码
图片合成代码
1.首先将背景图的平均色值和hash值都利用字段保存好,方便接下来更快的的计算
2.将图片切换成小图片进行
3.获取每一小块里面最相同的图片贴进去
实现效果
代码传送门
合成代码已经上传github,开箱即用,如果可以顺便点个star
如有问题请联系:1105504520@qq.com
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END