当前位置: 首页 > 后端技术 > Python

将数万张图片组合成一张图片,制作出超棒的马赛克图片!

时间:2023-03-26 01:56:40 Python

说明:制作一张马赛克图片,合成几万张图片,每张马赛克格子大小为15x15。完整源码在文末讲解,有需要的可以下载。【阅读全文】看一下生成马赛克图的效果:需要用到的python模块包如下:importcv2#pipinstallopencv-python#图像处理库importglob#导入文件处理库importargparse#命令行解析库importnumpyasnp#数据处理库fromtqdmimporttqdm#导入进度条库fromitertoolsimportproduct#导入迭代器库importlogging#导入日志库设置logging模块日志打印。logging.basicConfig(level=logging.INFO,format='%(asctime)s-%(name)s-%(levelname)s-%(message)s')logger=logging.getLogger("PictureComposer")记录器.setLevel(logging.DEBUG)编写函数read_source_images()提取满足图像颜色要求的图像对象,并计算平均值。defread_source_images(source_images_path,block_size):'''提取满足图像颜色要求的图像对象并计算平均值:paramsource_images_path:源图像路径:paramblock_size:每个图像的大小:return:满足要求的图像对象数组,colorAveragevaluearray'''logger.info("开始源图像过滤和颜色平均计算处理")source_images=[]#初始化源图像列表avg_colors=[]#平均颜色列表'''使用进度条来遍历源图片文件夹'''forimage_pathintqdm(glob.glob("{}/*.jpg".format(source_images_path))):try:#这里添加异常处理,如果有异常图片则跳过图像处理#读取彩色图像img_obj=cv2.imread(image_path,cv2.IMREAD_COLOR)'''img_obj.shape[-1]读取图像的通道数,通道值为3表示颜色值范围每个像素(0-255、0-255、0-255)。跳过通道值不等于3的图像。'''ifimg_obj.shape[-1]!=3:continue#调整图像大小img_obj=cv2.resize(img_obj,(block_size,block_size))#计算图像的平均颜色avg_color=np.sum(np.sum(img_obj,axis=0),axis=0)/(block_size*block_size)#将满足要求的图像对象添加到数组中source_images.append(img_obj)#将满足要求的图像的平均颜色添加到arrayInavg_colors.append(avg_color)except:logger.error("图像路径异常:"+image_path)logger.info("结束源图像过滤和颜色平均计算处理")returnsource_images,np.array(avg_colors)writeparse_args()函数,用于解析文件相关的参数。后面需要获取参数时,可以直接从参数解析器中提取使用。defparse_args():'''参数解析函数:return:'''logger.info("开始文件参数解析")parser=argparse.ArgumentParser('imagefileparameterparser')#添加目标图片路径解析器。add_argument('--targetpath',type=str,default='target.jpg',help='目标图片路径')#添加输出图片路径parser.add_argument('--outputpath',type=str,default='output.jpg',help='输出图像的路径')#源图像文件路径parser.add_argument('--sourcepath',type=str,default='source_images',help='源图像文件夹路径')#The每个需要转换的图像的目标大小parser.add_argument('--blocksize',type=int,default=15,help='每个图像的目标大小')#解析参数并返回args=parser.parse_args()logger.info("Endfileparameterparsing")returnargs编写main_merage()函数,用于实现马赛克图像的形式化合成。defmain_merage(params):'''图像合成处理函数:paramparams:fileparameters:return:'''#获取目标图像对象,默认以彩色读取target_image_obj=cv2.imread(params.targetpath)#根据目标Image对象,生成对应的零矩阵output_image_obj=np.zeros(target_image_obj.shape,np.uint8)#得到满足要求的源图像数组和平均颜色数组source_images,avg_colors=read_source_images(params.sourcepath,params.blocksize)#根据目标图像的长宽执行遍历'''target_image_obj.shape[1],target_image_obj.shape[0]得到图像的长宽'''logger.info("开始图像合成处理")fori,jintqdm(product(range(int(target_image_obj.shape[1]/params.blocksize)),range(int(target_image_obj.shape[0]/params.blocksize)))):block=target_image_obj[j*params.blocksize:(j+1)*params.blocksize,i*params.blocksize:(i+1)*params.blocksize,:]avg_color=np.sum(np.sum(block,axis=0),axis=0)/(params.blocksize*params.blocksize)distances=np.linalg.norm(avg_color-avg_colors,axis=1)idx=np.argmin(distances)output_image_obj[j*params.blocksize:(j+1)*params.blocksize,i*params.blocksize:(i+1)*params.blocksize,:]=\source_images[idx]cv2.imwrite(params.outputpath,output_image_obj)cv2.imshow('输出生成的图片',output_image_obj)logger.info("结束图片合成处理")使用上一篇文章提到的百度图片下载器下载如果我们需要的源图片没有下载,到公众号回复“百度图片下载器”即可下载。你准备的源图片越多越好。我直接准备了两万张美女图片作为源图。如果您想让生成的图像更逼真,请下载更多源图像。【优秀往期】小工具批量mp3音频格式转wav格式不用H5,直接用pywebio模块实现网页的python回调函数可以做什么?解决pyinstaller打包过程中无法加载外部资源的问题...pyqt5做了一个二维码生成器,已经打包成exe可执行程序...