【阿旭机器学习实战】【19】如何在不减少分辨率的情况下降低图片存储空间?K-Means算法进行图片颜色点分类存储

简介: 【阿旭机器学习实战】【19】如何在不减少分辨率的情况下降低图片存储空间?K-Means算法进行图片颜色点分类存储

前言


在如今的互联网时代,网络上充满了海量的数据,当然也包括很多图片。因此图像压缩技术对于压缩图像和减少存储空间变得至关重要。


本文我们将使用无监督学习算法K-means聚类算法通过对图片颜色点进行聚类的方式,达到降低图片存储空间的目的。


图像由称为像素的几个强度值组成。在彩色图像中, 每个像素为3个字节, 每个像素包含RGB(红-蓝-绿)值, 该值具有红色强度值, 然后是蓝色, 然后是绿色强度值。


具体方法如下:


  1. 使用K均值聚类算法将图片相似的颜色归为不同的” k”个聚类(例如k = 64),每个簇质心(RGB值)代表其各自簇的RGB颜色空间中的颜色矢量。


  1. 根据Kmeans算法找出图片上每个像素点对应的簇质心(RGB值)的标号值。


  1. 图片存储时,我们只需存储每个像素的标签编号, 并保留每个聚类中心的颜色向量的记录,根据编号及这个聚类中心颜色向量就可以告诉该像素所属的集群,即RGB值。


由上述存储方式可以看出,图片单个像素点的存储由RGB的3个字节,变为了只需存储一个标签编号的数字。存储空间只需原来的30%左右。


1. 加载图片及特征处理


from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 加载图片
china = datasets.load_sample_image("china.jpg")
plt.imshow(china)

4fefea5c5511412b8403778c9858d375.png

china.dtype
• 1
dtype('uint8')
• 1
china.shape
• 1
(427, 640, 3)

# 除以255,将像素点的值变为0-1之间
china = china/255
• 1
• 2
h,w,d = china.shape
• 1
# 把像素点展开
img_array = china.reshape((h*w,d))

img_array.shape
• 1
(273280, 3)
# 把像素点随机打乱
from sklearn.utils import shuffle
img_array_shuffle = shuffle(img_array,random_state=0)
plt.imshow(img_array_shuffle.reshape((h,w,d)))

62dd45a2a3dc483cb81e0769a8583784.png

2. 进行KMeans聚类建模


from sklearn.cluster import KMeans
# 用64个聚类来划分这些像素点
km = KMeans(n_clusters=64,random_state=0)
# 仅用前1000个像素点进行模型训练
km.fit(img_array_shuffle[:1000])
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
    n_clusters=64, n_init=10, n_jobs=1, precompute_distances='auto',
    random_state=0, tol=0.0001, verbose=0)
# 表示这1000个样本对应的聚类标签,展示前100个标签编号
km.labels_[:100]
array([22, 36,  8, 56, 38, 42, 22, 31,  7,  2, 55, 31, 62, 21, 52, 43, 31,
       18,  2,  4, 31, 56, 21,  2, 15,  5,  6, 49, 57, 13,  5, 21, 21,  3,
       21, 47, 21,  2, 47, 32,  5, 42,  5, 33, 45, 56,  5, 57,  2, 38, 47,
        6, 50, 50, 27, 62, 56, 57, 30, 28,  6,  5, 26, 24, 58, 44,  8, 21,
       58, 60, 10, 56, 31, 10, 41,  5, 62, 41, 22,  6, 38, 25, 57, 36, 28,
       21, 49,  2, 21, 48, 14, 15, 57, 22, 47, 63, 47,  2, 41, 34])
# # 用聚类中心点的颜色来代表这个聚类的颜色,展示前10个聚类中心
km.cluster_centers_[:10] 
array([[0.62570806, 0.60261438, 0.53028322],
       [0.15546218, 0.1557423 , 0.12829132],
       [0.82063983, 0.89896801, 0.98462332],
       [0.42039216, 0.43843137, 0.2227451 ],
       [0.69527105, 0.74994233, 0.76516724],
       [0.92174422, 0.9556336 , 0.99514194],
       [0.07058824, 0.0754637 , 0.0508744 ],
       [0.28205128, 0.26395173, 0.19638009],
       [0.46509804, 0.43372549, 0.36901961],
       [0.71328976, 0.41960784, 0.31851852]])


3. 使用算法对原始图片进行聚类


# 用km模型去对原图进行聚类
labels = km.predict(img_array)
• 1
• 2


创建一个函数用于重新合成图片


def recreate_img(centers,labels,h,w):
    # 行数的作用是将每个像素点的值,用对应编号的聚类中心代替
    # 按照h和w创建一个空白图片
    img = np.zeros((h,w,3))
    # 通过for循环,遍历img中每一个点,并且从labels中取出下标对应的聚类重新给img赋值
    label_index = 0
    for i in range(h):
        for j in range(w):
            img[i][j] = centers[labels[label_index]]
            label_index += 1
    return img


img_re = recreate_img(km.cluster_centers_, labels, h, w)
• 1


4. 展示原始图片与使用64个聚类中心聚类后的图片


plt.figure(figsize=(12,6))
axes1 = plt.subplot(121)
axes1.imshow(china)
axes1.set_title("Instaces")
axes2 = plt.subplot(122)
axes2.imshow(img_re)
axes2.set_title("64 colors,K-Means")


Text(0.5,1,'64 colors,K-Means')

50f907e27d4a4b91a6641f93c2149fb5.png

5. 图片存储方式


  1. 存储上面的图片每个像素点对应的聚类编号:labels, 形状为:(273280,)
  2. 存储每个聚类编号对应聚类中心RGB值:km.cluster_centers_。形状为:(64, 3)


依据以上labels与km.cluster_centers_,我们即可还原出聚类之后的图片。相对于原始数据存储量降低了60%以上。


相关文章
|
3月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
193 6
|
1月前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
266 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
1月前
|
机器学习/深度学习 算法 网络安全
CCS 2024:如何严格衡量机器学习算法的隐私泄露? ETH有了新发现
在2024年CCS会议上,苏黎世联邦理工学院的研究人员提出,当前对机器学习隐私保护措施的评估可能存在严重误导。研究通过LiRA攻击评估了五种经验性隐私保护措施(HAMP、RelaxLoss、SELENA、DFKD和SSL),发现现有方法忽视最脆弱数据点、使用较弱攻击且未与实际差分隐私基线比较。结果表明这些措施在更强攻击下表现不佳,而强大的差分隐私基线则提供了更好的隐私-效用权衡。
52 14
|
3月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
77 1
|
3月前
|
机器学习/深度学习 自然语言处理 算法
深入理解机器学习算法:从线性回归到神经网络
深入理解机器学习算法:从线性回归到神经网络
|
2天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
1月前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
147 68
|
1月前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
3天前
|
传感器 算法 物联网
基于粒子群算法的网络最优节点部署优化matlab仿真
本项目基于粒子群优化(PSO)算法,实现WSN网络节点的最优部署,以最大化节点覆盖范围。使用MATLAB2022A进行开发与测试,展示了优化后的节点分布及其覆盖范围。核心代码通过定义目标函数和约束条件,利用PSO算法迭代搜索最佳节点位置,并绘制优化结果图。PSO算法灵感源于鸟群觅食行为,适用于连续和离散空间的优化问题,在通信网络、物联网等领域有广泛应用。该算法通过模拟粒子群体智慧,高效逼近最优解,提升网络性能。