Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >python 将图像转换为乐高积木风格图片(上)

python 将图像转换为乐高积木风格图片(上)

作者头像
叶子陪你玩
发布于 2021-04-13 07:02:12
发布于 2021-04-13 07:02:12
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

今天早上起来,看到一张乐高人的图片,突然萌生一个想法,能不能将任意一张图片转换成乐高积木风格图片。

以前用过一个叫做 Legoaizer 的软件,该软件可以传入一张图片,然后返回对应的乐高积木风格图片,并且还会生成一个积木零件清单。

有了这个积木零件清单,就可以自己去购买对应的积木零件拼出真正的乐高风格画了。


那自己要实现这样的一个程序,该怎样做呢?

观察乐高积木风格图片,发现其实非常像马赛克图片,只不过把每个像素块替换成了乐高积木块而已。


所以首先我想到的是能不能先将一张图片变成马赛克风格图片呢。

左边原图、右边马赛克风格图

马赛克图片原理:

获取一块具有多种颜色的像素块的区域,计算出里面哪种颜色像素块最多,

这里明显黑色最多,那么将其它所有非黑色的全部填充为黑色。

循环遍历完图片的所有像素,就可以实现马赛克风格图片了。

实现了马赛克图片后,如何将图片转换成乐高风格图片呢


乐高风格图片


我们知道图片本质上是一串数字,带有凹凸感的乐高积木块图片同样如此,只要能够获取到其像素值就可以了。


可是找了很久,没有找到所有的乐高积木块图片,据说乐高一共有51种颜色,包括33种常规颜色、14种透明颜色和4种特殊效果(“effect”)。

不过好在的是,找到了各种颜色的像素值。

换个思路,用一块白色的乐高积木块,

与其它颜色RGB值进行运算处理,得到其它颜色的积木块。


实现了对应的颜色积木块后,如何让图片的各种像素值与图片进行一一匹配呢?

实际图片颜色是非常多的,远超过积木块的颜色种类,所以直接匹配是做不到的,需要对图片的像素值进行一个判断,最接近哪种颜色就用对应的积木块。从而解决实际图片颜色种类太多,而积木块颜色种类太少的问题。

最后就是在对应的像素位置上贴上对应的积木块颜色就可以了。


看一个最简单的案例,根据嵌套列表贴出一个爱心的效果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from PIL import Image 
import matplotlib.pyplot as plt 

pixel = [[0, 1, 0, 1, 0],
         [1, 1, 1, 1, 1],
         [1, 1, 1, 1, 1],
         [0, 1, 1, 1, 0],
         [0, 0, 1, 0, 0]]

img = Image.new("RGB",(5,5),"white")
img_new = Image.new("RGB",(300,300),"white")
white = Image.open("White_1x1.jpg")
red = Image.open("Red_1x1.jpg")
for i in range(5):
    for j in range(5):
        if pixel[i][j] == 1:
            img_new.paste(red,(60*j,60*i))
        else:
            img_new.paste(white, (60*j, 60*i))

plt.imshow(img_new)
plt.show()

原图

马赛克风格图

乐高图

总体效果还是不错,只不过当前速度还比较慢,需要20秒左右,有空在优化封装一下,留个坑,下次来填坑放上代码。

(全文完)


