OpenCV机器学习MeanShift算法笔记分享
作者:liyuanbhu 发布时间:2021-06-04 18:54:54
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机器学习的资料请关注脚本之家其它相关文章!
来源:https://blog.csdn.net/liyuanbhu/article/details/119978093
猜你喜欢
- 最近需要做一个围棋识别的项目,首先要将棋盘位置定位出来,效果图如下:效果图原图中间处理效果最终结果思路分析我们利用python opencv
- Django 中自带了 sitemap框架,用来生成 xml 文件Sitemap(站点地图)是通知搜索引擎页面的地址,页面的重要性,帮助站点
- 最近写了一个网络验证登录的爬虫,需要发布为Rest服务,然后发现Flask是一个很好的Web框架,使用Python语言实现。1. 安装fla
- 概述从前面的对Python基础知识方法介绍中,我们几乎是围绕Python内置方法进行探索实践,比如字符串、列表、字典等数据结构的内置方法,和
- PHP程序员玩转Linux系列文章:1.PHP程序员玩转Linux系列-怎么安装使用CentOS2.PHP程序员玩转Linux系列-lnmp
- 这次主要记录在windows下嵌入 python 解释器的过程,程序没有多少,主要是头文件与库文件的提取。程序平台:windows10 64
- 你一定想下载一下感兴趣的网页,以便慢慢欣赏吧!利用FrontPage能够轻松做到这一点,甚至可以下载整个站点,当然这里只能下载静态的页面。启
- 要写出一个五子棋游戏,我们最先要解决的,就是如何下子,如何判断已经五子连珠,而不是如何绘制画面,因此我们先确定棋盘五子棋采用15*15的棋盘
- pandas中有时需要按行依次对.csv文件读取内容,那么如何进行呢?我们来完整操作一遍,假设我们已经有了一个.csv文件。# 1.导入包i
- 开源监控系统 Prometheus 集成了跟踪多种类型的时间序列数据,但如果没有集成你想要的数据,那么很容易构建一个。一个经常使用的例子使用
- 发现问题在Anaconda配置好虚拟环境后,需要将环境添加进PyCharm中。(或者新建项目时,设置针对某一项目的运行环境),选择Conda
- 自己写了一个简单的python脚本,用来推送zabbix告警到钉钉机器人,推送格式为markdown,有需要的可以自己修改markdown的
- 自己前端开发中常用到的一些技巧及问题解决方法,会常更新,希望对前端路上的朋友有帮助。1、文章标题列表中日期居右显示的方法(提供了两种方法,使
- 注释:在大多数的情况下,修改MySQL是需要有mysql里的root权限的,所以一般用户无法更改密码,除非请求管理员。方法1使用phpmya
- 本文实例汇总了python求列表交集的方法。分享给大家供大家参考。具体方法如下:交集对于给定的两个集合A 和 集合B 的交集是指含有所有既属
- 最近需要各种转格式,这里对相关代码作一个记录,方便日后查询。xlsx文件转csv文件import xlrdimport csvdef xls
- K线数据提取依据原有数据集格式,按要求生成新表:1、每分钟的close数据的第一条、最后一条、最大值及最小值,2、每分钟vol数据的增长量(
- 使用celery在django项目中实现异步发送短信在项目的目录下创建celery_tasks用于保存celery异步任务。在celery_
- # set 不支持索引和切片,是一个无需的不重复得到容器# 类似于字典,但是只有key 没有value# 创建集合dic1={}set1={
- 本文实例讲述了python创建关联数组(字典)的方法。分享给大家供大家参考。具体分析如下:关联数组在python中叫字典,非常有用,下面是定