对一张彩色图像进行DWT图像压缩,并计算压缩率,在jupyter notebooks上实现
时间: 2024-02-17 21:01:00 浏览: 130
好的,实现DWT图像压缩的步骤如下:
1. 读取彩色图像,并将其转换为灰度图像。
2. 使用 PyWavelets 库进行 DWT 变换,得到低频系数和高频系数。
3. 对高频系数进行量化和熵编码,将其压缩,得到压缩后的高频系数。
4. 将低频系数和压缩后的高频系数进行 IDWT 反变换,得到压缩后的图像。
5. 计算压缩率。
下面是实现代码:
```python
import pywt
import numpy as np
from scipy import fftpack
from PIL import Image
import matplotlib.pyplot as plt
def compress_image_DWT(image, threshold, quantization_factor):
# 将图像转换为灰度图像
gray_image = image.convert('L')
# 将灰度图像转换为 numpy 数组
image_array = np.array(gray_image)
# 使用 Haar 小波进行两级 DWT 变换
coeffs = pywt.wavedec2(image_array, 'haar', mode='periodization', level=2)
# 对高频系数进行量化
quant_coeffs = []
for i in range(1, len(coeffs)):
quant_coeffs.append(np.round(coeffs[i] / quantization_factor))
# 对高频系数进行熵编码
compressed_coeffs = []
for i in range(len(quant_coeffs)):
compressed_coeffs.append(fftpack.dct(quant_coeffs[i].ravel(), norm='ortho'))
# 根据阈值将高频系数进行压缩
compressed_coeffs = [c for c in compressed_coeffs if np.abs(c) > threshold]
# 将高频系数进行 IDCT 反变换
decompressed_coeffs = []
for i in range(len(compressed_coeffs)):
decompressed_coeffs.append(fftpack.idct(compressed_coeffs[i], norm='ortho').reshape(quant_coeffs[i].shape))
# 将低频系数和反变换后的高频系数进行 IDWT 反变换
coeffs[0] = pywt.threshold(coeffs[0], threshold)
coeffs[1:] = decompressed_coeffs
compressed_image = pywt.waverec2(coeffs, 'haar', mode='periodization')
# 计算压缩率
compressed_size = sum([c.nbytes for c in compressed_coeffs])
original_size = image_array.nbytes
compression_ratio = compressed_size / original_size
return compressed_image, compression_ratio
# 读取图像
image = Image.open('lena.png')
# 压缩图像
threshold = 50
quantization_factor = 10
compressed_image, compression_ratio = compress_image_DWT(image, threshold, quantization_factor)
# 显示压缩前后的图像
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].imshow(image, cmap='gray')
ax[0].set_title('Original Image')
ax[1].imshow(compressed_image, cmap='gray')
ax[1].set_title('Compressed Image')
# 显示压缩率
plt.figtext(0.5, 0.9, f'Compression Ratio: {compression_ratio:.2%}', ha='center', fontsize=12)
plt.show()
```
在这个示例中,我们使用了 Haar 小波进行 DWT 变换,并对高频系数进行了量化和熵编码,然后根据阈值将高频系数进行压缩。最后将低频系数和反变换后的高频系数进行 IDWT 反变换,得到了压缩后的图像。你可以根据实际需求和喜好,选择其他小波变换方法,调整阈值和量化因子来获得更好的压缩效果。
阅读全文