文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

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机器学习的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