小言_互联网的博客

如何用技术手段将图片背景变为透明?

338人阅读  评论(0)

咪哥杂谈

本篇阅读时间约为 6 分钟。

1

前言

上周给大家分享了人脸识别的一个 Python 库。今天来继续讲讲我上次在评论区留言的后续。

既然是追热点的需求,大家可以想想,近几年发生在身边的热点事件。

我来简单的给大家梳理一下,从我毕业之后到今年我感知到的热点事件。

2017年圣诞节,微信头像,戴上了圣诞帽子。

2019年国庆节,微信头像,给我一面国旗。

2020年初肺炎,微信头像,共同抗疫,带上口罩。

发现没有,微信作为现在主流的社交平台,每年伴随热点的总会和头像有关。

头像是什么?头像可以代表网络社交上一个人的门面,只要有一小撮人玩起来,那后面就像滚雪球似的,人也就越来越多。

所以,近期的文章,我来围绕着制作头像模板,或者说是图像模板,来写一写相关的实现技术。等待着下一次的流量过来,直接套好模板,做出服务就行了。

上周写了图像人脸识别基础的应用,那如何实现套模板?或者换个问法,如何将热点套用在用户原有的图片上?

那一定是需要将热点图片的背景变为透明色,并且覆盖在原有的图像上了。(此处,与今天文章的标题点题了。

今天先来介绍如何将图片的背景颜色变为透明色。下面开始正文。

2

环境准备

开始之前,先来重温下这篇文章的第四部分

图像学小知识,不看后悔...100%有用!

看完后,你会理解我们平时所说的 RGB 的含义,那后面就好说了。

接下来,只需要按照 pillow 库。

pip install pillow

3

代码部分

代码没有几行,但是需要理解下:


   
  1. from PIL import Image
  2. def transparent_back():
  3. img = Image.open( 'old.png')
  4. # 图片转换为四通道。第四个通道就是我们要修改的透明度。返回新的对象
  5. img = img.convert( 'RGBA')
  6.      # 获取图片像素尺寸
  7. width, height = img.size
  8. pixel_data = img.load()
  9. for h in range(height):
  10. for w in range(width):
  11. pixel = pixel_data[w, h]
  12. r = pixel[ 0]
  13. g = pixel[ 1]
  14. b = pixel[ 2]
  15. a = pixel[ 3]
  16. # 四通道,色彩值大于浅灰色,则将像素点变为透明块
  17. if r > 220 and g > 220 and b > 220 and a > 220:
  18.                 pixel_data[w, h] = ( 2552552550)
  19.     img.save( 'new.png')   # 保存新图片

pillow库的 Image 在之前的文章中提到过。

open打开本地图片,通过 convert 方法将图片转为 R/G/B/A

(RGBA是代表Red(红色) Green(绿色) Blue(蓝色)和 Alpha的色彩空间)

这里的 A,代表透明度的意思,尽管它英文本意 alpha 没有透明度的意思。感兴趣的可以看下知乎的这篇文章。

https://zhuanlan.zhihu.com/p/24415265

接下来,获取图片的每个像素点的这个通道值,如果此时的色彩值亮于220这个数值,则将该像素点块的 alpha 通道置为透明。

来直观的看下 221 数值的颜色(灰色):

255呢(纯白色)?

这意味着,在我的这段代码中,只有当你原图片的背景色,需要在这之间的色差值,才能被变为透明图片,而恰好,我们大多数图片背景都是偏白色,所以,如果当你背景为深黑色系,那么,需要将这段代码的数值修改下。

4

结果展示

以下面的眼镜举例,这是一张白底为底色的眼睛:

找了一张最近B站重做的《头文字D》中周董图片:

假如你没有将眼镜的图片背景透明化,那么贴上去图片最终成像:

如果眼镜背景透明化了,那么贴上去的图片则是这样的:

至于如何将眼睛用技术手段覆盖在周董眼睛上,将在下一篇中介绍。

5

总结

图片透明化,如果做设计的或者个人网站时候,经常会用到,有些网站在设计 logo 时,logo的图片背景透明化,才能完美符合网站的底层色彩去呈现,类似抖音官网的这样:

好啦,本篇内容就到这里,如果你有什么想说的,欢迎评论区留言。

一句很鸡汤的话送给大家:“机会往往是留给有准备的人”。有些东西,看到了,可以提前布局,静静地等待"热潮"的到来。

PS:本篇代码很简短,就不上传到 github 了。

题图 上海夜景 - pexels - Manuel Joseph


往期精彩回顾

模拟恐怖片里的"跳字特效"

用Python鬼畜特朗普照片,了解下?


转载:https://blog.csdn.net/weixin_38753698/article/details/105236502
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场