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


猜你喜欢
- 1.file--->settings:2.搜索temlates,点击File and Code Templates,点击右侧的Pyth
- 创建用户定义函数,它是返回值的已保存的 Transact-SQL 例程。用户定义函数不能用于执行一组修改全局数据库状态的操作。与系统函数一样
- 大大小小也搞过一些数据库设计,见过一些其他人的设计,看过些书,总结总结,经验谈。选表类型:大家都知道mysql的myisam表适合读操作大,
- 如下所示:import matplotlib.pyplot as pltimport numpy as npimport mathdef g
- 1.3 安装 ASP.net跟基督山一起检查你们的计算机哦CPU Pentium II 450以上,推荐733内存 256M 推荐 512M
- 朋友的网站要计算机票的折扣价格,并且在最后的折扣价格上应对个位进行四舍五入,同时在ASP和Javasc
- 最近试用mysql proxy,遇到若干问题,好在一一找到了解决方案,列出来备忘。这次使用的版本是0.6.x,也许新版本就没有这些问题了。无
- delete 删除一张大表时空间不释放,非常慢是因为占用大量的系统资源,支持回退操作,空间还被这张表占用着。truncate table 表
- 条件判断计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if
- 用过NumPY的应该都知道,在二维数组中可以方便地使用区域切片功能,如下图:而这个功能在Python标准库的List中是不支持的,在List
- mysql是linux平台下最流行的数据库系统,今天介绍的是mysql的安装及简单的操作方法!groupadd mysql //建立mysq
- (&,|)和(and,or)是两组比较相似的运算符,用在“与”/ “或”上,在用法上有些许区别。 (&,|)和(and,or
- 最近网上流行着一些采集程序,更多人拿着这些东西在网上叫卖,很多不太懂的人看着那些程序眼羡,其实如果你懂一些ASP,了解自动采集程序的原理后,
- 数据模型==对象模型Python官方文档说法是“Python数据模型”,大多数Python书籍作者说法是“Python对象模型”,它们是一个
- 一、re.compile 函数作用:compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match()
- 列表推导式你有一个list: bag = [1, 2, 3, 4, 5]现在你想让所有元素翻倍,让它看起来是这个样子: [2, 4, 6,
- 内联优化是一种常见的编译器优化策略,通俗来讲,就是把函数在它被调用的地方展开,这样可以减少函数调用所带来的开销(栈的创建、参数的拷贝等)。当
- 背景近期看到一篇文章,真的感叹作者的洞察力,在开发时有可能就会犯这样的错误,所以一定要多学习,多实践。其问题就是你在提交事务时,如果中间有其
- 本文实例讲述了JavaScript中callee和caller的区别与用法。分享给大家供大家参考,具体如下:1.callee在函数的内部,有
- 很多小伙伴在学习Django的时候,总是搞不定版本的问题,下面来一起看一张表,轻松解决Python版本和Django版本的兼容问题。Djan