【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(St)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)  # 初始化 SLICslic.iterate(10)  # 迭代次数,越大效果越好mask_slic = slic.getLabelContourMask()  # 获取 Mask,超像素边缘 Mask==1img_slic = cv2.bitwise_and(img, img, mask=cv2.bitwise_not(mask_slic))  # 在原图上绘制超像素边界# SEEDS 算法,注意图片长宽的顺序为 w, h, cseeds = cv2.ximgproc.createSuperpixelSEEDS(img.shape[1], img.shape[0], img.shape[2], 2000, 15, 3, 5, True)seeds.iterate(imgHSV, 10)  # 输入图像大小必须与初始化形状相同,迭代次数为10mask_seeds = seeds.getLabelContourMask()  # 获取 Mask,超像素边缘 Mask==1label_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篇】171.SLIC 超像素区域分割
【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较
【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割
【youcans 的 OpenCV 例程200篇】174.LSC 超像素区域分割
【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

能否组成三角形

根据三角形三边长判断是否可以组成一个三角形,如果输入的不对会给出相应的提示。 结果演示 代码演示 package com.nine; import java.util.Scanner; public class ZhiJiao {public static void main(String[] args) {Scanner scan new Scanner(System.in);System…

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

【OpenCV 例程200篇 总目录-202206更新】** 【youcans 的 OpenCV 例程200篇】174.LSC 超像素区域分割 5.5 LSC 超像素区域分割 线性谱聚类(Linear Spectral Clustering,LSC)是 SLIC 的改进方案,可以生成紧凑且均匀的超像素&…

修改SqlServer的登录密码

我们每次打开SqlServer数据库的时候首先会让我们登录用户名和密码,那么我们如何修改之前设定的密码呢? 1.打开我们的SqlServer 2.点击安全性,选择自己登录SqlServer的账户双击看到如下页面 3.在密码和确认密码的输入框中修改我们的新密码。…

java递归栈_java-66-用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。颠倒之后的栈为{5,4,3,2,1},5处在栈顶...

import java.util.Stack;public class ReverseStackRecursive {/*** Q 66.颠倒栈。* 题目:用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。* 颠倒之后的栈为{5,4,3,2,1},5处在栈顶。*1. Pop the top element*2. Reverse the remaining st…

Redis DeskTop Manager 使用教程

redis desktop manager windows 是一款能够跨平台使用的开源性redis可视化工具。 redis desktop manager主要针对redis开发设计,拥有直观强大的可视化界面,具有完善全面的数据操作功能,可以针对目标key执行rename,delete&#xf…

【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较

【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较 5.2 基于超像素的区域分割 超像素图像分割基于依赖于图像的颜色信息及空间关系信息,将图像分割为远超于目标个数、远小于像素数量的超像素块,达到尽可能保留图像中所有目标的边缘信息的目的…

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 Mean Shift

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法(框选前景) 【youcans 的 OpenCV 例程200篇】179.图像分割…

在线答题系统

使用Jquery制作了一个在线答题系统 功能分析 1.开始界面 2.结束界面 3.题目的内容和选项的选择 4.题目的切换 5.分数的计算 6.判断是否选中选项 效果演示 代码演示 一 . html代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht…

【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法&#xff08;框选前景&#xff09; 【youcans 的 OpenCV 例程200篇】179.图像分割…

element 搜索匹配_分享一个element-ui级联选择器的搜索问题,顺便问下有没有解决方案。...

楼主做的是一个三级联动的城市筛选&#xff0c;后台给过来的数据并不全是按照label, value, children的key给到我&#xff0c;数据格式但是官方的props只能指到一级&#xff0c;具体指到2-3级我还不没弄明白。于是 &#xff0c; 需要自己转换:options"options"v-mode…

【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法(框选前景)

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法&#xff08;框选前景&#xff09; 【youcans 的 OpenCV 例程200篇】179.图像分割…

点击出现小心心

使用鼠标的点击事件&#xff0c;使用鼠标点击任意地方的时候&#xff0c;点击的地方会出现一个小心&#xff0c;每一次出现的小心的颜色都不一样。 原理分析 1.设置点击的范围 2.鼠标点击事件 3.记录鼠标点击的位置在此位置出现一颗小心 4.小心向上浮动并且自动消失 5.小心颜色…

【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法(掩模图像)

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法&#xff08;框选前景&#xff09; 【youcans 的 OpenCV 例程200篇】179.图像分割…

VScode 透明背景设置

我们通常使用VScode开发项目&#xff0c;时间长了不免有些疲惫&#xff0c;在此教给大家一个设置VScode 透明背景的方法&#xff0c;给大家的代码之旅带来一点乐趣。 1.首先在vscode扩展中&#xff0c;找到并下载background这个插件&#xff0c;快捷键Ctrlshiftx 2.完成第一步…

【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法 【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】183.基…

IDEA设置主题和背景图片

我们使用IDEA开发的时候长期使用一种主题会感到沉重&#xff0c;那麽我们如何为IDEA设置我们自己想要的背景图片呢&#xff1f;&#xff1f;&#xff1f; 一 . 设置主题 Idea主题自带的有三种&#xff1a;1、黑色模式 2、Intellij模式 3、高对比度模式&#xff1b; 具体修改步…

【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法 【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】183.基…

java concurrent int_java.util.concurrent.AtomicInteger

AtomicInteger&#xff0c;一个提供原子操作的Integer的类。在Java语言中&#xff0c;i和i操作并不是线程安全的&#xff0c;在使用的时候&#xff0c;不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。来看AtomicInteger提供的接口。//…

IDEA创建SpringBoot

对于SpringBoot的开发我们使用IDEA工具是非常方便的&#xff0c;不仅开发效率高&#xff0c;而且代码能自动添加补全&#xff0c;那麽我们如何使用IDEA创建SpringBoot项目呢&#xff1f;&#xff1f;&#xff1f; 1.使用IntelliJ IDEA 内置的Spring Initializr来创建SpringBoo…

【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法 【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】183.基…