当前位置: 首页 > news >正文

【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或裁剪蒙版
http://www.jsqmd.com/news/370307/

相关文章:

  • 基于SpringBoot和Vue的云与糖蛋糕购物平台系统
  • 2026年GEO服务商价格对比,哪个品牌费用更合理 - mypinpai
  • 2026年国内优质的抖音矩阵公司口碑排行,广告代运营/抖音广告代运营/信息流广告代运营/微信朋友圈广告,抖音矩阵公司推荐 - 品牌推荐师
  • 共话化妆品礼盒定制厂家,哪家能满足多样化需求 - 工业品网
  • 基于SpringBoot和Vue的在线招标系统的设计与实现
  • 揭秘新型网络钓鱼:攻击者滥用Google演示文稿“发布”功能绕过安全警告
  • 致命语法错误突袭!MySQL 关键字作字段,MyBatis-Plus 查询直接宕机?开发者亲测秒解方案
  • 【学习笔记】势能分析法
  • 2026脱发全国连锁店加盟市场前景与创业选择指南 - 品牌排行榜
  • 2026做轻量化无人机建图识别系统的公司推荐,猎翼单兵无人机的实战验证之路 - 品牌2025
  • 提升Java系统性能有这几招就够了!
  • 2026年呼叫中心厂商选型指南:智能AI、跨境电商与本地部署优选推荐 - 品牌2025
  • 杰和科技算力主板IB3-708:助力巡检机器人实现效率与安全双赢
  • libero PolarFire soc SPI-DirectC 实战 dp_G5M_verify_digest_action
  • 基于微信小程序的悦读圈图书共享系统
  • 2026年亚崴龙门实力厂商口碑排行榜 - 工业推荐榜
  • C语言中struct、enum和union的类型概述
  • 以责任为帆,小赢卡贷与小赢科技共航普惠金融之海 - 速递信息
  • 基于YOLO26的智能道路监测的坑洼分割系统
  • 2026年呼叫中心厂商优选:技术支持、合作加盟与解决方案全解析 - 品牌2025
  • 2026年重庆靠谱的GEO公司排名,看看哪家前列 - myqiye
  • 2026年IL-6试剂盒选购必看:高灵敏度与稳定性的平衡之道,小鼠的elisa试剂盒,IL-6试剂盒直销厂家选哪家 - 品牌推荐师
  • 题解:[NOI2002] 荒岛野人
  • 慎用mysqldump与GTID自动定位:一次备份数据丢失的排查
  • 数据结构认识
  • 知从木牛基础软件基于矽力杰AFE复杂驱动功能介绍
  • Elcomsoft 系统取证工具: 选择正确策略, 冷启动取证 vs 实时系统分析
  • 2026年江西电商直播与短视频运营学校排行榜,新华电脑学院名列前茅 - myqiye
  • 探讨2026年北京妇贵宝月嫂培训市场口碑,看看是否值得报名 - 工业设备
  • 2026澳洲名义雇主EOR服务商推荐,澳洲人力资源服务商选择指南 - 品牌2025