news 2026/6/10 15:07:44

【jieba词云实战】词云蒙版制作:从图片提取轮廓的三种方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【jieba词云实战】词云蒙版制作:从图片提取轮廓的三种方法

前篇:【Jieba实战】jieba + WordCloud 生成中文词云
想让词云填满一只米老鼠的轮廓?关键在于制作一张合格的蒙版图片。

一、什么是蒙版?

​ WordCloud 的mask参数接受一张图片,用它来控制词云的填充区域:

  • 白色像素(RGB 255,255,255)→ 留空,不填词

  • 非白色像素→ 填充词语

​ 所以制作蒙版的核心任务就是:把图片中的主体区域变成黑色(或任意非白色),背景变成纯白色。

二、制作方案一:直接使用剪影图(最省事)

2.1 搜索图片

​ 网上搜索 “xxx silhouette png”(如 “mickey mouse silhouette png”),下载黑色剪影白色背景的图片,直接就能用作蒙版。

​ 例如,我们这里使用https://www.citypng.com/photo/24587/hd-mickey-mouse-black-shadow-silhouette-png下载的米奇剪影图。

2.2 加载剪影图

importimageiodefget_mask(mask_file:str):# 加载蒙版图片(非白色区域会被填充词语,白色区域留空)mask=np.array(imageio.v2.imread(mask_file))returnmask mask_file="micky_bg.png"mask=get_mask(mask_file)
  • 蒙版要求背景是纯白色(RGB 255,255,255),但不同的图片加载库对透明 PNG 的处理方式不同:

    加载方式透明区域处理能否直接用
    imageio.imread()自动填充为白色可以直接用
    PIL.Image.open()保留透明通道,不会自动变白需要手动转换
    • 如果你使用imageio加载,透明背景的 PNG 可以直接使用,不需要额外处理。

    • 如果你使用PIL,则需要手动将透明背景转为白色:

      fromPILimportImageimportnumpyasnp img=Image.open("mickey_transparent.png").convert("RGBA")# 创建白色背景background=Image.new("RGBA",img.size,(255,255,255,255))# 将透明图片粘贴到白色背景上background.paste(img,mask=img.split()[3])# 转为 RGB 保存background.convert("RGB").save("mickey_mask.png")

建议:用imageio加载最省事,一行代码搞定,不用操心透明度问题。

2.3 适用性

  • 适用场景:常见形状(动物、地图、logo、人物剪影),网上资源丰富。

2.4 制作词云

  • 我们在之前的实现中,增加一些改动:

    defgenerate_chinese_wordcloud(...):......ifmask_fileisnotNone:mask=get_mask(mask_file)else:mask=None# 5. 生成词云clean_text=" ".join(cleaned)generate_wordcloud(text=clean_text,font_path=font_path,output_path=output_path,width=1200,height=600,background_color="white",max_words=max_words,mask=mask)
  • 生成效果

三、方法二:OpenCV GrabCut 自动抠图(推荐)

​ 手上只有一张普通的彩色照片,背景不是纯白的?用 OpenCV 的 GrabCut 算法自动分离前景和背景。

3.1 安装

pipinstallopencv-python pillow numpy

3.2 完整代码

importcv2importnumpyasnpfromPILimportImagedefcreate_mask_grabcut(input_path:str,output_path:str="mask.png",margin:float=0.05,iterations:int=10,smooth:bool=True):""" 使用 GrabCut 算法从图片中提取前景轮廓,生成词云蒙版 参数: input_path: 原始图片路径 output_path: 蒙版输出路径 margin: 初始矩形框的边距比例(0.05 表示四边各留 5%) iterations: GrabCut 迭代次数,越大越精细,但越慢 smooth: 是否对轮廓做形态学平滑处理 """img=cv2.imread(input_path)ifimgisNone:raiseFileNotFoundError(f"无法读取图片:{input_path}")h,w=img.shape[:2]# 1. GrabCut 初始化参数mask=np.zeros((h,w),np.uint8)bgd_model=np.zeros((1,65),np.float64)fgd_model=np.zeros((1,65),np.float64)# 2. 初始矩形框:告诉算法"主体大概在这个范围内"rect=(int(w*margin),int(h*margin),int(w*(1-2*margin)),int(h*(1-2*margin)))# 3. 运行 GrabCutcv2.grabCut(img,mask,rect,bgd_model,fgd_model,iterations,cv2.GC_INIT_WITH_RECT)# 4. 分离前景和背景# GrabCut 输出: 0=确定背景, 1=确定前景, 2=可能背景, 3=可能前景# 前景(1,3) → 黑色(填词区域)# 背景(0,2) → 白色(留空区域)result=np.where((mask==cv2.GC_FGD)|(mask==cv2.GC_PR_FGD),0,255).astype(np.uint8)# 5. 可选:形态学处理,让轮廓更平滑ifsmooth:kernel=np.ones((5,5),np.uint8)# 闭运算:填充轮廓内的小孔洞result=cv2.morphologyEx(result,cv2.MORPH_CLOSE,kernel,iterations=2)# 开运算:去除轮廓外的小噪点result=cv2.morphologyEx(result,cv2.MORPH_OPEN,kernel,iterations=1)# 6. 保存为 RGB 图片mask_rgb=np.stack([result,result,result],axis=2)Image.fromarray(mask_rgb).save(output_path)print(f"蒙版已保存至:{output_path}")returnmask_rgbif__name__=='__main__':create_mask_grabcut("mickey.png","mickey_mask.png")

