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

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法
【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法
【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法(框选前景)
【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法(掩模图像)
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】


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


5.6 图像分割之均值漂移算法

均值漂移算法(Mean Shift)是一种基于模式识别的特征空间分析方法,提供了一种目标描述与定位的算法框架。

均值漂移算法的基本思想是,通过反复迭代搜索特征空间中样本最密集的区域,搜索点沿着样本点密度增加的方向“漂移”到局部密度极大值点。采用基于核密度估计的爬山算法,自适应调整步长进行迭代搜索,可以收敛到局部极值。

基于 Mean Shift 的目标跟踪技术采用核概率密度描述目标特征,对于图像分割通常采用直方图对目标建模,然后通过相似性度量搜索目标位置,实现目标的匹配与跟踪。

对于图像分割,通常将 RGB 图像映射到 LUV 颜色特征空间,结合位置信息可以构造 5维特征变量 (x,y,l,u,v)。均值漂移算法不仅可以应用于二维图像处理,也可以用于高维数据处理。可以通过选取不同的核函数,来改变区域当中偏移向量的权重。

均值漂移算法将目标特征与空间信息有效结合,避免使用复杂模型描述目标形状、外观和运动,因此对边缘遮挡、目标旋转、变形和背景运动不敏感,能够适应目标的形状、大小的连续变换,而且计算速度快、抗干扰能力强。

均值漂移算法的缺点是:
(1)缺乏必要的模板更新;
(2)跟踪过程中由于窗口宽度大小保持不变,当目标尺度变化时,跟踪就会失败;
(3)当目标速度较快时,跟踪效果不好;
(4)直方图特征在目标颜色特征描述方面略显匮乏,缺少空间信息;

对于这些缺点,在工程实际中可以进行改进:
(1)引入目标位置变化的预测机制,以减少跟踪的搜索时间,降低计算量;
(2)将传统算法中的核函数固定带宽改为动态变化的带宽;
(3)使用前一帧的目标跟踪结果作为目标跟踪模板。

OpenCV 也提供了函数 cv.meanShift 实现均值漂移算法,该函数只考虑颜色相似性,不考虑像素的位置坐标。

该函数采用目标对象的输入反投影和初始位置,通过迭代搜索算法,计算反投影图像窗口中的质心,将搜索窗口中心移向质心,直到达到迭代终止条件。

函数说明:

cv.meanShift(probImage, window, criteria[, ]) →	retval, window

cv.meanshift() 函数使用时要先设定目标,需要提供目标的初始窗口位置,计算 HSV 模型中 H (色调)的直方图。为了减少低亮度的影响,可以使用 cv.inRange() 将低亮度值忽略。

参数说明:

  • probImage:对象直方图的反向投影,参见 calcBackProject
  • window:初始的搜索窗口
  • criteria:迭代搜索的终止条件

注意事项:

  • 如果对反投影进行预滤波并去除噪声,可以获得更好的结果。
  • 可以通过使用 findContours 检索连接的组件,丢弃面积较小的轮廓(contourArea),并使用drawContours渲染其余轮廓来实现。
  • OpenCV 中的另一个函数 pyrMeanShiftFiltering(),是图像在色彩层面的平滑滤波,可以中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域。