欢迎转载,转载请注明出处! 欢迎关注公众微信号:叶子陪你玩编程

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叶子陪你玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
看透react源码之感受react的进化
网上有许多关于react源码解读的文章,其中有很多都只是单纯贴源码,罗列变量名。其实大家都知道这个英文怎么读,直译也大概知道意思,但是这个英文在react中起到什么作用,并没有说的很通俗明白。
goClient1992
2022/09/26
4370
React源码分析8-状态更新的优先级机制
实现这一目的的本质就是在低优先级任务执行时,有更高优先级任务进来的话,可以打断低优先级任务的执行。
goClient1992
2022/10/13
1.3K0
前端跳槽突围课:React18底层源码深入剖析(慕fx)
React调度器是按照浏览器的requestIdleCallback这个API实现的(因为兼容性原因没有直接使用该API),现在分别从存储结构以及调用方式讲解实现原理:
用户11063488
2024/05/04
2980
第十六篇:剖析 Fiber 架构下 Concurrent 模式的实现原理
欢迎来到第 16 讲,关于 Fiber 架构的实现原理和编码形态,其实我们已经洋洋洒洒地分析了 3 讲了。
越陌度阡
2023/01/13
5360
第十六篇:剖析 Fiber 架构下 Concurrent 模式的实现原理
React 并发模式到底是个啥?
在计算机里,并发「concurrent」一词,最早是用来表示多个任务同时进行。但是由于早期的计算机能力有限,单核计算机同一时间,只能运行一个任务。因此,为了做到看上去多个应用是在同时运行的,单核计算机就快速的在不同的应用中来回切换,它执行完 A 应用的一个任务,就执行 B 应用的任务,只要切换得足够快,对于用户而言,A 应用与 B 应用就是在同时运行。
用户6901603
2023/12/28
3030
React 并发模式到底是个啥?
万万没想到,React 优先级队列的实现方式,跟我书里写的一模一样
我曾经写了一本书《JavaScript 核心进阶》,我用大量文字篇幅以及配套详细视频讲解,在《V8 的垃圾回收机制底层算法原理》一文中,跟大家介绍了算法上如何从深度优先遍历,转向广度优先遍历。以及为什么广度优先遍历可以做到任务可中断而深度优先遍历做不到。又在《数据结构堆》一文中,跟大家分享了如何利用二叉堆实现优先级队列。
用户6901603
2024/01/04
3230
万万没想到,React 优先级队列的实现方式,跟我书里写的一模一样
异步分片计算在腾讯文档的实践
几个月前对腾讯文档 Smart Sheet 中看板视图的排版计算进行了一次优化,主要是利用异步分片计算来提高当前的 FPS 值,避免用户操作被阻塞。感谢 kylehr 的支持和帮助。
尹光耀
2022/10/07
8160
异步分片计算在腾讯文档的实践
带你彻底读懂React任务调度以及背后的算法
我:如果这个数组是动态的,每次我都要找最小值,找到之后就从数组里删除这个元素,然后下次还想找最小值,怎么整。并且这个过程中,还会不断有新的数字插入数组。
前端bubucuo
2022/09/16
6391
带你彻底读懂React任务调度以及背后的算法
React 的调度系统 Scheduler
React 使用了全新的 Fiber 架构,将原本需要一次性递归找出所有的改变,并一次性更新真实 DOM 的流程,改成通过时间分片,先分成一个个小的异步任务在空闲时间找出改变,最后一次性更新 DOM。
前端西瓜哥
2022/12/21
9280
React 的调度系统 Scheduler
React Fiber 是什么?
为了提高 React 的性能,React 团队在开发 React 16 时做了底层的重构,引入了 React Fiber 的概念。
前端西瓜哥
2022/12/21
5940
React Fiber 是什么?
深入分析React-Scheduler原理
工作中一直有在用 React 相关的技术栈,但却一直没有花时间好好思考一下其底层的运行逻辑,碰巧身边的小伙伴们也有类似的打算,所以决定组团卷一波,对 React 本身探个究竟。
xiaofeng123aa
2022/11/02
1.5K0
从简单中窥见高端,彻底搞懂任务可中断机制与任务插队机制
前面用了几篇文章来跟大家分享什么是任务可中断,不过呢,可能是我介绍的方式太过于简单粗暴,以致于还是有部分同学没太明白,所以今天我就用最基础的方式重新跟大家分享一下什么是任务可中断
用户6901603
2024/01/18
2550
从简单中窥见高端,彻底搞懂任务可中断机制与任务插队机制
React Fiber架构浅析
为了更好的理解 React Fiber, 我们先简单了解下渲染器进程的内部工作原理。
Nealyang
2021/09/27
9280
React Fiber架构浅析
【JS】666- window.reqeustIdleCallback方法详解
最初我以为这个函数就是和实现动画的 requestAnimationFrame 拥有相同的行为,因为它们的使用方法非常类似,但实际使用后发现它们的差别还是蛮大的。本文主要对这个神秘的函数进行一些说明和分析。
pingan8787
2020/07/29
1.9K0
【JS】666- window.reqeustIdleCallback方法详解
彻底搞懂 React 18 并发机制的原理
React 是通过 JSX 描述页面的,JSX 编译成 render function(也就是 React.createElement 等),执行之后产生 vdom。
神说要有光zxg
2023/02/01
1.4K0
什么是时间分片(Time Slicing)?
所以为了避免这种情况,我们可以使用两种方案,一种是Web Worker,另一种是时间切片(Time Slicing)。
陈大鱼头
2020/09/21
1.5K0
什么是时间分片(Time Slicing)?
从React源码分析看useEffect
这里不再讲useLayoutEffect,它和useEffect的代码是一样的,区别主要是:
goClient1992
2022/09/27
5070
react源码解析3.react源码架构
在真正的代码学习之前,我们需要在大脑中有一个react源码的地图,知道react渲染的大致流程和框架,这样才能从上帝视角看react是怎么更新的,来吧少年。
goClient1992
2022/09/24
3540
React源码分析7-state计算流程和优先级
setState 执行之后,会执行一个叫 enqueueSetState 的方法,这个主要作用是创建 Update 对象和发起调度,可以看下这个函数的逻辑
goClient1992
2022/10/13
6180
相关推荐
看透react源码之感受react的进化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验