写一个在jupyter notebooks上运行的基于DCT变换的图像压缩代码
时间: 2024-02-15 21:03:40 浏览: 141
基于DCT变换的图像压缩算法
好的,下面是在Jupyter Notebooks上运行的基于DCT变换的图像压缩代码,同样使用Python语言实现:
```python
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 定义DCT变换函数
def dct2(block):
return cv2.dct(cv2.dct(block.T).T)
# 定义IDCT变换函数
def idct2(block):
return cv2.idct(cv2.idct(block.T).T)
# 定义图像压缩函数
def compress(img, ratio):
# 将图像分成8x8的小块
h, w = img.shape[:2]
blocks = [img[j:j+8, i:i+8] for (j, i) in np.ndindex(h//8, w//8)]
# 对每个小块进行DCT变换
dct_blocks = [dct2(block.astype(np.float32) - 128) for block in blocks]
# 对每个小块进行量化
quant_blocks = [np.round(block / (ratio * qtable)) for block in dct_blocks]
# 对每个小块进行IDCT变换
idct_blocks = [idct2(block * (ratio * qtable)) for block in quant_blocks]
# 将所有小块拼接成压缩后的图像
img_compress = np.empty_like(img)
for (j, i), block in zip(np.ndindex(h//8, w//8), idct_blocks):
img_compress[j*8:j*8+8, i*8:i*8+8] = np.clip(block + 128, 0, 255)
return img_compress
# 定义量化表
qtable = np.array([
[16, 11, 10, 16, 24, 40, 51, 61],
[12, 12, 14, 19, 26, 58, 60, 55],
[14, 13, 16, 24, 40, 57, 69, 56],
[14, 17, 22, 29, 51, 87, 80, 62],
[18, 22, 37, 56, 68, 109, 103, 77],
[24, 35, 55, 64, 81, 104, 113, 92],
[49, 64, 78, 87, 103, 121, 120, 101],
[72, 92, 95, 98, 112, 100, 103, 99]
], dtype=np.float32)
# 加载图像
img = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)
# 显示原始图像
plt.imshow(img, cmap='gray')
plt.title('Original Image')
plt.axis('off')
plt.show()
# 对图像进行压缩
img_compress = compress(img, 0.5)
# 显示压缩后的图像
plt.imshow(img_compress, cmap='gray')
plt.title('Compressed Image')
plt.axis('off')
plt.show()
```
这个代码可以在Jupyter Notebooks上直接运行,它将输入的图像分成8x8的小块,对每个小块进行DCT变换和量化,再进行IDCT变换,最后显示原始图像和压缩后的图像。其中,量化表是用于控制图像压缩比例的参数,量化表中的数字越大,压缩比例越高。
阅读全文