写一个在jupyter notebooks上对一个具有整数像素值的彩色图像基于DWT图像压缩的代码,并能计算压缩率,同时修改原始图像和压缩后的图像尺寸一致
时间: 2024-02-17 20:03:32 浏览: 73
好的,以下是基于DWT图像压缩的代码:
首先,我们需要导入所需的库和模块:
```python
import pywt
import numpy as np
from PIL import Image
import math
```
接下来,我们定义一个函数来对图像进行DWT压缩:
```python
def dwt_compression(image_path, level):
# 打开图像并将其转换为灰度图像
image = Image.open(image_path).convert('L')
# 获取图像的大小和像素值
width, height = image.size
pixels = np.array(image.getdata(), dtype=np.float).reshape((height, width))
# 对图像进行DWT变换
coeffs = pywt.wavedec2(pixels, 'haar', level=level)
# 将系数矩阵转换为一维向量
coeffs_vector = []
for i in coeffs:
for j in i:
coeffs_vector = coeffs_vector + list(j.flatten())
# 计算压缩率并打印
original_size = width * height
compressed_size = len(coeffs_vector)
compression_ratio = original_size / compressed_size
print("Compression ratio: %.2f" % compression_ratio)
# 将向量转换回系数矩阵
coeffs_matrix = []
index = 0
for i in coeffs:
row = []
for j in i:
row.append(np.array(coeffs_vector[index:index + j.size]).reshape(j.shape))
index += j.size
coeffs_matrix.append(row)
# 对系数矩阵进行反DWT变换
compressed_pixels = pywt.waverec2(coeffs_matrix, 'haar')
# 将像素值转换为整数并创建新的图像对象
compressed_pixels = np.uint8(compressed_pixels)
compressed_image = Image.fromarray(compressed_pixels)
# 调整新图像的大小以匹配原始图像
compressed_image = compressed_image.resize((width, height))
# 返回压缩后的图像对象和压缩比率
return compressed_image, compression_ratio
```
该函数需要两个参数:图像文件的路径和DWT变换的级别。它首先将图像转换为灰度图像,并将每个像素值存储在一个NumPy数组中。然后,它使用PyWavelets库对该数组进行DWT变换,并将系数矩阵转换为一维向量。接下来,它计算压缩率并将系数向量转换回系数矩阵。最后,它使用反DWT变换将系数矩阵转换回像素值,并将其转换为整数。该函数返回压缩后的图像对象和压缩比率。
现在,我们可以使用该函数来压缩一个图像并显示压缩后的图像和压缩比率:
```python
compressed_image, compression_ratio = dwt_compression('image.jpg', 2)
compressed_image.show()
```
这将打印出压缩率并显示压缩后的图像。
最后,我们需要将原始图像和压缩后的图像尺寸一致。我们可以使用PIL库中的resize函数来实现这一点:
```python
# 打开原始图像并将其转换为灰度图像
image = Image.open('image.jpg').convert('L')
# 获取图像的大小
width, height = image.size
# 压缩图像并调整大小以匹配原始图像
compressed_image, compression_ratio = dwt_compression('image.jpg', 2)
compressed_image = compressed_image.resize((width, height))
# 显示原始图像和压缩后的图像
image.show()
compressed_image.show()
```
这将打印出压缩率并显示原始图像和压缩后的图像,它们的尺寸将相同。
阅读全文