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
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
python的staticmethod与classmethod实现实例代码
Yii2结合Workerman的websocket示例详解
MySQL的命令行提示符及其表达的意思
3行Python代码实现图像照片抠图和换底色的方法
![](https://img.aspxhome.com/file/2023/1/99611_0s.jpg)
对python 自定义协议的方法详解
django 将model转换为字典的方法示例
Python Numpy 数组的初始化和基本操作
Python:type、object、class与内置类型实例
python 日志增量抓取实现方法
ASP进阶学习之认识数学函数
几行Python代码爬取3000+上市公司的信息
![](https://img.aspxhome.com/file/2023/3/107973_0s.png)
python调用matlab的m自定义函数方法
OracleEXP和IMP用法和介绍
Python写入CSV文件的方法
自适应浏览器位置的div效果
![](https://img.aspxhome.com/file/UploadPic/20085/29/div_24s.jpg)
为什么str(float)在Python 3中比Python 2返回更多的数字
python模块的安装以及安装失败的解决方法
![](https://img.aspxhome.com/file/2023/8/62618_0s.png)
asp和js两种方法判断远程图片是否存在
linux环境下的python安装过程图解(含setuptools)
![](https://img.aspxhome.com/file/2023/0/70850_0s.jpg)
CSS实例教程:复合型CSS条状图表(上)
![](https://img.aspxhome.com/file/UploadPic/20101/23/2010123124715558s.jpg)