C++ OpenCV如何实现图像均值偏移滤波

发布时间:2021-11-26 10:37:14 作者:小新
来源:亿速云 阅读:173

这篇文章主要介绍了C++ OpenCV如何实现图像均值偏移滤波,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

前言

在图像分割的过程中,我们可以利用均值偏移算法的这个特性,实现彩色图像分割,均值漂移算法是一种通用的聚类算法,它的基本原理是:对于给定的一定数量样本,任选其中一个样本,以该样本为中心点划定一个圆形区域,求取该圆形区域内样本的质心,即密度最大处的点,再以该点为中心继续执行上述迭代过程,直至最终收敛。

Opencv中对应的均值偏移函数是pyrMeanShiftFiltering。这个函数是图像在色彩层面的平滑滤波,它可以中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域,所以在Opencv中它的后缀是滤波“Filter”,而不是分割“segment”。

函数API   

void pyrMeanShiftFiltering( InputArray src, OutputArray dst,
                                             double sp, double sr, int maxLevel=1,
                                             TermCriteria termcrit=TermCriteria(
                                                TermCriteria::MAX_ITER+TermCriteria::EPS,5,1) );

   

参数说明:

src:输入图像,8位,三通道的彩色图像,并不要求必须是RGB格式,HSV、YUV等Opencv中的彩色图像格式均可;


dst:输出图像,跟输入src有同样的大小和数据格式;


sp: 定义的漂移物理空间半径大小;


sr:  定义的漂移色彩空间半径大小;


maxLevel:定义金字塔的最大层数;


termcrit:定义的漂移迭代终止条件,可以设置为迭代次数满足终止,迭代目标与中心点偏差满足终止,或者两者的结合;


pyrMeanShiftFiltering函数的执行过程是这样的:
1. 迭代空间构建:
以输入图像上src上任一点P0为圆心,建立物理空间上半径为sp,色彩空间上半径为sr的球形空间,物理空间上坐标2个—x、y,色彩空间上坐标3个—R、G、B(或HSV),构成一个5维的空间球体。
其中物理空间的范围x和y是图像的长和宽,色彩空间的范围R、G、B分别是0~255。

2. 求取迭代空间的向量并移动迭代空间球体后重新计算向量,直至收敛:
在1中构建的球形空间中,求得所有点相对于中心点的色彩向量之和后,移动迭代空间的中心点到该向量的终点,并再次计算该球形空间中所有点的向量之和,如此迭代,直到在最后一个空间球体中所求得的向量和的终点就是该空间球体的中心点Pn,迭代结束。

3. 更新输出图像dst上对应的初始原点P0的色彩值为本轮迭代的终点Pn的色彩值,如此完成一个点的色彩均值漂移。

4. 对输入图像src上其他点,依次执行步骤1,、2、3,遍历完所有点位后,整个均值偏移色彩滤波完成,这里忽略对金字塔的讨论。


代码实现

我们再新建一个项目名为opencv--Matting,按照配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法.

C++ OpenCV如何实现图像均值偏移滤波

我们显示一下源图

C++ OpenCV如何实现图像均值偏移滤波


物理空间半径sp=10,色彩空间半径sr=10时色彩滤波效果:

C++ OpenCV如何实现图像均值偏移滤波

运行效果我们看一下

C++ OpenCV如何实现图像均值偏移滤波


上面一看感觉没有什么太大变化,我们改一下参数看看效果

物理空间半径sp=50,色彩空间半径sr=50时色彩滤波效果:

C++ OpenCV如何实现图像均值偏移滤波

我们再运行一下看看

C++ OpenCV如何实现图像均值偏移滤波

这样一看上面右图就非常明显了


物理空间半径sp=10,色彩空间半径sr=100时色彩滤波效果:

C++ OpenCV如何实现图像均值偏移滤波

运行的效果

C++ OpenCV如何实现图像均值偏移滤波

可以看到对比上图的还有一些白的亮点,在这里面基本都看不到了。

感谢你能够认真阅读完这篇文章,希望小编分享的“C++ OpenCV如何实现图像均值偏移滤波”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

推荐阅读:
  1. 怎么使用opencv3/C++实现霍夫圆/直线检测
  2. opencv3/C++图像滤波实现方式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ opencv

上一篇:Android Audio系统变化都有哪些

下一篇:C#如何实现基于Socket套接字的网络通信封装

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》