今天小伙伴问我,你知道什么是马赛克画,我笑了笑,你是说哪种哦?我知道一种,不过不是某些电影的马赛克哦~~

马赛克画是一张由小图拼成的大图,本文的封面就是我们的效果图,放大看细节,每一块都是一张独立的图片,拼在一起组成一张大图,感觉像是用马赛克拼出来的画,所以叫马赛克画。看到网上的一些马赛克画觉得很酷,于是自己用Python实现了一下将一张原图转换成马赛克画。

封面的原图是这样的

实现的具体思路是这样

第一步:首先收集一组图片,这些图片会作为大图中的小方格图片。图片越多,最后生成的图片颜色越接近。

第二步:将要转换的图片分割成一个一个小方格图片,像下面这样

第三步:对于每一个小方格图片,取图片集里面最接近的图片替换。所有小方格都替换后,就生成了我们最终的马赛克画。

听上去是不是很简单?

我们来看一下具体的实现步骤,下面是一些核心代码。完整代码可在公众号【Python与数据分析】后台回复“mosaic”获取。

我们的图片集存在images目录下,下面的代码加载目录下所有的图片,并缩放成统一的尺寸

importreimportosimportcv2importnumpyasnpfromtqdmimporttqdmIMG_DIR="images"def load_all_images(tile_row, tile_col): img_dir =IMG_DIRfilenames = os.listdir(img_dir)result= [] print(len(filenames))forfilenameintqdm(filenames):ifnotre.search(".jpg", filename, re.I):continuetry: 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))exceptExceptionase: 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)forrowinrange(0, img_shape[0], tile_row):forcolinrange(0, img_shape[1], tile_col): roi = img[row:row+tile_row,col:col+tile_col,:]

我们将要转换的图片分割成一个个小方格,tile_row和tile_col是小方格的高和宽,roi存取小方格中的图片数据。

下面是计算两张图片相似度的函数

from scipy.spatial.distanceimporteuclideandef img_distance(im1, im2):ifim1.shape!= im2.shape: msg ="shapes are different {} {}".format(im1.shape, im2.shape) raise Exception(msg) array1 = im1.flatten() array2 = im2.flatten()dist= euclidean(array1, array2)returndist

im1和im2是两张图片的数据,图片数据是一个三维的numpy数组,这里我们将三维数组转换成一维数组后,比较两者的欧式距离。之后要找出最相似的图片,只需遍历图片集中所有的图片,找到距离最短的那张图片,去替换原图中的小方格就可以了。

我们再来看一下最终实现的效果

放大图中局部的细节如下

如果对图片的画质不满意,想要更精细的画质,可以考虑在分割的时候把图片分割成更小的方格,不过这样也会增加程序运行的时间。

生成图片的过程比较耗时,考虑到性能原因,原程序中使用多进程的方式并行处理。

经过以上的学习,你学会了如何使用Python生成马赛克画了吗?

为了让大家更好地更快速的学习Python,小编准备来一份适合Python初学者的系统入门学习资料,加群959997225即可领取。

本文来自网络,如有侵权请联系小编删除!

