机器学习之聚类——MeanShift算法和图像矢量量化

简介: 机器学习之聚类——MeanShift算法和图像矢量量化

MeanShift:见名知意

       大家英语怎么样,不好也没关系,没有人比百度更懂翻译。看看这个算法的名字,Mean和Shift紧紧相随,Mean的意思是平均值,Shift的意思是转移,挪动,可以更形象的解释为漂移。组合起来就是均值漂移。

       MeanShift 这个概念最早是由Fukunaga等人于1975年在一篇关于概率密度梯度函数的估计中提出来的。然而在以后的很长一段时间内 MeanShift 并没有引起人们的注意,直到20年以后,也就是1995年,YizongCheng发表了一篇对均值漂移算法里程碑意义的文章,大大扩大了 MeanShift 的适用范围,另外YizongCheng指出了 MeanShift 可能应用的领域,并给出了具体的例子。

算法原理及优缺点

       MeanShift 算法的思路是这样的:

       我们以二维的数据为例,首先以平面内任意一个点为圆心,以半径R画一个圆(也有可能是矩形、椭圆形),形成所谓感兴趣区域,然后计算感兴趣区域中所有数据样本点的质心,这个质心大概率与刚才的圆心不同,圆心到质心的向量就是漂移向量,如下图:

然后再以上面的漂移向量的终点,即上一步的质心为圆心,继续上述过程,又可以得到一个新的质心和漂移向量,如下图:

然后不断地继续这样的过程,直到算法收敛,比如两次质心的偏移量足够小时,则结束算法

可以预见,算法过程最终的效果就是:圆心从起点开始,最终会一步一步走到样本数据最密集的地方

这里说明一下核函数的概念,在计算质心时,核函数决定了感兴趣区域内各样本点对质心的贡献,下面是几个常用的核函数:

原理介绍了,总结一下它的优缺点吧:

优点:

1、与K-Means算法不一样的是,MeanShift算法可以自动决定类别的数目。

2、不受异常值影响。

3、没有局部最小值。

缺点:

1、在高维空间数据下表现不佳。

2、无法指定聚类的数量。

图片的矢量量化

       简单来讲,图片的矢量量化就是用更少的颜色种类来表达图片,颜色可以用数据表达,所以矢量量化可以看作是对图片数据的压缩。原图片可能有很多种颜色,有着丰富的表达力,经过矢量量化处理后,图片的颜色变化更加生硬,颜色边界更清晰。在具体的程序处理中,可以对图片的像素数据进行聚类,用聚类中心代替原图片中属于该聚类的像素点。这里的聚类可以使用多种聚类算法,比如K-means、AP聚类、MeanShift等,本文采用MeanShift。好了,上代码!

我们处理的素材是经典的Lena

代码如下:

from PIL import Image
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from sklearn.cluster import MeanShift
from sklearn.metrics import euclidean_distances
 
 
# 将像素数据转化为图像
def restore_image(cb, cluster, shape):
    row, col, dummy = shape
    _image = np.empty((row, col, 3))
    index = 0
    for _r in range(row):
        for _c in range(col):
            _image[_r, _c] = cb[cluster[index]]
            index += 1
    return _image
 
 
if __name__ == '__main__':
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    matplotlib.rcParams['axes.unicode_minus'] = False
    # 加载图像并对图像数据进行预处理
    im = Image.open('.\\lena.png')
    image = np.array(im).astype(float) / 255
    image = image[:, :, :3]
    # 摊平像素数据
    image_v = image.reshape((-1, 3))
    # 图像像素总数
    N = image_v.shape[0]
    # 选择足够多的样本(如1000个),计算聚类中心
    idx = np.random.randint(0, N, size=1000)
    image_sample = image_v[idx]
    # 取像素点欧氏距离中值最为MeanShift感兴趣区域半径
    m = euclidean_distances(image_sample, squared=True)
    band_width = np.median(m)
    # 模型
    model = MeanShift(bin_seeding=True, bandwidth=band_width)
    # 训练
    ms = model.fit(image_sample)
    # 簇中心
    centers = ms.cluster_centers_
    # 聚类图片像素
    c = model.predict(image_v)
    # 像素类别标签
    y_hat = ms.labels_
    # 聚类个数
    n_clusters = np.unique(y_hat).size
    print('聚类结果:\n', c)
    print('带宽:', band_width, '聚类簇的个数为:', n_clusters)
    # 绘制结果
    plt.figure(figsize=(12, 6), facecolor='w')
    plt.subplot(121)
    plt.axis('off')
    plt.title('原始图片', fontsize=14)
    plt.imshow(image)
 
    plt.subplot(122)
    vq_image = restore_image(centers, c, image.shape)
    plt.axis('off')
    plt.title('矢量量化后图片:%d色' % n_clusters, fontsize=14)
    plt.imshow(vq_image)
 
    plt.tight_layout()
    plt.subplots_adjust(top=0.9)
    # plt.show()
    plt.savefig('VectorQuantization.png')

