youcans 的 OpenCV 例程200篇172.SLIC 超像素区域分割算法比较
Posted 小白YouCans
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了youcans 的 OpenCV 例程200篇172.SLIC 超像素区域分割算法比较相关的知识,希望对你有一定的参考价值。
【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较
5. 区域分割之聚类方法
5.3 SLIC 超像素区域分割
SLIC 基于网格化 K-means 聚类方法,原理简单,计算复杂度为O(N),N 为像素点个数。
SLIC 通常使用包含三个颜色分量和两个空间坐标的五维向量,例如 z = [ r , g , b , x , y ] T z=[r,g,b,x,y]^T z=[r,g,b,x,y]T。以均匀的规则网格取样点的初始的聚类中心,用 k-means 聚类算法计算出聚类中心和边界。
对彩色图像可以使用 RGB 颜色空间,也可以转化为 CIELab 或其它颜色空间。对于灰度图像,则使用灰度级与空间坐标构成的三维向量。
SLIC 算法能生成紧凑、近似均匀的超像素,在运算速度,物体轮廓保持、超像素形状方面具有较高的综合评价,比较符合人们期望的分割效果。
SLIC 的优点是:(1)生成的超像素紧凑整齐,邻域特征比较容易表达;(2)可以应用于彩色图像或灰度图像;(3)参数设置少,基本参数只有超像素数量;(4)运行速度、超像素紧凑度、轮廓保持都比较理想。
OpenCV 在 ximgproc 模块提供了 cv.ximgproc.createSuperpixelSLIC 函数实现SLIC算法。
该函数用于初始化输入图像的 SuperpixelSLIC 对象。它设置所选超级像素算法的参数,即:区域大小和标尺。它为给定图像上的未来计算迭代预先分配了一些缓冲区。对于最终结果,建议彩色图像使用一个小的3 x 3内核预处理具有少量高斯模糊的图像,并将其额外转换为CieLAB颜色空间。SLIC与SLICO和MSLIC的对比示例如下图所示。
函数说明:
cv.ximgproc.createSuperpixelSLIC(image[, algorithm=SLICO, region_size=10, ruler=10.0f]) → retval
参数说明:
- image:原始图像
- algorithm:选择算法
- SLIC :使用所需的区域大小分割图像
- SLICO :使用自适应紧致因子进行优化
- MSLIC :使用流形方法进行优化
- region_size:区域尺寸,以像素为单位的超像素大小,默认值 10
- ruler:超像素的平滑因子,默认值 10
MSLIC 是对 SLIC 的优化,密集区域的超像素较小,稀疏区域的超像素较大,从而产生对内容更敏感的超像素。
例程 11.29: SLIC 超像素区域分割之算法比较
# 11.29 SLIC 超像素区域分割之算法比较
# 注意:本例程需要 opencv-contrib-python 包的支持
img = cv2.imread("../images/imgLena.tif", flags=1) # 读取彩色图像(BGR)
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV_FULL) # BGR-HSV 转换
plt.figure(figsize=(9, 7))
plt.subplot(221), plt.axis('off'), plt.title("Origin")
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) # 显示 img1(RGB)
algorithms = [
('SLIC', cv2.ximgproc.SLIC), # 使用所需的区域大小分割图像
('SLICO', cv2.ximgproc.SLICO), # 使用自适应紧致因子进行优化
('MSLIC', cv2.ximgproc.MSLIC)] # 使用流形方法进行优化,产生对内容更敏感的超像素
region_size = 20
ruler = 10
edgeColor = np.ones((img.shape[0], img.shape[1], 3), np.uint8) * 255
for i in range(3):
slic = cv2.ximgproc.createSuperpixelSLIC(imgHSV, algorithms[i][1], region_size, float(ruler))
slic.iterate(5) # 迭代次数,默认 10 次
slic.enforceLabelConnectivity(100) # 最小尺寸
mask_slic = slic.getLabelContourMask() # 获取Mask,超像素边缘Mask==1
mask_color = np.array([mask_slic for i in range(3)]).transpose(1, 2, 0) # 转为 3通道
img_slic = cv2.bitwise_and(img, img, mask=cv2.bitwise_not(mask_slic)) # 在原图上绘制超像素边界
plt.subplot(2,2,i+2), plt.axis('off'), plt.title("Slic ()".format(algorithms[i][0]))
plt.imshow(cv2.cvtColor(img_slic, cv2.COLOR_BGR2RGB))
plt.tight_layout()
plt.show()
(本节完)
版权声明:
OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124576598)
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篇172.SLIC 超像素区域分割算法比较的主要内容,如果未能解决你的问题,请参考以下文章
youcans 的 OpenCV 例程200篇184.鼠标交互标记的分水岭算法
youcans 的 OpenCV 例程200篇183.基于轮廓标记的分水岭算法