youcans 的 OpenCV 例程200篇173.SEEDS 超像素区域分割
Posted 小白YouCans
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了youcans 的 OpenCV 例程200篇173.SEEDS 超像素区域分割相关的知识,希望对你有一定的参考价值。
【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 超像素区域分割
以上是关于youcans 的 OpenCV 例程200篇173.SEEDS 超像素区域分割的主要内容,如果未能解决你的问题,请参考以下文章
youcans 的 OpenCV 例程200篇184.鼠标交互标记的分水岭算法
youcans 的 OpenCV 例程200篇183.基于轮廓标记的分水岭算法