运行效果如下:

 

作者这水平有限,有不足之处欢迎留言指正

目录
打赏
0
0
0
0
21
分享
相关文章
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
AI训练师入行指南(三):机器学习算法和模型架构选择
从淘金到雕琢,将原始数据炼成智能珠宝!本文带您走进数字珠宝工坊,用算法工具打磨数据金砂。从基础的经典算法到精密的深度学习模型,结合电商、医疗、金融等场景实战,手把手教您选择合适工具,打造价值连城的智能应用。掌握AutoML改装套件与模型蒸馏术,让复杂问题迎刃而解。握紧算法刻刀,为数字世界雕刻文明!
32 6
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
基于机器学习的人脸识别算法matlab仿真,对比GRNN,PNN,DNN以及BP四种网络
本项目展示了人脸识别算法的运行效果(无水印),基于MATLAB2022A开发。核心程序包含详细中文注释及操作视频。理论部分介绍了广义回归神经网络(GRNN)、概率神经网络(PNN)、深度神经网络(DNN)和反向传播(BP)神经网络在人脸识别中的应用,涵盖各算法的结构特点与性能比较。
基于信息论的高动态范围图像评价算法matlab仿真
本项目基于信息论开发了一种高动态范围(HDR)图像评价算法,并通过MATLAB 2022A进行仿真。该算法利用自然图像的概率模型,研究图像熵与成像动态范围的关系,提出了理想成像动态范围的计算公式。核心程序实现了图像裁剪处理、熵计算等功能,展示了图像熵与动态范围之间的关系。测试结果显示,在[μ-3σ, μ+3σ]区间内图像熵趋于稳定,表明系统动态范围足以对景物成像。此外,还探讨了HDR图像亮度和对比度对图像质量的影响,为HDR图像评价提供了理论基础。
基于Affine-Sift算法的图像配准matlab仿真
本项目展示了Affine-SIFT算法的运行效果(无水印),适用于图像配准任务,能够处理旋转、缩放、平移及仿射变换。程序基于MATLAB2022A开发,包含完整代码与操作视频。核心步骤为:先用SIFT提取特征点,再通过仿射变换实现高精度对准。
使用 PAI-DSW x Free Prompt Editing图像编辑算法,开发个人AIGC绘图小助理
使用 PAI-DSW x Free Prompt Editing图像编辑算法,开发个人AIGC绘图小助理
CCS 2024:如何严格衡量机器学习算法的隐私泄露? ETH有了新发现
在2024年CCS会议上,苏黎世联邦理工学院的研究人员提出,当前对机器学习隐私保护措施的评估可能存在严重误导。研究通过LiRA攻击评估了五种经验性隐私保护措施(HAMP、RelaxLoss、SELENA、DFKD和SSL),发现现有方法忽视最脆弱数据点、使用较弱攻击且未与实际差分隐私基线比较。结果表明这些措施在更强攻击下表现不佳,而强大的差分隐私基线则提供了更好的隐私-效用权衡。
76 14
解锁机器学习的新维度:元学习的算法与应用探秘
元学习作为一个重要的研究领域,正逐渐在多个应用领域展现其潜力。通过理解和应用元学习的基本算法,研究者可以更好地解决在样本不足或任务快速变化的情况下的学习问题。随着研究的深入,元学习有望在人工智能的未来发展中发挥更大的作用。
基于免疫算法的最优物流仓储点选址方案MATLAB仿真
本程序基于免疫算法实现物流仓储点选址优化,并通过MATLAB 2022A仿真展示结果。核心代码包括收敛曲线绘制、最优派送路线规划及可视化。算法模拟生物免疫系统,通过多样性生成、亲和力评价、选择、克隆、变异和抑制机制,高效搜索最优解。解决了物流仓储点选址这一复杂多目标优化问题,显著提升物流效率与服务质量。附完整无水印运行结果图示。
基于免疫算法的最优物流仓储点选址方案MATLAB仿真

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等