原标题:程序员炫技必备:用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生成马赛克画!(文末附源码)...相关推荐

  1. 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结【文末附源码】

    微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 文章目录 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 1️⃣ 写在前面 2️⃣ 蓝牙连接流程 3 ...

  2. python爬虫实战——自动下载百度图片(文末附源码)

    用Python制作一个下载图片神器 前言 这个想法是怎么来的? 很简单,就是不想一张一张的下载图片,嫌太慢. 在很久很久以前,我比较喜欢收集各种动漫的壁纸,作为一个漫迷,自然是能收集多少就收集多少.小 ...

  3. vue代码生成器可视化界面_手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)...

    在开发过程中免不了创建实体类,字段少的表可以手动编写,但是字段多还用手动创建的话不免有些浪费时间,假如一张表有100多个字段,手写有些不现实. 这时我们会借助一些工具,如:动软代码生成器.各种ORM框 ...

  4. 微信小程序「发现流浪猫」宠物互助喂养社区系统部署教程-期末作业项目实例(附源码)

    文末附源码免费下载地址 一.项目介绍 这是一款拍照记录校园内猫猫的成长轨迹的小程序. 可以为不同的猫猫添加身份档案,猫猫相册,并通过精选瀑布流的方式展示给大家. 用户可以上传照片,发表留言,点赞照片或 ...

  5. Python对带光晕的任意纯色背景图像进行去背景色操作(保留透明效果、附源码)

    昨天更新了一个去黑色背景的文章,今天发现可以再适用范围上推广一下,前提是知道背景色的RGB值. Python对带光晕的图像进行去黑底黑色背景操作(附源码) 先上效果图 除了纯白会导致透明度异常,纯红导 ...

  6. python程序员专用壁纸_代码没写完,哪里有脸睡觉!17 张程序员壁纸推荐

    Python,作为一门热门的语言,已经高居编程语言排行榜前三名,也是站长几年前学过的语言之一.当然咯,Python只是站长使用的语言之一,站长也相当熟悉Java.C++.PHP等语言.Python主要 ...

  7. python程序员专用壁纸_配置最漂亮的PyCharm界面,Python程序员必备!

    高逼格超美的IDE界面,是每个程序员的梦想! 随着人工智能/机器学习的兴起,Python作为一门"漂亮的语言",再次获得广大程序员的关注.而JetBrains出品的PyCharm无 ...

  8. python程序员专用壁纸_神级python程序员分享的让小白30分钟快速上手的一张神图,赶快收藏!...

    原标题:神级python程序员分享的让小白30分钟快速上手的一张神图,赶快收藏! 现在很多人学编程都把Python作为入门语言,其实这是个很不错的选择,那么你知道新手如何学Python吗?小编给大家分 ...

  9. 微信小程序实现附近医院、加油站、景点和地图路线导航功能(超详细)(附源码)

    文章目录 效果图 API获取 获取Key 微信小程序后台配置 代码 app.json wxml代码 wxss代码 JS代码 其他 留言 效果图 API获取 使用腾讯位置服务提供的api 点击链接注册或 ...

最新文章

  1. AI工程的实践者:普元积极将场景落地,为企业提供智能化解决方案
  2. javaScript中表单的验证
  3. route add添加静态路由
  4. vb 通过php连接mysql数据库连接_vb如何mysql数据库连接
  5. android前端开发 布局学习
  6. thymeleaf的属性优先级
  7. 2021 年全球知名开源项目
  8. SAP MTO生产模式和计划策略组
  9. 软件测试车载系统,车载软件测试
  10. 直击备份恢复的痛点:基于 TiDB Binlog 的快速时间点恢复
  11. Android 圆形头像控件CircleImageView
  12. php 截图ppt文件,介绍ppt文件截图并插入
  13. libapache2-mod-php5 apache,Debian Etch libapache2-mod-php5 with bundled libgd
  14. html name选择器,iframe标签的name属性
  15. 平板电脑支持html吗,HTML5视频无法在平板电脑上播放(HTML5 video not playing on tablets)...
  16. 私有部署、重构企业软件,第四范式发布大模型“式说”
  17. c语言上机怎么弄一元一次方程,怎么在c语言中编写一元一次方程
  18. 基于迅为2K1000开发板龙芯处理器安装 Linux系统到固态硬盘
  19. 中国将成亚太 Linux 枢纽
  20. 聚类分析——SPSS实例分析

热门文章

  1. 虚拟机由于找不到msvcr120dll_计算机提示丢失msvcr120.dll文件怎么办?
  2. 软件缺陷的生命周期(二)
  3. 浅析嵌入式开发中的RAM和ROM
  4. PS自用(抠图、调色)
  5. android 改变输入法enter键文字 为搜索 下一个 以及前往
  6. 22南工计算机学院新生培训最终章---ACM竞赛机制
  7. 安卓开发 监听虚拟按键_Android 虚拟按键适配动态调整布局的方法
  8. 腾讯云实时音视频( TRTC)通话质量监控仪表盘
  9. css将两张图片叠加(简易方法)
  10. mat1 and mat2 shapes cannot be multiplied ( )的解决