数学建模社区-数学中国

标题: 图像压缩(主成分分析) [打印本页]

作者: 2744557306    时间: 2024-3-31 16:40
标题: 图像压缩(主成分分析)
数据集:任意选择一组图片。
7 |0 ^& r# R& N任务:使用PCA对图片进行压缩和重构。
( D# K: P) m+ w) c" P, F挑战:分析压缩比例与图像质量之间的关系,并尝试使用其他降维技术。1 E  P& U, S' r& m
使用PCA进行图像压缩和重构( V( h" e5 D) Y
假设你已经安装了必要的Python库,如numpy, matplotlib, 和scikit-learn。如果没有,你可以通过pip安装它们。
5 t4 W( R, {5 n; ^+ F% N# ?3 Y
  }6 ~6 I  b4 l7 m7 W5 Q4 O& R6 C0 \以下是使用PCA对单张图片进行压缩和重构的步骤:6 j5 Z) W9 n: v+ R( C! ]( ?+ n

) }4 C! }6 t2 i' x! g8 }加载图片:首先,我们需要加载一张图片并将其转换为合适的格式。
, L" H2 E7 J5 t  _- {( Y; N9 y7 G" \$ s- ?
应用PCA:然后,我们将应用PCA来降低图片的维度,实现压缩。/ E2 z8 R6 t, e6 |" ]* y0 [

6 n3 _  G# L, R5 J% n% H! C8 o# X重构图片:最后,我们将使用PCA的逆变换来重构图片,尽量恢复原始图片。
  1. import numpy as np
    9 J/ O2 H$ O/ U0 m/ c2 C( X
  2. from sklearn.decomposition import PCA! x: m2 j/ i2 A
  3. import matplotlib.pyplot as plt+ V* o. x$ O9 C7 s; z0 |
  4. from PIL import Image
    ) H- |* X" E2 G5 {. C! s* ^

  5. ; i( d' s  U7 ^. o" ?: Z
  6. # 加载图片并转换为灰度图
    8 z2 H. T9 x* r" y' g3 t4 d% W
  7. image_path = 'path_to_your_image.jpg'( n3 r  p8 M  V0 _2 t- K5 ?$ m
  8. image = Image.open(image_path).convert('L')
    ; p6 L; j4 A- v5 O
  9. image_array = np.array(image)# n9 [% t8 v7 M

  10. : C9 }. Y3 r" f+ r% C
  11. # 展平图像数组
    ! T* s) l- I7 O. ?' j; ~8 D. N: D
  12. h, w = image_array.shape
    " l' a. d( O6 e5 s% n
  13. image_flattened = image_array.flatten().reshape(1, h * w)( N4 K3 j3 h' i0 S5 j! p4 s8 i
  14. ' a( l- @2 |. D  l0 o/ A
  15. # 应用PCA
    # X' {" y6 @) ^0 V+ |0 v3 u( y+ y
  16. n_components = 100  # 选择保留的主成分数量
    ( B7 U0 I# Z8 A
  17. pca = PCA(n_components=n_components)3 Z. b1 d/ z1 ^" {
  18. image_compressed = pca.fit_transform(image_flattened)% q( p" W! I2 Z# e4 c6 _+ ~* C  E, ?

  19. & T& {+ G/ r7 @+ _. J' ]; X
  20. # 重构图像
    ( x1 G8 I' t1 E* c% X* y
  21. image_reconstructed = pca.inverse_transform(image_compressed).reshape(h, w)
    % F) f% K! r3 u) v: ^# |

  22. % U  C2 G9 b9 o1 d, h$ u5 c2 b/ N5 J
  23. # 显示原始和重构的图像
    + B2 r- r, E) o2 H0 E
  24. plt.figure(figsize=(10, 5))
      M( X6 Y. [& o. J
  25. plt.subplot(1, 2, 1)
    * F2 @, x& j/ H! [6 ~
  26. plt.imshow(image_array, cmap='gray')- p+ ?, n4 b* `' Y2 I7 m
  27. plt.title('Original Image')
    . b2 B$ n# h( j* y
  28. plt.subplot(1, 2, 2)
    3 ^2 f" l" J+ z; {- Z2 Q+ H
  29. plt.imshow(image_reconstructed, cmap='gray')% D4 c% \5 t% O) O' H
  30. plt.title('Reconstructed Image')5 P8 e6 ?: M. K7 }
  31. plt.show()
复制代码
分析压缩比例与图像质量之间的关系
) j7 @% N) ?, K* _2 F) O  T压缩比例与图像质量之间的关系可以通过改变n_components(PCA中保留的主成分数量)来探索。减少n_components会增加压缩比例,但可能会降低重构图像的质量。通过观察不同n_components值对应的重构图像,可以分析这种权衡关系。* i" O! J% @: K% e3 v; \9 F0 m
! w) K7 h9 E. n  {
尝试其他降维技术
2 {4 `( \6 ~7 x; K1 M/ a! w8 ^除了PCA之外,还有其他降维技术可以用于图像压缩,例如:
3 j9 L: e) ]$ `8 S
. W0 R8 b" H* K2 L. \' v# H- s随机投影(sklearn.random_projection)
, W# e$ ?$ \! f% t% P8 F非负矩阵分解(NMF,sklearn.decomposition.NMF)4 Z# W" k: u4 w
这些方法也可以用类似的方式应用于图像压缩,通过比较不同方法的效果,你可以深入理解各种降维技术在图像压缩任务中的表现和适用性。
/ h. I# o  a; L/ y- s3 q* x& a2 M  |0 X/ k
3 _$ p5 f0 x0 A1 @+ T: s
4 Y3 R& E- V9 O2 @) t& T$ S% U/ {. X





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5