python画史迪仔_手把手教你如何使用Python来生成马赛克画!相关推荐

  1. python高斯噪声怎么去除_手把手教你如何实现Python手势识别与控制(含代码及动图)...

    Python手势识别与控制 概述 本文中的手势识别与控制功能主要采用 OpenCV 库实现, OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库, 可以运行在Linux, Windows ...

  2. python爬取网页文本_手把手教你如何用Python爬取网站文本信息

    提取网页源代码--Requests 工具包 在我们提取网络信息之前,我们必须将网页的源代码进行提取,Requests工具包现在可以说是最好用和最普及的静态网页爬虫工具,它是由大神Kenneth Rei ...

  3. 软件_手把手教vscode配置c++,python开发环境

    原创:软件_手把手教vscode配置c++,python开发环境 之前主用Python作为项目开发语言,将项目迁移到arm边缘盒子上后发现arm的cpu不给力,软件速度低于预期,所以计划将部分程序改为 ...

  4. python画史迪仔_Python turtle画图 使用python turtle库实现了动漫人物史迪仔的绘制 - 下载 - 搜珍网...

    使用python turtle库实现了动漫人物史迪仔的绘制,画图过程尽量细分将每一个拐角都反复调整角度,直到合适为止,大概耗费了五六个小时的时间绘制成功(Using the python turtle ...

  5. python k线合成_手把手教你写一个Python版的K线合成函数

    手把手教你写一个Python版的K线合成函数 在编写.使用策略时,经常会使用一些不常用的K线周期数据.然而交易所.数据源又没有提供这些周期的数据.只能通过使用已有周期的数据进行合成.合成算法已经有一个 ...

  6. python处理时间序列非平稳_手把手教你用Python处理非平稳时间序列

    简介 预测一个家庭未来三个月的用电量,估计特定时期道路上的交通流量,预测一只股票在纽约证券交易所交易的价格--这些问题都有什么共同点? 它们都属于时间序列数据的范畴!如果没有"时间" ...

  7. python正确的输入语句_手把手教你在python中如何使用while True语句

    在学习过程中,经常能遇到采用while True的用法.下面以一个例子进行说明: 建立一个用户登录系统,用户输入用户名和密码,如果正确就可以进入系统. 1.我自己最开始的写法:d = {} #数据库字 ...

  8. python 合并excel 自动更新_手把手教你4种方法用Python批量实现多Excel多Sheet合并

    一.前言 大家好,我是崔艳飞.前两天给大家分享了Python自动化文章:手把手教你利用Python轻松拆分Excel为多个CSV文件,而后在Python进阶交流群里边有读者遇到一个问题,他有很多个Ex ...

  9. python爬取资料怎么样_手把手教你Python爬取新房数据

    原标题:手把手教你Python爬取新房数据 项目背景 新房数据,对于房地产置业者来说是买房的重要参考依据,对于房地产开发商来说,也是分析竞争对手项目的绝佳途径,对于房地产代理来说,是踩盘前的重要准备. ...

最新文章

  1. 告别排队!用Python定时自动挂号和快捷查询化验报告
  2. fedora21 mysql_在fedora21 上的php+mysql+apache环境搭建
  3. ELK学习2_用Kibana和logstash快速搭建实时日志查询、收集与分析系统
  4. mysql2000 sp4_SQL Server 2000 (SP4)笔记整理(二):数据库表
  5. 0619-dedeCMS的安装、重装、目录说明、基本操作及注意事项
  6. POJ1321(DFS)
  7. mysql 对表插入多行_MySQL表中怎么一次插入两行或更多行
  8. 计算机应用基础山东大学,山东大学计算机应用基础
  9. uva861 Little Bishops
  10. asp.net中后台javaScrip的使用
  11. chrome开发工具指南之综述
  12. 百度地图InfoWindow弹窗圆角
  13. 深度学习(三十二)半监督阶梯网络学习笔记-NIPS 2015
  14. XPath总结(转)
  15. robot framework 添加selenium2library显示红色
  16. Micheal Nielsen's神经网络学习之三:过拟合与规范化
  17. 独立游戏开发日志:2021年2月14日 斜面攀爬
  18. 华为交换机测试吞吐量软件,华为选择Spirent验证最新数据中心交换机的性能
  19. oracle 怎么看监听文件,【学习笔记】Oracle11G关于监听文件位置与监听文件大小限制...
  20. 计讯物联环保数采仪全系列产品为节能降耗减碳贡献绿色力量

热门文章

  1. adb server is out of date 最新解决方案
  2. 安徽师大附中%你赛day2T3 巧克力 解题报告
  3. 连字符-后首字母的大小写
  4. 【OI备忘录】dalao博文收藏夹
  5. 检测OTU序列遗传发育信号的R实现
  6. 从零开始学习SFR-- 1.0
  7. mybatis mybatis的resultType详解
  8. 现有列表记录商品名称和价格如下:‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬要求用户输入总资产,例如: 20000,输出所有商品序号和商品列表,每行
  9. pandas中的freq和inferred_freq等时间参数究竟有哪些
  10. 手绘topo图组件 vue + element-ui + jtopo