• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

python 搞代码 4年前 (2022-01-08) 25次浏览 已收录 0个评论

这篇文章主要介绍了OpenCV机器学习MeanShift算法笔记分享,有需要的朋友可以借鉴参考下,希望可以对各位读者的OpenCV算法学习能够有所帮助

Mea来源gaodai#ma#com搞@@代~&码网nShift算法

Mean shift 是一种机器学习算法,并不仅仅局限于图像上的应用。关于 Mean shift 算法介绍的书和文章很多,这里就不多介绍了。简单的说,Meanshift 算法是一种迭代算法,需要给一个初始的区域,然后这个算法会反复的调整这个区域,使得这个区域最吻合我们期望的特征。

OpenCV 中有两处用到了 Mean Shift 。分别是:

pyrMeanShiftFiltering

meanShift

这里只介绍第二个函数的使用方法。

我们的原始图像还是上次那个向日葵的图像,我们选中其中一朵向日葵来计算 Histogram,但是这次我们计算 Hue 通道的 Histogram:

之后用这个直方图数据在另外一个图像中用 Meanshift 算法去找向日葵。

下面是代码,首先加载原始图像。在原始图像中找到向日葵,计算向日葵区域的 Histogram。

 cv::Mat image = cv::imread("D:\\向日葵.jpg-600"); 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-600"); 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算法笔记分享的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:OpenCV机器学习MeanShift算法笔记分享

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址