当前位置: 首页 > news >正文

✨✨✨使用Python,OpenCV及图片拼接生成❤️LOVE❤️字样图,每张小图加随机颜色边框,大图加随机大小随机颜色边框

✨✨✨使用Python,OpenCV及图片拼接生成❤️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 可选,指定要示例的样本图像个数,默认21ap=argparse.ArgumentParser()ap.add_argument("-i","--images",required=False,default='flowers/ysp/',# default='flowers/jump_line/',# default= 'flowers/521/',help="path to input directory of images")ap.add_argument("-b","--borderFlag",type=bool,default=True,help="borderFlag default False")args=vars(ap.parse_args())# 获取图像路径,然后随机获取一组示例imagePaths_origin=list(paths.list_images(args["images"]))borderFlag=args["borderFlag"]border_size_origin=0ifborderFlag:border_size_origin=0# 每张小图片的边框border_size=10# 拼成后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: '''black=0white=255# 随机单颜色color=np.random.randint(100,high=255)# 随机炫彩颜色color=np.random.randint(100,high=255,size=(3,))col=np.ones((border_size_origin,img.shape[0],3))# 增加左侧右侧边框img_left=np.insert(img,0,col*color,axis=1)img_right=np.insert(img_left,img_left.shape[1],col*color,axis=1)# 增加顶部底部边框row=np.ones((border_size_origin,img_right.shape[1],3))img_top=np.insert(img_right,0,row*color,axis=0)img=np.insert(img_top,img_top.shape[0],row*color,axis=0)returnimgforkey,(image_num,image_arr,montage_shape)inlove_dicts.items():print(key,(image_num,image_arr,montage_shape))image_total=list(montage_shape)[0]*list(montage_shape)[1]image_shape=(255,255)# 随机洗牌random.shuffle(imagePaths_origin)imagePaths=imagePaths_origin[:image_total]# 初始化图像列表images=[]# start with black canvas to draw images ontomontage_image=np.zeros(shape=(image_shape[1]*(montage_shape[1]),image_shape[0]*montage_shape[0],3),dtype=np.uint8)ifborderFlag:montage_image=np.zeros(shape=((image_shape[1]+border_size_origin*2)*(montage_shape[1]),(image_shape[0]+border_size_origin*2)*montage_shape[0],3),dtype=np.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:image=np.ones(shape=(255,255,3),dtype=np.uint8)*255else:# 加载图像,更新图像列表image=cv2.imread(imagePaths[len(images)].replace('\\','/'))ifimageisNone:continueimages.append(image)img=cv2.resize(image,image_shape)# 加边框ifborderFlag:img=imgAddBorder(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_image=np.zeros(shape=(image_shape[1]*(montage_shape[1]),image_shape[0]*montage_shape[0],3),dtype=np.uint8)start_new_img=True# 遍历蒙太奇组图像,并展示fori,montageinenumerate(image_list):cv2.imshow(list(love_dicts.keys())[i],cv2.resize(montage,(320,320)))# 调用蒙太奇算法拼图montage_22=build_montages(image_list,(350,350),(2,2))montage_14=build_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,col=list(montage_shape)montage_image=np.zeros(shape=((image_shape[1]+border_size*2)*(montage_shape[1]),(image_shape[0]+border_size*2)*montage_shape[0],3),dtype=np.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)))img=cv2.resize(img,image_shape)# 加边框ifborderFlag:img=imgAddBorder(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

  • 使用Python,OpenCV查找图像中的最亮点

  • 使用Python,OpenCV捕获关键事件,并进行视频对象追踪剪辑

  • Python 对图像进行base64编码及解码读取为numpy、opencv、matplot需要的格式,以及压缩

  • 程序媛过中秋的正确打开方式——使用Python绘制月饼消消乐,素描图,词云图,字符画图及提取轮廓

  • 使用Python绘制粽子消消乐,素描图(优化版,正常/漫画/写实风格),词云图,字符画图及提取轮廓

  • 使用Python,Xpath获取所有的漫画章节路径,并下载漫画图片生成单个/多个pdf,并进行pdf合并

  • Python使用AI animegan2-pytorch制作属于你的漫画头像/风景图片

  • 使用Python,OpenCV给原视频每一帧画面添加素描漫画版小窗口,并生成新视频

  • 使用Python,OpenCV制作不同风格的素描图(正常,漫画,写实风格)

  • FFmpeg 多图片合成视频带字幕和音乐+特效(淡入淡出,圆圈黑色淡出)

参考

  • 使用Python,OpenCV构建跑图的蒙太奇效果
  • ✨✨✨纪念一下我的首个半马❤️❤️❤️
  • [Numpy数组图像基本操作方法,及截取ROI、增加行与列](https://blog.csdn.net/qq_40985985/article/details/110951435
http://www.jsqmd.com/news/447795/

相关文章:

  • 工业现场多PLC组网:S7 1500与Quantum PLC数据交换全流程解析
  • 第一次用降AI工具?照着这个流程做AI率低于15% - 还在做实验的师兄
  • 手把手教你在隔离网络中用dpkg安装Docker(Ubuntu 16.04专属教程)
  • 脑电研究者的效率神器:EEGLAB批处理+ICLabel自动去伪迹的黄金组合
  • 芯片设计必看:Design Compiler中set_qor_strategy的5个隐藏技巧与常见误区
  • 从Turtle画图到机械臂写字:Python实现坐标转换的完整指南
  • ShardingSphere-JDBC避坑指南:当分库分表遇上RuoYi-Vue-Plus的多数据源
  • 80%的人降AI失败,都是因为犯了这3个错误 - 还在做实验的师兄
  • PySide6样式表避坑指南:为什么你的QSS总是不生效?8个常见问题解析
  • USB PD协议栈的隐形守护者:MTK平台tcpci_event_init工作队列深度优化指南
  • 零基础学电子:5分钟搞懂负反馈放大电路的四种类型
  • 嘎嘎降AI双引擎技术解析:为什么降AI效果比别人稳? - 还在做实验的师兄
  • Halcon尺寸测量进阶:如何优化create_metrology_model参数提升检测精度(含避坑指南)
  • STM32入门(1)
  • YOLO26改进73:全网首发--c3k2模块添加PoolingFormerCGLU创新模块
  • 鼎捷T100开发实战:CURSOR在Genero BDL中的高效数据查询技巧
  • OpenAI开源计划:开发者免费享半年ChatGPT Pro订阅
  • 2026年DeepSeek写的论文AI率太高?这几款降AIGC率工具帮你搞定 - 还在做实验的师兄
  • Unity游戏开发必备:TMP中文字体导入全攻略(附免费商用字体推荐)
  • 8253/8254定时器在嵌入式系统中的应用:从原理到实战代码解析
  • MCP ????
  • 高阻态不是玄学!用万用表实测单片机引脚悬浮状态(避坑指南)
  • 避坑指南:PINN在常微分方程积分中的常见问题及解决方案
  • ProM插件开发实战:从Hello World到多线程任务管理(附完整代码示例)
  • 金蝶K3跨网段卡顿?3步TCP调优搞定ERP服务器响应慢问题
  • ABC 448 A - D 题解
  • 告别Logitech Option崩溃烦恼:XMouseButtonControl鼠标宏配置全攻略(含自启动设置)
  • SpringBoot+若依:Swagger接口文档的权限控制实战(从入门到精通)
  • Leaflet地图性能优化指南:5个技巧让你的聚类图层流畅渲染(含高德地图适配)
  • CPU中的ACC累加器:为什么它比普通寄存器更快?从硬件设计角度解析