采用SVD分解对图片(lina)进行图片压缩的代码、图片及相关说明文件。
时间: 2024-10-16 17:12:19 浏览: 73
SVD(奇异值分解)是一种线性代数技术,常用于图像处理中的数据降维和压缩。下面是一个简单的Python示例,使用NumPy库来演示如何利用SVD对图片进行压缩:
```python
import numpy as np
from PIL import Image
# 读取图片
def load_image(image_path):
img = Image.open(image_path)
return np.array(img)
# 使用SVD进行压缩
def compress_image_svd(image, compression_ratio=0.9):
# 将图片转换为灰度图,如果原图已经是灰度,则可以跳过这一步
if image.ndim == 3 and image.shape[2] > 1:
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 对图像进行归一化
image = image.astype('float') / 255.0
# SVD分解
u, s, vh = np.linalg.svd(image)
# 获取压缩后的s矩阵,保留指定比例的非零奇异值
s_compressed = s[:int(s.size * compression_ratio)]
# 构建压缩后的U和Vh
compressed_U = u[:, :int(s.size * compression_ratio)]
compressed_Vh = vh[:int(s.size * compression_ratio), :]
# 重构压缩后的图像
reconstructed_image = (compressed_U @ np.diag(s_compressed) @ compressed_Vh).clip(0, 1)
return reconstructed_image
# 示例:假设你有一个名为"lena.jpg"的图片文件
image_path = "lena.jpg"
compressed_image = compress_image_svd(load_image(image_path), compression_ratio=0.9)
# 可能需要将压缩后的图像保存到新的文件
cv2.imwrite("compressed_lena.jpg", compressed_image)
#
阅读全文