3.3 GrabCut 算法原理

  1. 你给一个矩形框,告诉算法"主体大概在这个范围"
  2. 框外的像素直接标记为背景
  3. 框内的像素,算法根据颜色分布建立前景/背景的高斯混合模型
  4. 迭代优化,逐步分离前景和背景

3.4 参数调优

如果默认效果不够好,可以调整以下参数:

参数作用默认值调整建议
margin矩形框边距0.05主体偏小时改为 0.1~0.2
iterations迭代次数10边缘粗糙时增大到 15~20
smooth形态学平滑True轮廓有锯齿时保持开启

四、方法三:基于透明度提取(适用于 PNG 透明图)

​ 如果图片本身就是透明背景的 PNG(比如从设计稿导出的素材),可以直接利用 alpha 通道:

fromPILimportImageimportnumpyasnpdefcreate_mask_from_alpha(input_path:str,output_path:str="mask.png",threshold:int=128):""" 从 RGBA 透明图片的 alpha 通道生成蒙版 参数: threshold: alpha 阈值,大于此值视为前景 """img=Image.open(input_path).convert("RGBA")arr=np.array(img)alpha=arr[:,:,3]# alpha 高于阈值 → 前景(黑色),否则 → 背景(白色)result=np.where(alpha>threshold,0,255).astype(np.uint8)mask_rgb=np.stack([result,result,result],axis=2)Image.fromarray(mask_rgb).save(output_path)print(f"蒙版已保存至:{output_path}")returnmask_rgbif__name__=='__main__':create_mask_from_alpha("mickey_transparent.png","mickey_mask.png")

五、方法选择

方法依赖适用场景效果
剪影图PIL网上能找到现成剪影图最好
GrabCutOpenCV任意彩色图片,背景不限
Alpha 通道PIL已有透明背景的 PNG 素材

推荐流程:先搜剪影图,搜不到再用 GrabCut,手上有透明 PNG 就直接用 Alpha 通道。

六、常见问题

问题原因解决方案
词云是矩形,没有按轮廓填充蒙版背景不是纯白(255,255,255)检查图片背景是否纯白
轮廓边缘有锯齿GrabCut 边缘不够精细增大iterations,开启smooth
轮廓内部有空洞主体内部有浅色区域被误判为背景增大闭运算的iterations
词云太稀疏蒙版面积太大或max_words太小增大max_words或裁剪蒙版
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/3 15:26:23

IP转换器解决PLC跨网段通信难题

工厂随着生产规模逐渐扩大,增加了越来越多的新的自动化设备,但同时部分老设备也在继续运行。这时如果没有正确配置网络并更新网络规划,这些设备可能会发生IP冲突的情况,导致设备无法通信,MES、ERP等信息化管理平台得不…

作者头像 李华
网站建设 2026/6/10 13:00:44

挑战一周带Java程序员精通SpringBoot?

大家可以回想一下,当初我们最开始学习Java的时候,搭建一个Web所需要的步骤。。。1、配置web.xml,加载spring和spring mvc2、配置数据库连接、配置spring事务3、配置加载配置文件的读取,开启注解4、配置日志文件...5、配置完成之后…

作者头像 李华
网站建设 2026/5/28 16:00:41

KubeEdge 云端+边缘节点一键部署脚本

KubeEdge 云端+边缘节点一键部署脚本,脚本基于 Ubuntu 20.04/22.04 环境(云端需单节点 K8s,边缘节点需联网),兼顾易用性和稳定性。 一、前置条件说明 云端节点: 操作系统:Ubuntu 20.04/22.04(推荐 2核4G 及以上) 已安装 Docker、kubeadm/kubelet/kubectl(K8s 1.24+)…

作者头像 李华
网站建设 2026/6/10 13:01:25

从《机械公敌》到人类雇主:AI正在学会“租用”我们的双手

01 引言 2004年的电影《机械公敌》中,威尔史密斯饰演的警探戴尔斯普纳对产生了自主意识的机器人充满怀疑,那个世界中的NS-5机器人被设计为“完美仆人”,却最终成为人类的威胁。 原本只是电影的桥段,却似乎慢慢的映射到现实中。 02…

作者头像 李华
网站建设 2026/6/10 13:02:09

定稿前必看!本科生必备降AI率工具 —— 千笔·降AI率助手

在AI技术迅速渗透学术写作领域的当下,越来越多的本科生开始借助AI工具辅助完成论文撰写。然而,随着查重系统对AI生成内容的识别能力不断提升,AI率超标已成为影响论文通过的关键问题。面对市场上琳琅满目的降AI率与降重复率工具,许…

作者头像 李华