news 2026/5/2 11:13:57

【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/30 6:33:50

学长亲荐!万众偏爱的AI论文工具 —— 千笔

你是否曾为论文选题发愁,反复修改却仍不满意?是否在查重、格式、文献整理上耗费大量时间却收效甚微?研究生阶段的论文写作,本就充满挑战,而千笔AI正是为解决这些痛点而生。它不仅能够高效生成结构清晰的论文内容&#…

作者头像 李华
网站建设 2026/4/18 18:53:25

三个线程如何按顺序打印ABC?

这篇文章分享一道非常不错的题目:三个线程按序打印ABC。很多读者朋友应该都觉得这道题目不难,这次给大家带来十二种做法,一定有你没有见过的新姿势。1. synchronizedwaitnotify说到同步,我们很容易就想到synchronized。线程间通信…

作者头像 李华
网站建设 2026/5/2 1:47:00

骨折分类数据集-医学影像分析-6717张X光片-适用于大学生毕业设计-支持目标检测与分类模型训练-完整标注信息-骨折检测与分类-医学影像分析研究者和开发者-推动骨折检测算法的研发与优化

骨折分类数据集:医学影像分析的完整资源 引言与背景 在现代医学影像分析领域,骨折检测与分类是骨科诊断的重要环节。随着深度学习技术的快速发展,基于X光片的骨折自动识别系统逐渐成为辅助临床诊断的关键工具。本数据集为医学影像分析研究者…

作者头像 李华
网站建设 2026/5/1 3:39:59

php 随机红包数生成

无论哪种实现方式,随机红包都要遵守几个核心约束(这是和单纯随机数最大的区别):总金额固定(比如 100 元分 10 个红包);每个红包金额非空(至少 0.01 元,避免分到 0&#x…

作者头像 李华
网站建设 2026/5/2 0:28:14

AI智能体:知识变现的“执行引擎“如何重塑行业规则|创客匠人

最近,一款名为Clawdbot的AI工具在科技圈引发热议。与传统AI聊天机器人不同,它不是在陪用户聊天,而是能直接调用用户的日历、邮箱、Notion等工具,执行实际任务。这背后反映了一个被忽视的行业真相:知识变现的关键不是内…

作者头像 李华
网站建设 2026/4/24 1:57:54

RBAC前端架构-06:使用localstorage及Vuex用户信息存储逻辑

1-文件调整 修改frontend-vue2\src\store\index.js,用于整体整合Vuex更简洁 import Vue from "vue"; import Vuex from "vuex";// 标签页管理模块 import tabs from "./modules/tabs"; // 用户信息管理模块 import user from ".…

作者头像 李华