前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 将图像转换为乐高积木风格图片(上)

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

作者头像
叶子陪你玩
发布2021-04-13 15:02:12
2.1K0
发布2021-04-13 15:02:12
举报
文章被收录于专栏:叶子陪你玩编程

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

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

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


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

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


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

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

马赛克图片原理:

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

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

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

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


乐高风格图片


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


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

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

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

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


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

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

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


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

代码语言:javascript
复制
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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档