python程序员专用壁纸_程序员炫技必备:用Python生成马赛克画!(文末附源码)...
原标题:程序员炫技必备:用Python生成马赛克画!(文末附源码)
源 | Python与数据分析文 | 强哥
大家知道马赛克画是什么吗?不是动作片里的马赛克哦~~
马赛克画是一张由小图拼成的大图,本文的封面就是我们的效果图,放大看细节,每一块都是一张独立的图片,拼在一起组成一张大图,感觉像是用马赛克拼出来的画,所以叫马赛克画。看到网上的一些马赛克画觉得很酷,于是自己用Python实现了一下将一张原图转换成马赛克画。
我们的效果图是这样的
原图是这样的
实现的具体思路是这样
第一步:首先收集一组图片,这些图片会作为大图中的小方格图片。图片越多,最后生成的图片颜色越接近。
第二步:将要转换的图片分割成一个一个小方格图片,像下面这样
第三步:对于每一个小方格图片,取图片集里面最接近的图片替换。所有小方格都替换后,就生成了我们最终的马赛克画。
听上去是不是很简单?
我们来看一下具体的实现步骤,下面是一些核心代码。完整代码可在公众号后台回复“mosaic”获取。
我们的图片集存在images目录下,下面的代码加载目录下所有的图片,并缩放成统一的尺寸
importre
importos
importcv2
importnumpy asnp
fromtqdm importtqdm
IMG_DIR = "images"
defload_all_images(tile_row, tile_col):
img_dir = IMG_DIR
filenames = os.listdir(img_dir)
result = []
print(len(filenames))
forfilename intqdm(filenames):
ifnotre.search(".jpg", filename, re.I):
continue
try:
filepath = os.path.join(img_dir, filename)
im = cv2.imread(filepath)
row = im.shape[0]
col = im.shape[1]
im = resize(im, tile_row, tile_col)
result.append(np.array(im))
exceptException ase:
msg = "error with {} - {}".format(filepath, str(e))
print(msg)
returnnp.array(result, dtype=np.uint8)
这里load_all_images函数的参数就是统一后的尺寸,tile_row和tile_col分别对应高和宽。
下面的代码对要转换的图片进行分割
img = cv2.imread(infile)
tile_row, tile_col = get_tile_row_col(img.shape)
forrow inrange(0, img_shape[0], tile_row):
forcol inrange(0, img_shape[1], tile_col):
roi = img[row:row+tile_row,col:col+tile_col,:]
我们将要转换的图片分割成一个个小方格,tile_row和tile_col是小方格的高和宽,roi存取小方格中的图片数据。
下面是计算两张图片相似度的函数
fromscipy.spatial.distance importeuclidean
defimg_distance(im1, im2):
ifim1.shape != im2.shape:
msg = "shapes are different {} {}".format(im1.shape, im2.shape)
raiseException(msg)
array1 = im1.flatten()
array2 = im2.flatten()
dist = euclidean(array1, array2)
returndist
im1和im2是两张图片的数据,图片数据是一个三维的numpy数组,这里我们将三维数组转换成一维数组后,比较两者的欧式距离。之后要找出最相似的图片,只需遍历图片集中所有的图片,找到距离最短的那张图片,去替换原图中的小方格就可以了。
我们再来看一下最终实现的效果
放大图中局部的细节如下
如果对图片的画质不满意,想要更精细的画质,可以考虑在分割的时候把图片分割成更小的方格,不过这样也会增加程序运行的时间。
生成图片的过程比较耗时,考虑到性能原因,原程序中使用多进程的方式并行处理。
-END-
转载声明:本文选自「Python与数据分析」,搜索「PythonML」即可关注
扫码回复“马赛克”
领取文中案例源码!返回搜狐,查看更多
责任编辑:
python程序员专用壁纸_程序员炫技必备:用Python生成马赛克画!(文末附源码)...相关推荐
- 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结【文末附源码】
微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 文章目录 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 1️⃣ 写在前面 2️⃣ 蓝牙连接流程 3 ...
- python爬虫实战——自动下载百度图片(文末附源码)
用Python制作一个下载图片神器 前言 这个想法是怎么来的? 很简单,就是不想一张一张的下载图片,嫌太慢. 在很久很久以前,我比较喜欢收集各种动漫的壁纸,作为一个漫迷,自然是能收集多少就收集多少.小 ...
- vue代码生成器可视化界面_手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)...
在开发过程中免不了创建实体类,字段少的表可以手动编写,但是字段多还用手动创建的话不免有些浪费时间,假如一张表有100多个字段,手写有些不现实. 这时我们会借助一些工具,如:动软代码生成器.各种ORM框 ...
- 微信小程序「发现流浪猫」宠物互助喂养社区系统部署教程-期末作业项目实例(附源码)
文末附源码免费下载地址 一.项目介绍 这是一款拍照记录校园内猫猫的成长轨迹的小程序. 可以为不同的猫猫添加身份档案,猫猫相册,并通过精选瀑布流的方式展示给大家. 用户可以上传照片,发表留言,点赞照片或 ...
- Python对带光晕的任意纯色背景图像进行去背景色操作(保留透明效果、附源码)
昨天更新了一个去黑色背景的文章,今天发现可以再适用范围上推广一下,前提是知道背景色的RGB值. Python对带光晕的图像进行去黑底黑色背景操作(附源码) 先上效果图 除了纯白会导致透明度异常,纯红导 ...
- python程序员专用壁纸_代码没写完,哪里有脸睡觉!17 张程序员壁纸推荐
Python,作为一门热门的语言,已经高居编程语言排行榜前三名,也是站长几年前学过的语言之一.当然咯,Python只是站长使用的语言之一,站长也相当熟悉Java.C++.PHP等语言.Python主要 ...
- python程序员专用壁纸_配置最漂亮的PyCharm界面,Python程序员必备!
高逼格超美的IDE界面,是每个程序员的梦想! 随着人工智能/机器学习的兴起,Python作为一门"漂亮的语言",再次获得广大程序员的关注.而JetBrains出品的PyCharm无 ...
- python程序员专用壁纸_神级python程序员分享的让小白30分钟快速上手的一张神图,赶快收藏!...
原标题:神级python程序员分享的让小白30分钟快速上手的一张神图,赶快收藏! 现在很多人学编程都把Python作为入门语言,其实这是个很不错的选择,那么你知道新手如何学Python吗?小编给大家分 ...
- 微信小程序实现附近医院、加油站、景点和地图路线导航功能(超详细)(附源码)
文章目录 效果图 API获取 获取Key 微信小程序后台配置 代码 app.json wxml代码 wxss代码 JS代码 其他 留言 效果图 API获取 使用腾讯位置服务提供的api 点击链接注册或 ...
最新文章
- AI工程的实践者:普元积极将场景落地,为企业提供智能化解决方案
- javaScript中表单的验证
- route add添加静态路由
- vb 通过php连接mysql数据库连接_vb如何mysql数据库连接
- android前端开发 布局学习
- thymeleaf的属性优先级
- 2021 年全球知名开源项目
- SAP MTO生产模式和计划策略组
- 软件测试车载系统,车载软件测试
- 直击备份恢复的痛点:基于 TiDB Binlog 的快速时间点恢复
- Android 圆形头像控件CircleImageView
- php 截图ppt文件,介绍ppt文件截图并插入
- libapache2-mod-php5 apache,Debian Etch libapache2-mod-php5 with bundled libgd
- html name选择器,iframe标签的name属性
- 平板电脑支持html吗,HTML5视频无法在平板电脑上播放(HTML5 video not playing on tablets)...
- 私有部署、重构企业软件,第四范式发布大模型“式说”
- c语言上机怎么弄一元一次方程,怎么在c语言中编写一元一次方程
- 基于迅为2K1000开发板龙芯处理器安装 Linux系统到固态硬盘
- 中国将成亚太 Linux 枢纽
- 聚类分析——SPSS实例分析
热门文章
- 虚拟机由于找不到msvcr120dll_计算机提示丢失msvcr120.dll文件怎么办?
- 软件缺陷的生命周期(二)
- 浅析嵌入式开发中的RAM和ROM
- PS自用(抠图、调色)
- android 改变输入法enter键文字 为搜索 下一个 以及前往
- 22南工计算机学院新生培训最终章---ACM竞赛机制
- 安卓开发 监听虚拟按键_Android 虚拟按键适配动态调整布局的方法
- 腾讯云实时音视频( TRTC)通话质量监控仪表盘
- css将两张图片叠加(简易方法)
- mat1 and mat2 shapes cannot be multiplied ( )的解决