前言
今天利用昨天下载的表情包,那就用它们来拼一波马赛克图片,好了废话不多说,让我们愉快地开始吧~
开发工具
Python版本: 3.6.4
相关模块:
opencv-python模块;
numpy模块;
tqdm模块;
argparse模块;
以及一些python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理简介
原理其实很简单,先读取所有下载好的表情包图片(具体内容见公众号昨天发的推文):
并调整图像大小为指定的马赛克块大小,最后计算调整后的图片的颜色均值(RGB分开算):
'''读取所有源图片并计算对应的颜色平均值'''
def readSourceImages(sourcepath, blocksize):
print('Start to read source images')
sourceimages = []
avgcolors = []
for path in tqdm(glob.glob("{}/*.jpg".format(sourcepath))):
image = cv2.imread(path, cv2.IMREAD_COLOR)
if image.shape[-1] != 3:
continue
image = cv2.resize(image, (blocksize, blocksize))
avgcolor = np.sum(np.sum(image, axis=0), axis=0) / (blocksize * blocksize)
sourceimages.append(image)
avgcolors.append(avgcolor)
print('Finish reading source images')
return sourceimages, np.array(avgcolors)
接着,从左到右,从上到下遍历图像(每次截取马赛克块大小),原理类似这样:
然后为每个马赛克块寻找一个和其颜色最接近的表情包图片贴到对应的位置就ok啦,代码实现如下:
'''主函数'''
def main(args):
targetimage = cv2.imread(args.targetpath)
outputimage = np.zeros(targetimage.shape, np.uint8)
sourceimages, avgcolors = readSourceImages(args.sourcepath, args.blocksize)
print('Start to make photomosaic')
for i, j in tqdm(product(range(int(targetimage.shape[1]/args.blocksize)), range(int(targetimage.shape[0]/args.blocksize)))):
block = targetimage[j*args.blocksize: (j+1)*args.blocksize, i*args.blocksize: (i+1)*args.blocksize, :]
avgcolor = np.sum(np.sum(block, axis=0), axis=0) / (args.blocksize * args.blocksize)
distances = np.linalg.norm(avgcolor - avgcolors, axis=1)
idx = np.argmin(distances)
outputimage[j*args.blocksize: (j+1)*args.blocksize, i*args.blocksize: (i+1)*args.blocksize, :] = sourceimages[idx]
cv2.imwrite(args.outputpath, outputimage)
cv2.imshow('result', outputimage)
print('Finish making photomosaic, result saved in %s' % args.outputpath)
文章到这里就结束了,感谢你的观看,Python图像特效系列暂停更新,下个系列将分享Python自动玩小游戏。
为了感谢读者们,我想把我最近收藏的一些编程干货分享给大家,回馈每一个读者,希望能帮到你们。
干货主要有:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
All done~详见个人主页简介获取完整源代码。。