Python图像分割实战|QuickShift超像素分割(修复BUG+完整可运行代码)
✨ 干货前言
在计算机视觉领域中,超像素分割是非常基础且重要的预处理操作。它可以将图像中相似的像素自动聚类、合并成语义连贯的小块,极大减少后续图像处理的计算量,广泛应用于目标检测、图像语义分割、图像抠图等场景。
今天给大家分享 QuickShift 快速移位分割算法 的 Python 实战代码。网上多数原版代码都存在颜色错乱、图片保存失败、黑屏报错等问题,本文已经全部修复优化,代码开箱即用,新手也能直接跑通!
💡 原代码常见BUG汇总
很多同学运行原始 QuickShift 代码时,会遇到各种报错和效果异常问题,核心原因主要有4点:
颜色空间不匹配:OpenCV 读取图像为 BGR 格式,而 skimage 算法仅支持 RGB 格式,直接运行会导致分割错乱、色彩失真。
数据类型错误:mark_boundaries 输出 0-1 浮点数图像,直接乘255不转类型,会出现图片全黑、保存失败问题。
路径报错:未自动创建输出文件夹,无对应目录时代码直接终止报错。
无异常校验:未判断图片是否读取成功,路径错误时无提示,新手难以排查问题。
🚀 优化后完整可运行代码
以下代码已修复所有BUG,新增路径校验、格式转换、结果可视化,兼容所有版本环境,直接复制即可运行!
import cv2import numpy as npimport osfrom skimage.segmentation import quickshift, mark_boundaries# 自动创建输出文件夹,避免路径报错os.makedirs("../tmp", exist_ok=True)# 定义图像输入、输出路径input_path = "../data/35.png"output_path = "../tmp/result.png"# 读取图像并校验读取状态img = cv2.imread(input_path)if img isNone:raise FileNotFoundError(f"无法读取图像:{input_path},请检查图片路径!")# 核心:BGR转RGB,适配skimage算法img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# QuickShift超像素分割参数配置max_dist = 300# 像素聚类最大距离ratio = 0.1# 颜色空间权重kernel_size = 10# 图像平滑核大小# 执行超像素分割segments = quickshift( img_rgb, kernel_size=kernel_size, max_dist=max_dist, ratio=ratio, convert2lab=True# 转换Lab颜色空间,分割效果最优)# 绘制分割边界(黑色边界线)result = mark_boundaries(img_rgb, segments, color=(0, 0, 0))# 格式转换:浮点数转OpenCV可识别的0-255整数格式result = (result * 255).astype(np.uint8)# RGB转回BGR,适配OpenCV保存规则result_bgr = cv2.cvtColor(result, cv2.COLOR_RGB2BGR)# 保存分割结果cv2.imwrite(output_path, result_bgr)# 可视化展示结果cv2.imshow("QuickShift图像分割结果", result_bgr)cv2.waitKey(0)cv2.destroyAllWindows()
📖 核心代码逐段解析
1. 环境与路径预处理
通过 os.makedirs 自动创建输出目录,无需手动新建文件夹,彻底解决路径不存在的报错问题;同时增加图像读取校验,精准定位路径错误问题。
2. 颜色空间转换(关键步骤)
OpenCV 默认读取 BGR图像,而 skimage 所有图像算法均基于 RGB 格式,必须通过 cv2.COLOR_BGR2RGB 转换,否则分割效果完全失效、图片颜色错乱。
3. QuickShift 分割核心逻辑
算法基于颜色和空间距离对像素进行聚类,convert2lab=True会将图像转为 Lab 颜色空间,相比 RGB 空间,对色彩差异更敏感,分割边界更精准。
4. 图像格式修复
mark_boundaries 输出的是0~1浮点数矩阵,OpenCV 仅支持 0~255 的 uint8 整数格式,必须通过 .astype(np.uint8) 转换,否则保存图片为全黑无效图。
⚙️ 核心参数调优指南
参数直接决定分割效果,按需调整即可适配不同场景的图片,新手直接参考下表调参:
| | |
|---|
| | |
| | 数值越大,合并像素越多,分割块数量越少、整体更粗犷 |
| | |
| | |
📦 运行环境配置
执行以下 pip 命令,一键安装所有依赖库:
pip install opencv-python scikit-image numpy
🎯 自定义修改小技巧
修改分割边界颜色:修改 color=(0,0,0) 参数,例如红色边界 (1,0,0)、绿色边界 (0,1,0)。
调整分割精细度:想要更多细碎分割块,减小 max_dist、增大 ratio;想要更少更大的分割块,反向调整参数即可。
更换图片路径:直接修改 input_path 为自己的图片绝对/相对路径。
📝 总结
QuickShift 是一款高效、稳定的无监督超像素分割算法,无需训练模型即可实现图像智能分割,非常适合作为计算机视觉的预处理步骤。
本文彻底修复了网上通用代码的各类报错问题,优化了参数和代码结构,代码健壮性更强、运行效果更稳定,新手可以直接复用学习!
后续可以基于该分割结果,拓展实现图像降噪、区域特征提取、语义分割预处理等进阶操作~