OpenCV机器学习MeanShift算法笔记分享

作者:liyuanbhu 时间:2021-06-04 18:54:54 

MeanShift算法

Mean shift 是一种机器学习算法,并不仅仅局限于图像上的应用。关于 Mean shift 算法介绍的书和文章很多,这里就不多介绍了。简单的说,Meanshift 算法是一种迭代算法,需要给一个初始的区域,然后这个算法会反复的调整这个区域,使得这个区域最吻合我们期望的特征。

OpenCV 中有两处用到了 Mean Shift 。分别是:

pyrMeanShiftFiltering

meanShift

这里只介绍第二个函数的使用方法。

我们的原始图像还是上次那个向日葵的图像,我们选中其中一朵向日葵来计算 Histogram,但是这次我们计算 Hue 通道的 Histogram:

OpenCV机器学习MeanShift算法笔记分享

之后用这个直方图数据在另外一个图像中用 Meanshift 算法去找向日葵。

下面是代码,首先加载原始图像。在原始图像中找到向日葵,计算向日葵区域的 Histogram。


   cv::Mat image = cv::imread("D:\\向日葵.jpg");
   cv::Mat imageROI = image(cv::Rect(130, 250, 75, 75));
   ColorHistogram hist;
   cv::Mat h = hist.getHueHistogram(imageROI, 65);
   cv::imshow("pic", image);
   ContentFinder finder;
   finder.setHistogram(h);
   finder.setThreshold(-1.0f);

之后加载我们要探测的图像,做 backproject,得到概率分布图。


   cv::Mat image2 = cv::imread("D:\\02.jpg");
   cv::Mat hsv;
   cv::cvtColor(image2, hsv, CV_BGR2HSV);
   int ch[1] = {0};
   cv::Mat probImage = finder.find(hsv, 0.0, 180, ch);
   cv::Mat img_color;
   cv::applyColorMap(probImage, img_color, cv::COLORMAP_JET);
   cv::imshow("backproject", img_color);

OpenCV机器学习MeanShift算法笔记分享

最后 Meanshift 就是在右图中找出概率最大的那个区域。对于这个问题来说,其实做个遍历就行。

meanshift 相比遍历效率更高。但是如果初始区域选的不好,有可能会找不到向日葵所在的区域。

所以meanshift 并不是万能的。


   cv::Rect rect(100, 100, 200, 200);
   cv::rectangle(image2, rect, cv::Scalar(255,0,0));
//    cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER, 30, 1);
   cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS,
                             10,
                             1);
   cv::meanShift(probImage, rect, criteria);
   cv::rectangle(image2, rect, cv::Scalar(0,0,255));
   cv::imshow("image2", image2);

下面是输出结果,蓝框是我们随便选的初始区域,红框是得到的结果。可以看到准确的找到了向日葵所在区域。

OpenCV机器学习MeanShift算法笔记分享

如果我们初始区域选的不太好,就会找不到向日葵。比如下面的代码。


   cv::Rect rect(0, 0, 200, 200);
   cv::rectangle(image2, rect, cv::Scalar(255,0,0));
   cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS,
                             10,
                             1);
   cv::meanShift(probImage, rect, criteria);
   cv::rectangle(image2, rect, cv::Scalar(0,0,255));
   cv::imshow("image2", image2);

OpenCV机器学习MeanShift算法笔记分享

可以看到迭代了10次,但是区域一点没动。一般来说我们可以随机选择初始区域,如果一个区域 meanshift失败了,就再随机选另一个区域。这样试几次就能得到不错的结果。

以上就是OpenCV机器学习MeanShift算法笔记分享的详细内容,更多关于OpenCV机器学习的资料请关注脚本之家其它相关文章!

来源:https://blog.csdn.net/liyuanbhu/article/details/119978093

标签:OpenCV,机器学习,MeanShift,算法
0
投稿

猜你喜欢

  • Matlab实现图像边缘检测

    2021-02-06 07:40:58
  • 详解MybatisPlus集成nacos导致druid连接不上数据库

    2024-01-18 02:57:09
  • python并发编程 Process对象的其他属性方法join方法详解

    2022-03-07 04:29:54
  • Django 用户登陆访问限制实例 @login_required

    2021-05-26 07:31:22
  • Django REST framework 视图和路由详解

    2022-10-16 00:29:32
  • python中最小二乘法详细讲解

    2022-02-12 22:33:07
  • pytorch中tensor张量数据类型的转化方式

    2022-03-19 20:07:24
  • python使用win32com在百度空间插入html元素示例

    2021-09-13 17:00:13
  • django 实现简单的插入视频

    2023-12-24 09:59:33
  • python中的GUI实现计算器

    2022-04-18 02:29:05
  • Python:Scrapy框架中Item Pipeline组件使用详解

    2021-04-18 22:22:47
  • 实例详解Matlab 与 Python 的区别

    2021-07-20 22:14:15
  • python Pandas中数据的合并与分组聚合

    2023-06-28 12:48:04
  • apache和nginx下vue页面刷新404的解决方案

    2024-04-26 17:37:16
  • python interpolate插值实例

    2022-05-06 08:20:37
  • python面向对象之类属性和类方法案例分析

    2022-01-18 06:00:36
  • 基于SQL Server中如何比较两个表的各组数据 图解说明

    2024-01-22 06:36:03
  • plsql与tsql的语法不同

    2009-09-13 17:33:00
  • 使用Javascript面向对象的思想编写ASP

    2008-06-16 12:20:00
  • Python 海象运算符( :=)的三种用法

    2023-08-25 02:46:08
  • asp之家 网络编程 m.aspxhome.com