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

 更新时间:2021年09月01日 16:00:41   作者:liyuanbhu  
这篇文章主要介绍了OpenCV机器学习MeanShift算法笔记分享,有需要的朋友可以借鉴参考下,希望可以对各位读者的OpenCV算法学习能够有所帮助

MeanShift算法

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

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

pyrMeanShiftFiltering

meanShift

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

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

在这里插入图片描述

之后用这个直方图数据在另外一个图像中用 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);

在这里插入图片描述

最后 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);

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

在这里插入图片描述

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

    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);

在这里插入图片描述

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

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

相关文章

  • python循环输出三角形图案的例子

    python循环输出三角形图案的例子

    今天小编就为大家分享一篇python循环输出三角形图案的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • centos7之Python3.74安装教程

    centos7之Python3.74安装教程

    这篇文章主要介绍了centos7之Python3.74安装教程,本文给大家介绍的非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-08-08
  • 深入理解Python中的函数参数传递机制

    深入理解Python中的函数参数传递机制

    在Python中,对于函数的参数传递,有两种主要的方式:传值和传引用。事实上,Python的参数传递是一种“传对象引用”的方式,本文呢我们将详细介绍Python的函数参数传递机制,这对理解Python编程语言的底层实现以及优化你的代码都非常有帮助
    2023-07-07
  • 记录Python脚本的运行日志的方法

    记录Python脚本的运行日志的方法

    这篇文章主要介绍了记录Python脚本的运行日志的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Python装饰器基础概念与用法详解

    Python装饰器基础概念与用法详解

    这篇文章主要介绍了Python装饰器基础概念与用法,结合实例形式详细分析了Python装饰器的概念、功能、用法及相关操作注意事项,需要的朋友可以参考下
    2018-12-12
  • Python爬虫包BeautifulSoup实例(三)

    Python爬虫包BeautifulSoup实例(三)

    这篇文章主要为大家详细介绍了Python爬虫包BeautifulSoup实例,具有一定的参考价值,感兴趣的朋友可以参考一下
    2018-06-06
  • Python中mmap模块处理大文本的操作方法

    Python中mmap模块处理大文本的操作方法

    这篇文章主要介绍了Python中mmap模块(处理大文本),将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存映射读写取代I/O缓存读写,以获得较高的性能,需要的朋友可以参考下
    2023-02-02
  • Python Dask库处理大规模数据集的强大功能实战

    Python Dask库处理大规模数据集的强大功能实战

    Dask是一个灵活、开源的Python库,专为处理大规模数据集而设计,与传统的单机计算相比,Dask能够在分布式系统上运行,有效利用集群的计算资源,本文将深入介绍Dask的核心概念、功能和实际应用,通过丰富的示例代码展示其在大数据处理领域的强大能力
    2023-12-12
  • Python连接MySQL并使用fetchall()方法过滤特殊字符

    Python连接MySQL并使用fetchall()方法过滤特殊字符

    这篇文章主要介绍了Python连接MySQL的方法并讲解了如何使用fetchall()方法过滤特殊字符,示例环境为Ubuntu操作系统,需要的朋友可以参考下
    2016-03-03
  • python实现简单俄罗斯方块

    python实现简单俄罗斯方块

    这篇文章主要为大家详细介绍了python实现简单俄罗斯方块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03

最新评论