本文首发于“小白学视觉”微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究!


经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

Mean-Shift算法又被称为均值漂移法,是一种基于颜色空间分布的图像分割算法。该算法的输出是一个经过滤色的“分色”图像,其颜色会变得渐变,并且细纹纹理会变得平缓。

在Mean-Shift算法中每个像素点用一个五维的向量(x,y,b,g,r)(x,y,b,g,r)(x,y,b,g,r)表示,前两个量是像素点在图像中的坐标(x,y)(x,y)(x,y),后三个量是每个像素点的颜色分量(蓝、绿、红)。在颜色分布的峰值处开始,通过滑动窗口不断寻找属于同一类的像素点并统一像素点的像素值。滑动窗口由半径和颜色幅度构成,半径决定了滑动窗口的范围,即坐标(x,y)(x,y)(x,y)的范围,颜色幅度决定了半径内像素点分类的标准。这样通过不断地移动滑动窗口,实现基于像素点颜色的图像分割。由于分割后同一类像素点具有相同像素值,因此Mean-Shift算法的输出结果是一个颜色渐变、纹理平缓的图像。

OpenCV 4中提供了实现Mean-Shift算法分割图像的pyrMeanShiftFiltering()函数,该函数的函数原型在代码清单8-23中给出。

代码清单8-23 pyrMeanShiftFiltering()函数原型
1.  void cv::pyrMeanShiftFiltering(InputArray  src,
2.                                       OutputArray  dst,
3.                                       double  sp,
4.                                       double  sr,
5.                                       int  maxLevel = 1,
6.                                       TermCriteria  termcrit =
7.                                TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 5, 1)
8.                                )
  • src:待分割的输入图像,必须是三通道CU_8U的彩色图像
  • dst:分割后的输出图像,与输入图像具有相同的尺寸和数据类型
  • sp:滑动窗口的半径
  • sr:滑动窗口颜色幅度
  • maxLevel:分割金字塔缩放层数
  • termcrit:迭代算法终止条件。

该函数基于彩色图像的像素值实现对图像的分割,函数的输出结果是经过颜色分布平滑的图像。经过该函数分割后的图像具有较少的纹理信息,可以利用边缘检测函数Canny()以及连通域查找函数findContours()进行进一步细化分类和处理。函数前两个参数是待分割的输入图像和分割后的输出图像,两个图像具有相同的尺寸并且必须是CV_8U的三通道彩色图像。第三个参数为滑动窗口的半径,第四个参数为滑动窗口的颜色幅度。第五个参数为分割金字塔缩放层数,当参数大于1时构建maxLevel + 1层高斯金字塔。该算法首先在尺寸最小的图像层中进行分类,之后将结果传播到尺寸较大的图像层,并且仅在颜色与上一层颜色差异大于滑动窗口颜色幅度的像素上再次进行分类,从而使得颜色区域的边界更清晰。当分割金字塔缩放层数为0时表示直接在整个原始图像时进行均值平移分割。函数最后一个参数表示算法迭代停止的条件,该参数的数据类型是TermCriteria,该数据类型是OpenCV 4中用于表示迭代算法终止条件的数据类型,在所有涉及到迭代条件的函数中都有该参数,用于表示在满足某些条件时函数将停止迭代并输出结果。TermCriteria变量可以通过TermCriteria()函数进行赋值,该函数的函数原型在代码清单8-24中给出。

代码清单8-24 TermCriteria()函数原型
1.  cv::TermCriteria::TermCriteria(int  type,
2.                                       int  maxCount,
3.                                       double  epsilon
4.                                       )
  • type:终止条件的类型标志,可以选择的参数及含义在表8-6中给出。
  • maxCount:最大迭代次数或者元素数。
  • epsilon:迭代算法停止时需要满足的精度或者参数变化。

该函数可以表示迭代算法的终止条件,主要分为满足迭代次数和满足计算精度两种。函数第一个参数是终止条件的类型标志,其可选参数在表8-6中给出,这几个标志可以互相结合使用,需要注意的是,由于该参数在TermCriteria类中,因此在使用时需要在变量前面添类名前缀。函数第二个参数表示最大迭代次数,在epsilon== TermCriteria::COUNT时发挥作用。函数第三个参数表示停止迭代时需要满足的计算精度,在epsilon== TermCriteria::EPS时发挥作用。

表8-6 TermCriteria()函数中终止条件的类型标志可选参数及含义

标志参数 简记 含义
TermCriteria::COUNT 1 迭代次数达到设定值才停止迭代
TermCriteria::MAX_ITER 1 同上
TermCriteria::EPS 2 当计算的精度满足要求时停止迭代

为了了解pyrMeanShiftFiltering()函数的使用方法以及分割效果,在代码清单8-25中给出了利用该函数进行图像分割的示例程序。程序中对图像连续进行两次处理,并对分割结果提取Canny边缘,比较分割前后对图像边缘的影响,发现经过多次分割处理后的图像边缘明显变少,图像分割区域也更加整齐和平滑,程序的运行结果在图8-15、图8-16和图8-17中给出。

