• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    OpenCV机器学习MeanShift算法笔记分享

    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机器学习的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • 在OpenCV里使用Camshift算法的实现
    • python实现mean-shift聚类算法
    • Opencv基于CamShift算法实现目标跟踪
    上一篇:OpenCV半小时掌握基本操作之像素加减乘除&逻辑运算
    下一篇:OpenCV半小时掌握基本操作之色彩空间
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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