news 2026/4/18 5:15:05

【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/4/18 10:50:08

基于YOLO26的智能道路监测的坑洼分割系统

💡💡💡本文摘要:基于YOLO26的智能道路监测的坑洼分割检测系统,阐述了整个数据制作和训练可视化过程 博主简介 ​ AI小怪兽 | 计算机视觉布道者 | 视觉检测领域创新者 深耕计算机视觉与深度学习领域,专注…

作者头像 李华
网站建设 2026/4/14 2:00:15

固定资产管理软件是什么:2026年有哪些主流品牌推荐

在数字化转型加速的今天,资产管理已成为企业降本增效、规避风险的核心环节。然而,多数企业仍深陷传统资产管理的困境,而专业的资产管理软件,正是破解这些痛点、实现资产精细化管控的关键抓手。 一、资产管理软件的价值 告别手工盘…

作者头像 李华
网站建设 2026/4/17 22:07:44

如何将文件从 PC 无线传输到 Android

如果您需要将文件从 PC 无线传输到 Android,有很多无线选项可供选择。然而,并非所有选项都安全可靠。为了帮助您无需 USB 数据线即可安全地发送文件,我们在本文中总结了 7 种方法和 3 个必知常见问题解答。如果您需要,请继续阅读。…

作者头像 李华
网站建设 2026/4/17 20:00:38

Qt之多线程和并发_P4

本节主要介绍线程死锁,会从三个方面介绍:什么是线程死锁、死锁产生的条件和原因分析、死锁的规避,并配有示例程序详细分析死锁的原因和解决方案。 文章目录 线程死锁的概念 什么叫死锁 死锁条件 死锁示例 场景1:重复锁定同一个互斥量 场景2:递归调用 场景3:锁顺序反转 场…

作者头像 李华
网站建设 2026/4/18 6:43:47

好写作AI:收到评审意见后,让AI帮你把“重投”变成“接收”

导语:当邮箱弹出“Decision: Major Revision”时,你的心跳是不是漏了一拍?每个投过稿的硕博生都懂那种感觉:打开评审意见前,需要做十分钟心理建设看到“建议拒绝”时,大脑瞬间空白三秒面对二十条修改意见&a…

作者头像 李华