python DWT图像压缩
时间: 2023-12-07 21:39:46 浏览: 134
离散小波变换(DWT)是一种常用的图像压缩技术,可以将图像分解为多个频带,从而实现对图像的压缩。下面是一个使用Python实现DWT图像压缩的例子:
```python
import pywt
import cv2
# 读取图像
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
# 进行二维离散小波变换
coeffs = pywt.dwt2(img, 'haar')
# 将小波系数进行量化
coeffs = list(map(lambda x: pywt.threshold(x, 10, 'soft'), coeffs))
# 进行二维离散小波反变换
img_dwt = pywt.idwt2(coeffs, 'haar')
# 显示原图和压缩后的图像
cv2.imshow('Original Image', img)
cv2.imshow('DWT Compressed Image', img_dwt)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上面的代码中,我们首先使用OpenCV库读取了一张灰度图像,然后使用PyWavelets库进行了二维离散小波变换。接着,我们对小波系数进行了量化,并使用PyWavelets库进行了二维离散小波反变换,得到了压缩后的图像。最后,我们使用OpenCV库将原图和压缩后的图像显示出来。
相关问题
对一张彩色图像进行DWT图像压缩,并计算压缩率,在jupyter notebooks上实现
好的,实现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 反变换,得到了压缩后的图像。你可以根据实际需求和喜好,选择其他小波变换方法,调整阈值和量化因子来获得更好的压缩效果。
写一个在jupyter notebooks上基于DWT图像压缩的代码,并能计算压缩率
好的,以下是基于DWT的图像压缩代码:
```python
import pywt
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image
def dwt_compress(image_path, compression_ratio):
# 加载图像
image = Image.open(image_path)
image_array = np.array(image)
# 对图像进行2级DWT分解
coeffs2 = pywt.dwt2(image_array, 'haar')
LL, (LH, HL, HH) = coeffs2
LL2, (LH2, HL2, HH2) = pywt.dwt2(LL, 'haar')
# 获取DWT系数
coeffs = [LL2, LH2, HL2, HH2]
# 对DWT系数进行压缩
for i in range(len(coeffs)):
# 将系数按照重要性进行排序
sorted_coeffs = np.sort(np.abs(coeffs[i]), axis=None)[::-1]
# 计算需要保留的系数个数
num_coeffs = int(len(sorted_coeffs) * compression_ratio)
# 将剩余的系数置为0
threshold = sorted_coeffs[num_coeffs]
coeffs[i][np.abs(coeffs[i]) < threshold] = 0
# 对DWT系数进行2级反DWT重构
LLr = pywt.idwt2((LL2, (LH2, HL2, HH2)), 'haar')
image_array_reconstructed = pywt.idwt2((LLr, (LH, HL, HH)), 'haar')
# 显示原图和压缩后的图像
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
axs[0].imshow(image_array, cmap='gray')
axs[0].set_title('Original Image')
axs[1].imshow(image_array_reconstructed, cmap='gray')
axs[1].set_title('Reconstructed Image')
plt.show()
# 计算压缩率
original_size = image_array.shape[0] * image_array.shape[1]
compressed_size = np.sum([coeffs[i].size for i in range(len(coeffs))])
compression_ratio = compressed_size / original_size
print('Compression ratio:', compression_ratio)
```
代码中的`dwt_compress`函数接收图像路径和压缩比作为输入,输出压缩后的图像,并计算压缩率。在函数内部,我们首先加载图像,然后进行2级DWT分解。接着,我们对每个DWT系数进行压缩,具体的方法是,将系数按照绝对值大小进行排序,然后保留前N个系数,将剩余的系数置为0。最后,我们对压缩后的系数进行2级反DWT重构,得到压缩后的图像。
下面是一个示例,演示如何对一个图像进行压缩:
```python
dwt_compress('lena.png', 0.05)
```
这将对`lena.png`图像进行压缩,保留原始图像的5%的DWT系数。运行代码后,将显示原始图像和压缩后的图像,并输出压缩率。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)