✨✨✨使用PythonOpenCV及图片拼接生成❤️LOVE❤️字样图每张小图加随机颜色边框大图加随机大小随机颜色边框1. 效果图2. 原理3. 源代码参考今天女神节只要开心与充盈每一天都过节上周在省图借了几本杂志看到了LOVE字样的拼图灵光闪现想要代码实现。许久没有更文了今天本来打算去朱雀国家森林公园天气不太好。没出门那就写博客吧。1. 效果图用了我很喜欢的恽寿平的蔬果花鸟册里的图他的无骨画法逼真又好看惟妙惟肖。为了让整个屏幕能放下做了缩放。加入随机洗牌算法每个字母都随机选取图进行生成效果图如下用完之前的跳绳图生成一个效果图看下使用跑图5.21 利用蒙太奇进行拼图效果还是恽寿平的花鸟图效果更好一些设置的像素大小对最初读取的有影响优化给每张图四周随机加颜色边框使得拼接图更好看一些超参数 boarderFlag 默认Flase可修改为True重新运行就会加边框。边框大小可任意设置build_mongage 不支持增加边框略显凌乱自己优化写一个方法每张小图增增加随机边框L、O、V、E完整的图增加随机颜色边框小图边框为10大图边框为20的像素效果如下调整小图边框为0大图边框为10颜色随机总有一喜欢的一款的效果图如下2. 原理计算LOVE分别属于类似于九宫格的拼图比如L: 5*4的边框里1 * * *1 * * *1 * * *1 * * *1 1 1 1然后进行拼图进行如果要算上边框那就是7*6边框可在每一张小图上增加也可以后续在拼接好的完整的图上增加。其他字母以此类推。3. 源代码# 用python进行 love 拼图# 构建蒙太奇效果# USAGE# python love.py --images E:/personal/images --borderFlag Trueimportargparseimportrandomimportcv2importnumpyasnp# 导入必要的包fromimutilsimportpaths,build_montages# 构建命令行参数及解析# --images 必须构建蒙太奇的原始图像路径# --sample 可选指定要示例的样本图像个数默认21apargparse.ArgumentParser()ap.add_argument(-i,--images,requiredFalse,defaultflowers/ysp/,# defaultflowers/jump_line/,# default flowers/521/,helppath to input directory of images)ap.add_argument(-b,--borderFlag,typebool,defaultTrue,helpborderFlag default False)argsvars(ap.parse_args())# 获取图像路径然后随机获取一组示例imagePaths_originlist(paths.list_images(args[images]))borderFlagargs[borderFlag]border_size_origin0ifborderFlag:border_size_origin0# 每张小图片的边框border_size10# 拼成后L O V E 的边框love_dicts{L:(8,[[1,0,0,0],[1,0,0,0],[1,0,0,0],[1,0,0,0],[1,1,1,1]],(4,5)),O:(14,[[1,1,1,1],[1,0,0,1],[1,0,0,1],[1,0,0,1],[1,1,1,1]],(4,5)),V:(10,[[1,0,0,0,0,0,0,0,0,1],[0,1,0,0,0,0,0,0,1,0],[0,0,1,0,0,0,0,1,0,0],[0,0,0,1,0,0,1,0,0,0],[0,0,0,0,1,1,0,0,0,0]],(10,5)),E:(14,[[1,1,1,1],[1,0,0,0],[1,1,1,1],[1,0,0,0],[1,1,1,1]],(4,5))}image_list[]defimgAddBorder(img,border_size_origin): 给图片增加边框 :param img: 图片 :param border_size_origin: 图片边框像素 :return: black0white255# 随机单颜色colornp.random.randint(100,high255)# 随机炫彩颜色colornp.random.randint(100,high255,size(3,))colnp.ones((border_size_origin,img.shape[0],3))# 增加左侧右侧边框img_leftnp.insert(img,0,col*color,axis1)img_rightnp.insert(img_left,img_left.shape[1],col*color,axis1)# 增加顶部底部边框rownp.ones((border_size_origin,img_right.shape[1],3))img_topnp.insert(img_right,0,row*color,axis0)imgnp.insert(img_top,img_top.shape[0],row*color,axis0)returnimgforkey,(image_num,image_arr,montage_shape)inlove_dicts.items():print(key,(image_num,image_arr,montage_shape))image_totallist(montage_shape)[0]*list(montage_shape)[1]image_shape(255,255)# 随机洗牌random.shuffle(imagePaths_origin)imagePathsimagePaths_origin[:image_total]# 初始化图像列表images[]# start with black canvas to draw images ontomontage_imagenp.zeros(shape(image_shape[1]*(montage_shape[1]),image_shape[0]*montage_shape[0],3),dtypenp.uint8)ifborderFlag:montage_imagenp.zeros(shape((image_shape[1]border_size_origin*2)*(montage_shape[1]),(image_shape[0]border_size_origin*2)*montage_shape[0],3),dtypenp.uint8)cursor_pos[0,0]forrow_indexinrange(len(image_arr)):forcol_indexinrange(len(image_arr[1])):print(row_index,col_index,image_arr[row_index][col_index])ifimage_arr[row_index][col_index]0:imagenp.ones(shape(255,255,3),dtypenp.uint8)*255else:# 加载图像更新图像列表imagecv2.imread(imagePaths[len(images)].replace(\\,/))ifimageisNone:continueimages.append(image)imgcv2.resize(image,image_shape)# 加边框ifborderFlag:imgimgAddBorder(img,border_size_origin)# draw image to black canvasmontage_image[cursor_pos[1]:cursor_pos[1]image_shape[1]border_size_origin*2,cursor_pos[0]:cursor_pos[0]image_shape[0]border_size_origin*2]img cursor_pos[0]image_shape[0]border_size_origin*2# increment cursor x positionifcursor_pos[0]montage_shape[0]*image_shape[0]:cursor_pos[1]image_shape[1]border_size_origin*2# increment cursor y positioncursor_pos[0]0ifcursor_pos[1]montage_shape[1]*image_shape[1]:cursor_pos[0,0]image_list.append(montage_image)# reset black canvasmontage_imagenp.zeros(shape(image_shape[1]*(montage_shape[1]),image_shape[0]*montage_shape[0],3),dtypenp.uint8)start_new_imgTrue# 遍历蒙太奇组图像并展示fori,montageinenumerate(image_list):cv2.imshow(list(love_dicts.keys())[i],cv2.resize(montage,(320,320)))# 调用蒙太奇算法拼图montage_22build_montages(image_list,(350,350),(2,2))montage_14build_montages(image_list,(350,600),(4,1))cv2.imshow(love_1_4,montage_14[0])cv2.imshow(love_2_2,montage_22[0])# 自己实现拼图并加边框ifborderFlag:img_dict{love_1_4_best:((350,350),(2,2)),love_2_2_best:((350,600),(4,1))}forimg_key,(image_shape,montage_shape)inimg_dict.items():row,collist(montage_shape)montage_imagenp.zeros(shape((image_shape[1]border_size*2)*(montage_shape[1]),(image_shape[0]border_size*2)*montage_shape[0],3),dtypenp.uint8)cursor_pos[0,0]forimginimage_list:iftype(img).__module__!np.__name__:raiseException(input of type {} is not a valid numpy array.format(type(img)))imgcv2.resize(img,image_shape)# 加边框ifborderFlag:imgimgAddBorder(img,border_size)# draw image to black canvasmontage_image[cursor_pos[1]:cursor_pos[1]image_shape[1]border_size*2,cursor_pos[0]:cursor_pos[0]image_shape[0]border_size*2]img cursor_pos[0]image_shape[0]border_size*2# increment cursor x positionifcursor_pos[0]montage_shape[0]*image_shape[0]:cursor_pos[1]image_shape[1]border_size*2# increment cursor y positioncursor_pos[0]0ifcursor_pos[1]montage_shape[1]*image_shape[1]:breakcv2.imshow(img_key,montage_image)cv2.waitKey(0)cv2.destroyAllWindows()历史一些有趣的文章列表Python将图像转成像素风圆圈、线条、波浪、十字绣、乐高积木、我的世界积木、回形针、字母… 把喜欢的人的图片用回形针或者圆圈爱心等填满… 程序员可以尝试的小浪漫.最全LaTeX 数学公式、字母符号、上下标、列表矩阵、公式注释、分数二进制数、分割字符、逻辑集合论、否定符号等✨✨✨ ❃ ♕ ꕥ Xpath解析html获取表情符号丰富你的文章 ꧁ ꧂꧁ ꧂Python使用xpath解析html获取表情符号 emoji[使用Python和OpenCV检测图像中的多个亮点](https://blog.csdn.net/qq_40985985/article/details/113769432使用PythonOpenCV查找图像中的最亮点使用PythonOpenCV捕获关键事件并进行视频对象追踪剪辑Python 对图像进行base64编码及解码读取为numpy、opencv、matplot需要的格式以及压缩程序媛过中秋的正确打开方式——使用Python绘制月饼消消乐素描图词云图字符画图及提取轮廓使用Python绘制粽子消消乐素描图优化版正常/漫画/写实风格词云图字符画图及提取轮廓使用PythonXpath获取所有的漫画章节路径并下载漫画图片生成单个/多个pdf并进行pdf合并Python使用AI animegan2-pytorch制作属于你的漫画头像/风景图片使用PythonOpenCV给原视频每一帧画面添加素描漫画版小窗口并生成新视频使用PythonOpenCV制作不同风格的素描图正常漫画写实风格FFmpeg 多图片合成视频带字幕和音乐特效淡入淡出圆圈黑色淡出参考使用PythonOpenCV构建跑图的蒙太奇效果✨✨✨纪念一下我的首个半马❤️❤️❤️[Numpy数组图像基本操作方法及截取ROI、增加行与列](https://blog.csdn.net/qq_40985985/article/details/110951435