例程 11.33: 图像分割之均值漂移算法

    # 11.33 图像分割之均值漂移算法def meanShiftTracker(src, trackWindow):# meanShift 算法: 在 dst 寻找目标窗口,找到后返回目标窗口位置hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)  # BGR-HSV 转换dst = cv2.calcBackProject([hsv], [0], roiHist, [0, 180], 1)  # 计算反向投影term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)_, trackWin = cv2.meanShift(dst, trackWindow, term_crit)x, y, w, h = trackWinimgTrack = src.copy()imgTrack = cv2.rectangle(imgTrack, (x, y), (x + w, y + h), 255, 2)print(x, y, w, h)return imgTrack# if __name__ == '__main__':  # 图像分割之均值漂移算法img = cv2.imread("../images/FigCross1.png", flags=1)  # 基准参考图像imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV_FULL)  # BGR-HSV 转换# 设置初始化的窗口位置# print("Select a ROI and then press SPACE or ENTER button!\n")# roi = cv2.selectROI(img, showCrosshair=True, fromCenter=False)# x0, y0, w, h = roi  # 矩形裁剪区域 (ymin:ymin+h, xmin:xmin+w) 的位置参数# rect = (x0, y0, w, h)  # 边界框矩形的坐标和尺寸  # rect = (990 311 94 72)(x0, y0, w, h) = (990, 310, 95, 72)  # 直接设置矩形窗口的位置参数,也可以鼠标框选 ROItrackWindow = (x0, y0, w, h)  # 矩形 ROIprint(x0, y0, w, h)imgROI = np.zeros_like(img)  # 创建与 image 相同形状的黑色图像imgROI[y0:y0+h, x0:x0+w] = img[y0:y0+h, x0:x0+w].copy()frameROI = imgROI[y0:y0+h, x0:x0+w]  # 设置追踪的区域roiHSV = cv2.cvtColor(frameROI, cv2.COLOR_BGR2HSV)  # BGR-HSV 转换# 取 HSV 在 (0,60,32)~(180,255,255) 之间的部分mask = cv2.inRange(roiHSV, np.array((0., 60., 32.)), np.array((180., 255., 255.)))roiHist = cv2.calcHist([roiHSV], [0], mask, [180], [0, 180])  # 计算直方图cv2.normalize(roiHist, roiHist, 0, 255, cv2.NORM_MINMAX)  # 归一化# # meanShift 算法: 在 dst 寻找目标窗口,找到后返回目标窗口位置img1 = cv2.imread("../images/FigCross2.png", flags=1)  # 读取彩色图像(BGR)imgTrack1 = meanShiftTracker(img1, trackWindow)img2 = cv2.imread("../images/FigCross4.png", flags=1)  # 读取彩色图像(BGR)imgTrack2 = meanShiftTracker(img2, trackWindow)plt.figure(figsize=(10, 6))plt.subplot(231), plt.axis('off'), plt.title("Initial image")plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 显示 img(RGB)plt.subplot(234), plt.axis('off'), plt.title("ROI image")plt.imshow(cv2.cvtColor(imgROI, cv2.COLOR_BGR2RGB))  # 显示 img(RGB)plt.subplot(232), plt.axis('off'), plt.title("image 1")plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))  # 显示 img(RGB)plt.subplot(235), plt.axis('off'), plt.title("image track 1")plt.imshow(cv2.cvtColor(imgTrack1, cv2.COLOR_BGR2RGB))  # 显示 img(RGB)plt.subplot(233), plt.axis('off'), plt.title("image 2")plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))  # 显示 img(RGB)plt.subplot(236), plt.axis('off'), plt.title("image track 2")plt.imshow(cv2.cvtColor(imgTrack2, cv2.COLOR_BGR2RGB))  # 显示 img(RGB)plt.tight_layout()plt.show()

在这里插入图片描述

程序说明:

均值漂移算法进行图像分割的效果并不是很好,所以 img2 中的目标并未成功追踪,这是由于拍摄角度导致目标物体运动后的尺寸发生了变化。不过,如果应用于视频跟踪,每次使用上一帧的目标窗口作为追踪区域,而不是一直使用初始目标窗口,由于目标在相邻帧的尺寸变化很小,可以解决这个问题。


(本节完)


版权声明:

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

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


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

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法
【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法
【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法(框选前景)
【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法(掩模图像)
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】

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

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

相关文章

在线答题系统

使用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.基…

procyon java8_java jdk 8反编译工具JD-GUI、procyon-decompiler、luyten、crf下载使用简介

本文对常用的反编译工具进行简单介绍JD-GUI、procyon-decompiler、luyten、crf反编译工具分类JD-GUIJDK7以及之前可以使用 JD-GUI&#xff0c;如果版本>1.8 各种问题http://java-decompiler.github.ioprocyon-decompiler如果版本>1.8 &#xff0c;可以使用 procyon-dec…

SpringBoot页面出现 Whitelabel Error Page

我们运行SpringBoot项目之后需要通过Tomcat进行访问&#xff0c;但是我们访问的时候出现了Whitelabel Error Page的错误&#xff0c;我们该如何解决呢&#xff1f;&#xff1f;&#xff1f; 错误页面 究其原因是我们的主程序缺少一个RestController的注解。 没有使用RestCon…

SpringBoot入门小案例

使用SpringBoot项目输出一个hello SpringBoot的入门小项目。 1.再IDEA中创建SpringBoot项目&#xff0c;创建完成如下所示。 2.项目创建完后打开包结构&#xff0c;WebApplication是项目的入口&#xff0c;是启动类&#xff0c;SpringBootApplication&#xff0c;这个注解非常…

【youcans 的 OpenCV 例程200篇】183.基于轮廓标记的分水岭算法

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

【youcans 的 OpenCV 例程200篇】184.鼠标交互标记的分水岭算法

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

【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔 6. 图像金字塔 图像金字塔是一种以多分辨率来解释图像的结构&#xff0c;常用于图像分割、图像压缩和机器视觉。 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列…

【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔 图像金字塔是一种以多分辨率来解释图像的结构&#xff0c;常用于图像分割、图像压缩和机器视觉。 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步…