前言
最近有网友私信我,问如何把多张图片合成一张马赛克图片的样子
说是女儿从出生到现在,所有的照片,大概有上百张,所以想使用这些照片合成一张,当做生日礼物
那我们今天就用上次爬表情包的图片来做一次马赛克图片,2万张合成一张,想想就很激动
图片素材
4K高清原图
开发环境
Python 3.6
Pycharm
实现代码
先导入所需模块
|
`import` `cv2``import` `glob``import` `argparse``import` `numpy as np``from` `tqdm` `import` `tqdm` `# 进度条``from` `itertools` `import` `product` `# 迭代器`
|
读取图片文件
|
`def` `parsArgs():``parser` `=` `argparse.ArgumentParser(``'拼接马赛克图片'``)``parser.add_argument(``'--targetpath'``,` `type``=``str``, default``=``'examples/3.jpg'``,` `help``=``'目标图像路径'``)``parser.add_argument(``'--outputpath'``,` `type``=``str``, default``=``'output.jpg'``,` `help``=``'输出图像的路径'``)``parser.add_argument(``'--sourcepath'``,` `type``=``str``, default``=``'sourceimages'``,` `help``=``'用来拼接图像的所有源图像文件路径'``)``parser.add_argument(``'--blocksize'``,` `type``=``int``, default``=``15``,` `help``=``'马赛克快的大小'``)``args` `=` `parser.parse_args()``return` `args`
|
读取所有源图片并计算对应颜色平均值
|
`def` `readSourceImages(sourcepath,blocksize):``print``(``'开始读取图像'``)`
合法图像列表
设置一个列表,存放符合要求的颜色图像
|
`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``(``'结束读取'``)``return` `sourceimages,np.array(avgcolors)`
|
主函数
|
`def` `main(args):``targetimage` `=` `cv2.imread(args.targetpath)``outputimage` `=` `np.zeros(targetimage.shape,np.uint8)` `# int8 int16 int32 int64``sourceimages,avgcolors` `=` `readSourceImages(args.sourcepath,args.blocksize)``print``(``'开始制作'``)``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``(``'制作完成'``)`
|
模块调用执行
| `if` `__name__` `=``=` `'__main__'``:``# run``main(parseArgs())`
|
完整效果
到此这篇关于Python实现多张图片合成一张马赛克图片的文章就介绍到这了