在jupyter notebooks上写一个基于离散小波变换(DWT)的压缩代码
时间: 2024-02-15 18:05:13 浏览: 150
好的,以下是一个基于离散小波变换(DWT)的图像压缩代码,你可以在 Jupyter Notebook 上运行它:
```python
import numpy as np
import pywt
from PIL import Image
from io import BytesIO
def compress_image(image, threshold):
"""
对图像进行压缩,返回压缩后的图像数据和压缩率。
:param image: PIL Image 对象
:param threshold: 阈值,小于该阈值的小波系数将被置零
:return: 压缩后的图像数据,压缩率
"""
# 将图像转换为灰度图像
image = image.convert('L')
# 将图像数据转换为数组
data = np.array(image)
# 将图像数据进行离散小波变换
coeffs = pywt.dwt2(data, 'haar')
cA, (cH, cV, cD) = coeffs
# 将小波系数进行阈值处理
cA = pywt.threshold(cA, threshold)
cH = pywt.threshold(cH, threshold)
cV = pywt.threshold(cV, threshold)
cD = pywt.threshold(cD, threshold)
# 将阈值处理后的小波系数进行逆变换,得到压缩后的图像数据
coeffs = cA, (cH, cV, cD)
compressed_data = pywt.idwt2(coeffs, 'haar')
# 将压缩后的图像数据转换为 PIL Image 对象
compressed_image = Image.fromarray(np.uint8(compressed_data))
# 计算压缩率
original_size = image.size[0] * image.size[1]
compressed_size = compressed_image.size[0] * compressed_image.size[1]
compression_ratio = compressed_size / original_size
return compressed_image, compression_ratio
```
在这个代码中,我们使用了 PyWavelets 库来进行离散小波变换。`compress_image` 函数接受一个 PIL Image 对象和一个阈值作为输入,并将图像压缩到该阈值以下的小波系数被置零。函数返回压缩后的图像数据和压缩率。
你可以使用以下代码来测试这个函数:
```python
# 读取原始图像
with open('test.jpg', 'rb') as f:
image_data = BytesIO(f.read())
original_image = Image.open(image_data)
# 对图像进行压缩
compressed_image, compression_ratio = compress_image(original_image, 20)
# 显示原始图像和压缩后的图像
original_image.show()
compressed_image.show()
# 输出压缩率
print(f'Compression ratio: {compression_ratio:.2f}')
```
在这个测试代码中,我们首先读取了一张测试图像,并将其传递给 `compress_image` 函数进行压缩。然后,我们分别显示原始图像和压缩后的图像,并输出了压缩率。
注意:这个代码中的阈值是一个超参数,需要根据具体应用场景进行调整。较小的阈值会产生较高的压缩率,但会导致图像失真;较大的阈值会产生较好的图像质量,但会导致较低的压缩率。
阅读全文