在Python中使用K-Means聚类和PCA主成分分析进行图像压缩

yizhihongxing

下面我将详细讲解“在Python中使用K-Means聚类和PCA主成分分析进行图像压缩”的完整攻略。

一、背景知识

在学习本攻略前,需要掌握以下知识:

  • Python编程基础
  • NumPy库基础
  • matplotlib库基础
  • K-Means聚类算法
  • PCA主成分分析算法

二、图像压缩原理

对于一张彩色图片,它通常由三个颜色通道(R、G、B)组成。假设每个通道都是8位(即256级),那么一张图片就需要$256^3=16777216$种不同的颜色。这意味着一张分辨率为512$\times$512,每个像素点颜色有三个通道的彩色图片需要$512\times512\times3=786,432$个数字来表示。这对于传输和存储都是非常消耗资源的。

因此,我们可以采用图像压缩来减小图片的体积。而K-Means聚类算法和PCA主成分分析算法都能够对图片进行压缩。

三、使用K-Means进行图像压缩

1. 加载图片

我们可以使用matplotlib库的imread()函数来加载一张图片。例如,加载一张名为“test.jpg”的图片:

import matplotlib.pyplot as plt
import numpy as np

img = plt.imread('test.jpg')

2. 调整图片

由于K-Means算法需要将图片转换为向量,所以我们需要将图片变成$nx3$的NumPy矩阵,其中n是像素点的数量。同时,我们还需要将像素点的值标准化,以便K-Means算法能够更好地工作。

# 调整图片大小
img_size = img.shape
X = img.reshape(img_size[0] * img_size[1], img_size[2])

# 标准化像素点
X = X / 255.0

3. 运行K-Means算法

接下来,我们使用scikit-learn库的KMeans()函数运行K-Means聚类算法。这里使用K=16进行聚类。

from sklearn.cluster import KMeans

K = 16
kmeans = KMeans(K)
kmeans.fit(X)

4. 压缩图片

将像素点转换为最接近的聚类中心:

X_compressed = kmeans.predict(X)

将每个像素点转换为所属的聚类中心的颜色:

X_recovered = kmeans.cluster_centers_[X_compressed]

其实,这个过程就是将K-Means聚类算法的输出作为像素点的颜色值,重构出压缩后的图片。

5. 显示图片

我们可以使用Matplotlib库中的imshow和show函数来显示原始图片和压缩后的图片。

# 显示原始图片
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.title('Original Image')

# 显示压缩后的图片
plt.subplot(1, 2, 2)
X_recovered_3D = X_recovered.reshape(img_size[0], img_size[1], img_size[2])
plt.imshow(X_recovered_3D)
plt.title('Compressed Image, K=' + str(K))

plt.show()

6. 完整示例说明

下面是一个完整的例子,使用K-Means来对一张图片进行压缩:

import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans

# 加载图片
img = plt.imread('test.jpg')

# 调整图片大小
img_size = img.shape
X = img.reshape(img_size[0] * img_size[1], img_size[2])

# 标准化像素点
X = X / 255.0

# 运行K-Means算法
K = 16
kmeans = KMeans(K)
kmeans.fit(X)

# 压缩图片
X_compressed = kmeans.predict(X)
X_recovered = kmeans.cluster_centers_[X_compressed]

# 显示图片
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.title('Original Image')

plt.subplot(1, 2, 2)
X_recovered_3D = X_recovered.reshape(img_size[0], img_size[1], img_size[2])
plt.imshow(X_recovered_3D)
plt.title('Compressed Image, K=' + str(K))

plt.show()

四、使用PCA进行图像压缩

1. 加载图片

同样,我们可以使用matplotlib库的imread()函数来加载一张图片。

import matplotlib.pyplot as plt
import numpy as np

img = plt.imread('test.jpg')

2. 转换图像

我们使用reshape()函数将图像转换为一条向量。同时,我们也需要将像素点的值标准化。

X = np.array(img, dtype=float) / 255
X = X.reshape(-1, 3)

3. 运行PCA算法

使用scikit-learn库的PCA类来运行PCA算法。这里我们将数据降到k=16维。

from sklearn.decomposition import PCA

pca = PCA(n_components=16)
pca.fit(X)

4. 压缩图像

我们使用PCA算法输出的主成分来生成压缩后的图片。

X_reduced = pca.transform(X)
X_recovered = pca.inverse_transform(X_reduced)

5. 显示图片

同样,我们使用Matplotlib库中的imshow和show函数来显示原始图片和压缩后的图片。

# 显示原始图片
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.title('Original Image')

# 显示压缩后的图片
plt.subplot(1, 2, 2)
X_recovered_3D = np.clip(X_recovered.reshape(img.shape), 0, 1)
plt.imshow(X_recovered_3D)
plt.title('Compressed Image, K=16')

