IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割 -> 正文阅读

[人工智能]【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割

OpenCV 例程200篇 总目录-202205更新


【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割


5.4 SEEDS 超像素区域分割

超像素个体应在视觉上一致,特别是颜色应尽可能均匀。SLIC 使用欧几里德距离来度量像素点的相似度,不能反映颜色的方差。

SEEDS 方法定义了一个基于超像素颜色分布直方图和超像素边界的形状的能量函数 E(s),使用爬山法最大化能量函数进行优化。
E ( s ) = H ( s ) + γ G ( s ) E(s) = H(s) + \gamma G(s) E(s)=H(s)+γG(s)
其中,H(s) 是颜色分布项,G(s) 是边界项。

颜色分布项基于概率密度分布直方图,使用熵值度量区域颜色的均匀性,以获得更多的全局信息;边界项在像素的邻域内统计超像素种类数量的概率密度分布,使用熵值度量区域种类的均匀性,有利于生成边缘平滑的超像素。

SEEDS 每次迭代只对处于超像素边界的像素点进行更新,通过能量函数的值来决定这个像素点是否转移到相邻的超像素块内。

SEEDS 使用爬山法来贪心地进行更新状态,算法时间复杂度为 O(n),可以在线性的时间复杂度内完成,速度比 SLIC 快。

算法的基本流程为:

(1)初始化超像素:以相同间隔设置 Superpixel 或 Seeds,计算初始的能量函数 E ( S t ) E(S_t) E(St?)
(2)更新能量函数:对边界上的每一个像素,计算移动后新的能量函数 E ( S ) E(S) E(S),如果能量函数增大则进行移动。
(3)迭代更新,直到达到次数上限,就得到最终的分割结果。


例程 11.30: SEEDS 超像素区域分割

OpenCV 在 ximgproc 模块提供了 cv.ximgproc.createSuperpixelSEEDS 函数,可以实现 SEEDS 算法。

函数说明:

cv.ximgproc.createSuperpixelSEEDS(image_width, image_height, image_channels, num_superpixels, num_levels[, prior[, histogram_bins[, double_step]]]) → retval

该函数初始化输入图像的 SuperpixelSEEDS 对象,初始状态是一个在图像高度和宽度上均匀分布的网格。

参数说明:

  • image_width:输入图像的宽度,像素数
  • image_height:输入图像的高度,像素数
  • image_channels:输入图像的通道数
  • num_superpixels:期望的超像素数量
  • num_levels:块级别的数量,级别越高分割越准确,但消耗内存和 CPU 时间大
  • prior:平滑参数,取值范围 [0,5],值越大则越平滑
  • histogram_bins:直方图分组数量
  • double_step:True 表示对每个块级别迭代两次以获得更高的精度

    # 11.30 SEEDS 超像素区域分割
    # 注意:本例程需要 opencv-contrib-python 包的支持
    img = cv2.imread("../images/imgLena.tif", flags=1)  # 读取彩色图像(BGR)
    imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV_FULL)  # BGR-HSV 转换

    # SLIC 算法
    slic = cv2.ximgproc.createSuperpixelSLIC(img, region_size=20, ruler=10.0)  # 初始化 SLIC
    slic.iterate(10)  # 迭代次数,越大效果越好
    mask_slic = slic.getLabelContourMask()  # 获取 Mask,超像素边缘 Mask==1
    img_slic = cv2.bitwise_and(img, img, mask=cv2.bitwise_not(mask_slic))  # 在原图上绘制超像素边界

    # SEEDS 算法,注意图片长宽的顺序为 w, h, c
    seeds = cv2.ximgproc.createSuperpixelSEEDS(img.shape[1], img.shape[0], img.shape[2], 2000, 15, 3, 5, True)
    seeds.iterate(imgHSV, 10)  # 输入图像大小必须与初始化形状相同,迭代次数为10
    mask_seeds = seeds.getLabelContourMask()  # 获取 Mask,超像素边缘 Mask==1
    label_seeds = seeds.getLabels()  # 获取超像素标签
    number_seeds = seeds.getNumberOfSuperpixels()  # 获取超像素数目
    img_seeds = cv2.bitwise_and(img, img, mask=cv2.bitwise_not(mask_seeds))

    plt.figure(figsize=(9, 7))
    plt.subplot(221), plt.axis('off'), plt.title("Origin image")
    plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 显示 img(RGB)
    plt.subplot(222), plt.axis('off'), plt.title("SEEDS mask")
    plt.imshow(mask_seeds, 'gray')
    plt.subplot(223), plt.axis('off'), plt.title("SLIC image")
    plt.imshow(cv2.cvtColor(img_slic, cv2.COLOR_BGR2RGB))
    plt.subplot(224), plt.axis('off'), plt.title("SEEDS image")
    plt.imshow(cv2.cvtColor(img_seeds, cv2.COLOR_BGR2RGB))
    plt.tight_layout()
    plt.show()

在这里插入图片描述


(本节完)


版权声明:

OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124576698)

Copyright 2022 youcans, XUPT
Crated:2022-5-4


欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中

【youcans 的 OpenCV 例程200篇】147. 图像分割之孤立点检测
【youcans 的 OpenCV 例程200篇】148. 图像分割之线检测
【youcans 的 OpenCV 例程200篇】149. 图像分割之边缘模型
【youcans 的 OpenCV 例程200篇】150. 边缘检测梯度算子
【youcans 的 OpenCV 例程200篇】151. 边缘检测中的平滑处理
【youcans 的 OpenCV 例程200篇】152. 边缘检测之 LoG 算子
【youcans 的 OpenCV 例程200篇】153. 边缘检测之 DoG 算子
【youcans 的 OpenCV 例程200篇】154. 边缘检测之 Canny 算子
【youcans 的 OpenCV 例程200篇】155. 边缘连接的局部处理方法
【youcans 的 OpenCV 例程200篇】156. 边缘连接局部处理的简化算法
【youcans 的 OpenCV 例程200篇】157. 霍夫变换直线检测
【youcans 的 OpenCV 例程200篇】158. 阈值处理之固定阈值法
【youcans 的 OpenCV 例程200篇】159. 图像分割之全局阈值处理
【youcans 的 OpenCV 例程200篇】160. 图像处理之OTSU 方法
【youcans 的 OpenCV 例程200篇】161. OTSU 阈值处理算法的实现
【youcans 的 OpenCV 例程200篇】162. 全局阈值处理改进方法
【youcans 的 OpenCV 例程200篇】163. 基于边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】164.使用 Laplace 边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】165.多阈值 OTSU 处理方法
【youcans 的 OpenCV 例程200篇】166.自适应阈值处理
【youcans 的 OpenCV 例程200篇】167.基于移动平均的可变阈值处理
【youcans 的 OpenCV 例程200篇】168.图像分割之区域生长
【youcans 的 OpenCV 例程200篇】169.图像分割之区域分离
【youcans 的 OpenCV 例程200篇】170.图像分割之K均值聚类
【youcans 的 OpenCV 例程200篇】171.SLIC 超像素区域分割
【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较
【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:39:40  更:2022-05-09 12:40:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:39:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码