数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-3-31 16:40
标题: 图像压缩(主成分分析)
数据集:任意选择一组图片。
" W, A/ C3 }( d- H9 `+ X6 j6 `: h任务:使用PCA对图片进行压缩和重构。8 ^6 ^1 e6 F# z+ `7 D( X0 r; S% g
挑战:分析压缩比例与图像质量之间的关系,并尝试使用其他降维技术。
" X; y  d, I$ B3 P使用PCA进行图像压缩和重构4 g/ @% N( ~. ~9 p
假设你已经安装了必要的Python库,如numpy, matplotlib, 和scikit-learn。如果没有,你可以通过pip安装它们。
& G% I$ v1 ~7 [" Y: i* e0 J. ^' ]; V5 [5 t+ I
以下是使用PCA对单张图片进行压缩和重构的步骤:
  s" j( J* W- y. M( G8 N% p
" |# j# p. o# R  `  N+ x& N5 S加载图片:首先,我们需要加载一张图片并将其转换为合适的格式。: J% R  A1 Y$ A0 ]) O; P0 I. a
+ b" A- E8 }  t- R& e8 M4 y
应用PCA:然后,我们将应用PCA来降低图片的维度,实现压缩。  Q5 e* s4 G" M) n: s* m+ V

2 f# C6 E' q+ y: [* _重构图片:最后,我们将使用PCA的逆变换来重构图片,尽量恢复原始图片。
  1. import numpy as np% ~4 k7 R. A& D% K2 L8 M6 x
  2. from sklearn.decomposition import PCA
    # a8 e1 x# @/ U0 x+ ^. C" q
  3. import matplotlib.pyplot as plt
    . {+ j# y8 V* p+ C0 ~( G' d/ D
  4. from PIL import Image
      d+ W* f0 u5 w& {" w

  5. 8 n2 ^4 i& @: N  o( j- v9 r
  6. # 加载图片并转换为灰度图
    # [$ K/ V+ W' w/ [
  7. image_path = 'path_to_your_image.jpg'/ R* A! {8 T; z4 ^$ K
  8. image = Image.open(image_path).convert('L')
    * @: s3 ^% ~$ ?4 |9 u3 y! X
  9. image_array = np.array(image)3 r2 U8 y" ~! ]& I: q

  10. + @) x7 d6 v. ~5 ~- I, g
  11. # 展平图像数组! G% X$ o3 Z2 y# }
  12. h, w = image_array.shape
    8 a1 z9 s& Y, r" ~. w6 {4 d. C/ U2 k
  13. image_flattened = image_array.flatten().reshape(1, h * w)
    7 k. E8 G+ b: F8 T: Z
  14. , l2 h. @1 Y# ~; F% ]- j7 H; Q
  15. # 应用PCA
    4 g- V1 w& K2 Z5 c" _% j
  16. n_components = 100  # 选择保留的主成分数量6 z. \: S& F! i# D1 |4 d1 c! Y/ J
  17. pca = PCA(n_components=n_components)# F2 `+ }1 c0 y& j' Y$ H0 W
  18. image_compressed = pca.fit_transform(image_flattened)4 D5 i/ A6 G2 s- r6 v

  19. 5 V* l( x' o0 z! m* ^. p
  20. # 重构图像
    ' }1 I) R$ M* {% [+ s
  21. image_reconstructed = pca.inverse_transform(image_compressed).reshape(h, w)
    8 |9 t) L6 K8 ?( @* f) `: B

  22. ( }+ W3 M. M/ X+ J6 y1 O' p2 c
  23. # 显示原始和重构的图像
    2 [' U0 N6 L1 ~, b0 p0 u
  24. plt.figure(figsize=(10, 5))
    1 q0 V" i# A8 |  z- d
  25. plt.subplot(1, 2, 1)
    9 Y, T' v- B9 Y( `2 j+ \
  26. plt.imshow(image_array, cmap='gray')
    3 J* X# s- N7 s  J. s
  27. plt.title('Original Image')
    : t0 P, s& x  V& e/ F
  28. plt.subplot(1, 2, 2)7 R7 b. `- Y* f8 D1 v( l7 n
  29. plt.imshow(image_reconstructed, cmap='gray')
    ! _1 @3 O7 w( X( ^0 x) A
  30. plt.title('Reconstructed Image'); R. l6 ~3 p7 m3 F% `+ n! T
  31. plt.show()
复制代码
分析压缩比例与图像质量之间的关系
, Y% ?- P& i& q- h, B压缩比例与图像质量之间的关系可以通过改变n_components(PCA中保留的主成分数量)来探索。减少n_components会增加压缩比例,但可能会降低重构图像的质量。通过观察不同n_components值对应的重构图像,可以分析这种权衡关系。# K  y) X( w% O; [  N9 W, ~* ]

; c' X5 C7 c) S尝试其他降维技术/ B6 N) Q2 a0 b1 j
除了PCA之外,还有其他降维技术可以用于图像压缩,例如:; t8 [1 A$ O  `
6 I6 |& u$ C1 y; j
随机投影(sklearn.random_projection)
# i0 f. T" ~( @$ e3 Y0 W非负矩阵分解(NMF,sklearn.decomposition.NMF)
: J" B$ d0 P0 |1 x9 r这些方法也可以用类似的方式应用于图像压缩,通过比较不同方法的效果,你可以深入理解各种降维技术在图像压缩任务中的表现和适用性。
1 |% E6 n( B& p1 M, U) X# B: |
0 C/ R; i# R7 O: E$ N8 `
. T, m5 W8 M! g3 Q/ `' U' Z7 d
: q  j& x' O2 [" }" i- i! t




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