代码清单8-25 myPyrMeanShiftFiltering.cpp利用均值漂移法分割图像
1.  #include <opencv2/opencv.hpp>
2.  #include <iostream>
3.
4.  using namespace cv;
5.  using namespace std;
6.
7.  int main()
8.  {
9.      Mat img = imread("coin.png");
10.     if (!img.data)
11.     {12.         cout << "请确认图像文件名称是否正确" << endl;
13.         return -1;
14.     }
15.
16.     //分割处理
17.     Mat result1, result2;
18.     TermCriteria T10 = TermCriteria(TermCriteria::COUNT|TermCriteria::EPS, 10, 0.1);
19.     pyrMeanShiftFiltering(img, result1, 20, 40, 2, T10);  //第一次分割
20.     pyrMeanShiftFiltering(result1, result2, 20, 40, 2, T10);  //第一次分割的解雇再次分割
21.
22.     //显示分割结果
23.     imshow("img", img);
24.     imshow("result1", result1);
25.     imshow("result2", result2);
26.
27.     //对图像提取Canny边缘
28.     Mat imgCanny,result1Canny,result2Canny;
29.     Canny(img, imgCanny, 150, 300);
30.     Canny(result1, result1Canny, 150, 300);
31.     Canny(result2, result2Canny, 150, 300);
32.
33.     //显示边缘检测结果
34.     imshow("imgCanny", imgCanny);
35.     imshow("result1Canny", result1Canny);
36.     imshow("result2Canny", result2Canny);
37.     waitKey(0);
38.     return 0;
39. }

图8-15 myPyrMeanShiftFiltering.cpp程序中原图及Canny边缘 图8-16 myPyrMeanShiftFiltering.cpp程序中处理一次图像及Canny边缘 图8-17 myPyrMeanShiftFiltering.cpp程序中处理两次图像及Canny边缘

OpenCV 4开发详解
往期推荐
【OpenCV 4开发详解】图像噪声的种类与生成
【OpenCV 4开发详解】均值滤波
【OpenCV 4开发详解】方框滤波
【OpenCV 4开发详解】高斯滤波
【OpenCV 4开发详解】可分离滤波
【OpenCV 4开发详解】中值滤波
【OpenCV 4开发详解】边缘检测原理
【OpenCV 4开发详解】Scharr算子
【OpenCV 4开发详解】Laplacian算子
【OpenCV 4开发详解】Canny算法
【OpenCV 4开发详解】图像距离变换
【OpenCV 4开发详解】图像连通域分析
【OpenCV 4开发详解】图像腐蚀
【OpenCV 4开发详解】图像膨胀
【OpenCV 4开发详解】形态学应用
【OpenCV 4开发详解】检测直线
【OpenCV 4开发详解】直线拟合
【OpenCV 4开发详解】直线检测
【OpenCV 4开发详解】轮廓发现与绘制
【OpenCV 4开发详解】轮廓面积与长度
【OpenCV 4开发详解】图像矩的计算与应用
【OpenCV 4开发详解】点集拟合
【OpenCV 4开发详解】QR二维码检测
【OpenCV 4开发详解】分割图像——漫水填充法
【OpenCV 4开发详解】分割图像——分水岭法
【OpenCV 4开发详解】分割图像——Grabcut图像分割
经过几个月的努力,市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》将春节后由人民邮电出版社发行。如果小伙伴觉得内容有帮助,希望到时候多多支持!
关注小白的小伙伴可以提前看到书中的内容,我们创建了学习交流群,欢迎各位小伙伴添加小白微信加入交流群,添加小白时请备注“学习OpenCV 4”。

【OpenCV 4开发详解】分割图像——Mean-Shift分割算法相关推荐

  1. 【OpenCV 4开发详解】图像修复

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  2. 【OpenCV 4开发详解】图像二值化

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  3. 【OpenCV 4开发详解】图像膨胀

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  4. 【OpenCV 4开发详解】图像腐蚀

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  5. 【OpenCV 4开发详解】图像距离变换

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  6. 【OpenCV 4开发详解】图像连通域分析

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  7. 【OpenCV 4开发详解】图像噪声的种类与生成

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  8. 【OpenCV 4开发详解】图像卷积

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  9. 【OpenCV 4开发详解】图像直方图绘制

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  10. 【OpenCV 4开发详解】图像金字塔

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

最新文章

  1. SpringBoot—分层结构
  2. Mysql中的联合索引、前缀索引、覆盖索引
  3. 通过关闭UseDNS和GSSAPIAuthentication选项加速SSH登录
  4. 在Visual Studio中使用C#脚本(CSX脚本)生成代码
  5. python如何写生日快乐图片_Python 生活第一周母校生日快乐
  6. python自定义抛出异常信息_浅谈python抛出异常、自定义异常, 传递异常
  7. 组装电脑时,散热器高度要与机箱适配
  8. mysql数据恢复某一时间点_mysql时间点数据恢复
  9. 你真的了解什么是项目管理吗?
  10. python课程预告_Python3编程预告
  11. python基本写法_python操作文件常用写法
  12. UVA 488 Triangle Wave
  13. 从零到熟悉,带你掌握Python len() 函数的使用
  14. 联想微型计算机c325参数,联想一体机c325性能表现 联想一体机c325配置参数
  15. 【MySQL】16-超详细的MySQL单行函数汇总
  16. 利用百度地图采集大量某一区域经纬度信息
  17. 计算机专业 本科论文,计算机专业本科论文范文
  18. c语言英文版孤独怎么说,孤单英文句子 关于“孤独”的英语句子有哪些?
  19. Spring Boot安全管理
  20. 【Minecraft开服教学】使用 MCSM 面板一键搭建我的世界服务器 并使用内网穿透公网远程联机

热门文章

  1. 不需要程序员,产品经理也能10分钟打造一个深度学习模型
  2. 腾讯回应博鳌AI同传:系谣言,承认出现失误
  3. 【AI竞赛】TinyMind汉字书法识别挑战赛开始报名啦!!
  4. 一些防止 Java 代码被反编译的方法
  5. 配置 Spring Batch 批处理失败重试
  6. 如何正确的使用Java8中的Optional类来消除代码中的null检查
  7. 一个Java对象到底有多大?
  8. 【廖雪峰python入门笔记】切片
  9. 985高校博士情侣致谢:我俩每月补贴600元,在一线城市生活5年
  10. 26岁应届博士被聘985博导!入职半年实现学院顶会论文零的突破