C++ Mean Shift算法

发布于:2024-10-13 ⋅ 阅读:(133) ⋅ 点赞:(0)
原理

每个样本点最终会移动到核概率密度的峰值,移动到相同峰值的样本点属于同一种颜色

关键代码

template <typename PointType> inline
typename MeanShift<PointType>::PointsVector MeanShift<PointType>::meanshift(const PointsVector &points,
                                                                            double kernel_bandwidth) const{
    const double EPSILON_SQR = _meanshift_epsilon*_meanshift_epsilon;
    std::vector<bool> stop_moving(points.size(), false);
    PointsVector shifted_points = points;
    double max_shift_distance;
    Point point_new;
    do {
        max_shift_distance = 0;
        for(int i=0; i<shifted_points.size(); i++)
        {
            if (!stop_moving[i])
            {
                shift_point(shifted_points[i], points, kernel_bandwidth, point_new); // 带宽收缩后的值
                double shift_distance_sqr = euclidean_distance_sqr(point_new, shifted_points[i]); // 取收缩后的峰值
                if(shift_distance_sqr > max_shift_distance){
                    max_shift_distance = shift_distance_sqr;
                }
                if(shift_distance_sqr <= EPSILON_SQR) {
                    stop_moving[i] = true;
                }
                shifted_points[i] = point_new;
            }
        }
    } while (max_shift_distance > EPSILON_SQR);
    return shifted_points;
}
 效果

 参考

深入剖析Mean Shift聚类算法原理-腾讯云开发者社区-腾讯云

GitHub - facontidavide/Meanshift: Implementation of MeanShift algorithm (including Qt Demo)


创作不易,小小的支持一下吧!


网站公告

今日签到

点亮在社区的每一天
去签到