写一个在jupyter notebooks上运行的对一张三通道彩色图像进行DWT图像压缩代码,要求压缩率为43%
时间: 2024-02-17 08:00:18 浏览: 124
利用DCT以及DWT 对图像进行压缩MATLAB
好的,我为您提供一个基于 PyWavelets 库实现的对彩色图像进行 2D 离散小波变换(DWT)压缩的示例代码,并设定一个压缩率大约为 43% 的目标。
首先,我们需要安装 PyWavelets 库,您可以通过以下命令在 jupyter notebooks 上安装:
```python
!pip install pywavelets
```
接下来,我们准备一张彩色图像,并将其转换为 YCbCr 颜色空间,在该颜色空间下进行 DWT 压缩:
```python
import numpy as np
import pywt
import cv2
# 读入彩色图像
img = cv2.imread('example.jpg')
# 将图像转换为 YCbCr 颜色空间
img_ycc = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)
# 对每个通道分别进行 2D 离散小波变换
coeffs = []
for i in range(3):
c = pywt.dwt2(img_ycc[:,:,i], 'haar')
coeffs.append(c)
# 将小波系数转换为 numpy 数组
coeffs_arr = []
for c in coeffs:
ca, (ch, cv, cd) = c
coeffs_arr.append(ca)
coeffs_arr.append(ch)
coeffs_arr.append(cv)
coeffs_arr.append(cd)
coeffs_arr = np.array(coeffs_arr)
# 对小波系数进行阈值处理和量化
thresh = 0.1 * np.max(coeffs_arr)
coeffs_arr[np.abs(coeffs_arr) < thresh] = 0
coeffs_arr = np.round(coeffs_arr)
# 将小波系数组合成 DWT 压缩后的图像
reconstructed = []
for i in range(0, len(coeffs_arr), 4):
c = (coeffs_arr[i], (coeffs_arr[i+1], coeffs_arr[i+2], coeffs_arr[i+3]))
r = pywt.idwt2(c, 'haar')
reconstructed.append(r)
# 将压缩后的图像转换回 RGB 颜色空间
reconstructed = np.stack(reconstructed, axis=2)
reconstructed = cv2.cvtColor(reconstructed.astype('uint8'), cv2.COLOR_YCR_CB2BGR)
```
最后,我们可以计算压缩率并显示原始图像和压缩后的图像:
```python
# 计算压缩率
original_size = img.shape[0] * img.shape[1] * img.shape[2] * 8
compressed_size = coeffs_arr[coeffs_arr != 0].shape[0] * 8
compression_ratio = compressed_size / original_size
print(f"Compression ratio: {compression_ratio:.2f}")
# 显示原始图像和压缩后的图像
cv2.imshow('Original', img)
cv2.imshow('Compressed', reconstructed)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
注意,这里的压缩率只是一个大约的目标,实际上压缩率会受到多个因素的影响,例如所使用的小波变换类型、阈值处理和量化方法等,因此您可能需要通过多次试验和调整来实现更接近目标的压缩率。
阅读全文