plt.show()

6. 完整示例说明

下面是一个完整的例子,使用PCA来对一张图片进行压缩:

import matplotlib.pyplot as plt
import numpy as np
from sklearn.decomposition import PCA

# 加载图片
img = plt.imread('test.jpg')

# 调整图片大小
X = np.array(img, dtype=float) / 255
X = X.reshape(-1, 3)

# 运行PCA算法
pca = PCA(n_components=16)
pca.fit(X)

# 压缩图片
X_reduced = pca.transform(X)
X_recovered = pca.inverse_transform(X_reduced)

# 显示图片
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.title('Original Image')

plt.subplot(1, 2, 2)
X_recovered_3D = np.clip(X_recovered.reshape(img.shape), 0, 1)
plt.imshow(X_recovered_3D)
plt.title('Compressed Image, K=16')

plt.show()

以上就是使用K-Means聚类和PCA主成分分析进行图像压缩的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在Python中使用K-Means聚类和PCA主成分分析进行图像压缩 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • Python自动操作神器PyAutoGUI的使用教程

    Python自动操作神器PyAutoGUI的使用教程 什么是PyAutoGUI PyAutoGUI是一个Python第三方库,可以模拟鼠标和键盘的操作,在屏幕上定位和控制光标,自动化计算机的任务。使用PyAutoGUI可以实现自动登录、自动填写表单、自动截图等各种自动化过程。 PyAutoGUI安装 在命令行里执行以下命令安装PyAutoGUI: pip i…

    python 2023年5月19日
    00
  • Python 使用partial()函数

    Python中的partial函数可以帮助我们将一个函数变成另一个函数,可以固定一个或者多个参数。partial常常用于在调用函数时,我们并不想传递一个完整的参数列表,而是想预先设置一些参数进行函数调用。这在函数式编程中非常常见,以下是partial的使用方法与示例。 partial函数的使用方法 partial函数属于Python标准库functools中…

    python-answer 2023年3月25日
    00
  • python数据预处理 :数据抽样解析

    Python数据预处理:数据抽样解析 什么是数据抽样? 数据抽样是从整个数据集中选择一部分数据样本进行分析。大型数据集通常不能完全处理,因此采用数据抽样的方法能够减少计算复杂度、提高计算速度,并保留足够的信息量以支持后续的数据分析、建模和可视化。 数据抽样可以分为两类:随机抽样和非随机抽样。其中,随机抽样包括简单随机抽样、分层抽样、系统抽样等,非随机抽样包括…

    python 2023年6月3日
    00
  • Python 如何限制输出日志的大小

    限制Python输出日志的大小,是通过设置日志记录器的处理器来实现的。可以通过Python内置的logging模块来实现这个目标。具体步骤如下: 1. 创建日志记录器 使用logging.getLogger()方法创建一个记录器对象。可以为这个记录器对象设置名称,方便后续调用和管理。 import logging logger = logging.getLo…

    python 2023年6月5日
    00
  • Python实现多进程的四种方式

    我将为您详细讲解Python实现多进程的四种方式。 1. 使用os.fork()实现多进程 os.fork()是在Unix及类Unix操作系统中实现多进程的一种方式。它会在当前进程中创建一个新的进程,称为子进程,并复制当前进程的内存空间、数据等内容到子进程中。使用示例如下: import os pid = os.fork() if pid == 0: # T…

    python 2023年5月19日
    00
  • python用match()函数爬数据方法详解

    以下是详细讲解“Python用match()函数爬数据方法详解”的完整攻略,包括match()函数的介绍、参数说明、示例说明和注意事项。 match()函数的介绍 在Python中,match()函数是re模块中的一个函数,用于从字符串的开头匹配正则表达式。match()函数的语法如下: re.match(pattern, string, flags=0) …

    python 2023年5月14日
    00
  • python实现处理Excel表格超详细系列

    我来为您详细讲解“Python实现处理Excel表格超详细系列”的完整实例教程。 概述 本系列教程将介绍如何使用Python处理Excel表格。这可能是每个数据科学家和分析师的必修课,因为Excel表格是我们处理数据的常见工具之一。在本系列教程中,我们将介绍Python在Excel数据处理中的作用,包括读取、写入、操作和分析Excel表格的能力。我们将使用一…

    python 2023年5月13日
    00
  • 介绍Python的Urllib库的一些高级用法

    下面是详细讲解介绍Python的Urllib库的一些高级用法的完整攻略: 介绍Python的Urllib库的一些高级用法 什么是Urllib库 Urllib库是Python内置的HTTP请求库,它具有发送HTTP请求、处理HTTP响应、管理HTTP Cookie等功能,是Python进行Web编程中必备的一部分。 Urllib库的高级用法 1. 使用代理发送…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部