在灰度图像上进行Mean Shift迭代搜索目标 ,一维加权直方图 + 巴氏系数 + Mean Shift迭代

今天要给大家分享的是:

在灰度图像上进行Mean Shift迭代搜索目标 一维加权直方图+巴氏系数+Mean Shift迭代 

关于 加权直方图、巴氏系数、Mean Shift迭代 这三者之间的关系请大侠们阅读我的另一篇博文:巴氏系数的最大化与Mean Shift的关系

先上一张迭代过程的运行图吧(算法的实际运行是在灰度图上进行的,彩色图是为了显示效果)

在灰度图像上进行Mean Shift迭代搜索目标 ,一维加权直方图 + 巴氏系数 + Mean Shift迭代_第1张图片

在上图中,我们首先在奶茶妹妹的图像中按下鼠标左键拖动出一块矩形区域,那个绿颜色的框就是我选中的要搜索的roi区域。紧接着,由程序给定一个初始搜索位置,就开始Mean Shift迭代搜索啦,直到最终找到奶茶妹妹的脸蛋(roi区域),图中用红色线条串起来的黑色圆点就是每次迭代的矩形框的中心位置啦。有脸蛋的那个直方图窗口中,绿色的曲线是加权直方图,红色的曲线是没有加权的直方图,可以看到,经过核函数中心加权后,奶茶妹妹的脸蛋左上角的黑色头发的亮度偏暗的灰度被抑制了。

请看程序:


下面是
/**********控制算法运行行为的主要参数*******************************************************/

//该参数用于控制给定的初始位置框和真正的roi框的重叠度:取值范围(0,1)
//初始搜索框位置默认放在真实位置的右下角,与真实目标框de重叠度是overlap
float overlap = 0.5f; //一般来说,重叠度越高,迭代收敛越快,迭代次数越少
int MaxIterNum = 50;  //该参数用于控制Mean Shift的最大迭代次数
bool isJudgeOverShift = false;//用于Mean Shift迭代过程中判断是否冲过头的标志
weight_method = 1; //选择加权核函数 ==0的话选择 Epanechnikov kernal;==1选择Gaussian kernal
lock_roi  = true;  //如果lock_roi为真,则鼠标选取的矩形框被无效化,使用roi_rect的默认位置作为roi区域

/**********控制算法运行行为的主要参数*******************************************************/

再上几张图吧(算法的实际运行是在灰度图上进行的,彩色图是为了显示效果):O(∩_∩)O哈哈~在灰度图像上进行Mean Shift迭代搜索目标 ,一维加权直方图 + 巴氏系数 + Mean Shift迭代_第2张图片

下面的左图是对应于Epanikov核函数的迭代收敛过程,右图是对应于Gaussian 加权的迭代收敛过程

在灰度图像上进行Mean Shift迭代搜索目标 ,一维加权直方图 + 巴氏系数 + Mean Shift迭代_第3张图片

可见 Epanikov核函数是估计多维概率密度函数的最优核函数,误差最小。


你可能感兴趣的:(搜索,opencv,直方图,MeanShift,巴氏系数)