1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Python实现多张图片合成一张马赛克图片

Python实现多张图片合成一张马赛克图片

时间:2019-03-21 12:05:23

相关推荐

Python实现多张图片合成一张马赛克图片

前言

最近有网友私信我,问如何把多张图片合成一张马赛克图片的样子

说是女儿从出生到现在,所有的照片,大概有上百张,所以想使用这些照片合成一张,当做生日礼物

那我们今天就用上次爬表情包的图片来做一次马赛克图片,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实现多张图片合成一张马赛克图片的文章就介绍到这了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。