优化import scipy.fftpack as fp from skimage.io import imread from skimage.color import rgb2gray, gray2rgb import matplotlib.pyplot as plt from skimage.draw import rectangle_perimeter import numpy as np import cv2 import numpy as np import matplotlib.pylab as plt from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import from mpl_toolkits.axes_grid1 import make_axes_locatable from skimage.metrics import peak_signal_noise_ratio, structural_similarity from sklearn.metrics import mean_squared_error, mean_absolute_error from matplotlib.ticker import LinearLocator, FormatStrFormatter from scipy.fftpack import dct, idct import cv2 as cv def dct2(a): return dct(dct(a, axis=0, norm='ortho'), axis=1, norm='ortho') def idct2(a): return idct(idct(a, axis=0, norm='ortho'), axis=1, norm='ortho') im = rgb2gray(imread('2.jpg')) imF = dct2(im) im1 = idct2(imF) print(np.allclose(im, im1)) plt.figure(figsize=(10,5)) plt.gray() # 绘制第一个子图 plt.subplot(121), plt.imshow(im), plt.axis('off'), plt.title('original image', size=10) # 显示第一个子图 plt.show() # 绘制第二个子图 plt.subplot(122), plt.imshow(im1), plt.axis('off'), plt.title('reconstructed image (DCT+IDCT)', size=10) ,使能控制压缩率
时间: 2024-02-20 22:59:38 浏览: 22
为了控制压缩率,您可以使用DCT系数的阈值来减少它们的数量。具体来说,您可以将DCT系数的绝对值与一个阈值进行比较,并将小于该阈值的系数设置为零。这个阈值越高,压缩率就越高,但是图像质量也会受到影响。您可以使用以下代码来实现这一点:
```python
# 设置阈值
threshold = 0.1
# 对DCT系数进行阈值处理
imF_thresh = imF * (np.abs(imF) > (threshold*np.max(imF)))
# 对处理后的DCT系数进行IDCT反变换
im2 = idct2(imF_thresh)
# 显示处理前后的图像
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 5))
ax = axes.ravel()
ax[0].imshow(im, cmap=plt.cm.gray)
ax[0].set_title('Original image')
ax[1].imshow(im2, cmap=plt.cm.gray)
ax[1].set_title('Compressed image (DCT+IDCT)')
for a in ax:
a.axis('off')
plt.show()
```
在这个例子中,我们将阈值设置为0.1,即只保留最大DCT系数的10%。您可以根据需要调整这个值来控制压缩率和图像质量。
相关问题
pycharm将import scipy.fftpack as fp from skimage.io import imread from skimage.color import rgb2gray, gray2rgb import matplotlib.pyplot as plt from skimage.draw import rectangle_perimeter import numpy as np import cv2 import numpy as np import matplotlib.pylab as plt from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import from mpl_toolkits.axes_grid1 import make_axes_locatable from skimage.metrics import peak_signal_noise_ratio, structural_similarity from sklearn.metrics import mean_squared_error, mean_absolute_error from matplotlib.ticker import LinearLocator, FormatStrFormatter from scipy.fftpack import dct, idct import cv2 as cv def dct2(a): return dct(dct(a, axis=0, norm='ortho'), axis=1, norm='ortho') def idct2(a): return idct(idct(a, axis=0, norm='ortho'), axis=1, norm='ortho') im = rgb2gray(imread('2.jpg')) imF = dct2(im) im1 = idct2(imF) print(np.allclose(im, im1))优化一下,能控制压缩率
好的,你可以考虑使用基于DCT的图像压缩算法,通过调整量化表来控制压缩比率和图像质量之间的平衡。具体来说,你可以将DCT系数进行量化,然后设置一个量化参数Q,通过调整Q的大小来控制压缩比率和图像质量之间的平衡。一般来说,Q的值越大,压缩比率就越小,图像质量就越好,反之亦然。
下面是一个简单的基于DCT的图像压缩代码示例,你可以根据需要进行修改和优化:
```python
import numpy as np
import cv2
from scipy.fftpack import dct, idct
def dct2(a):
return dct(dct(a, axis=0, norm='ortho'), axis=1, norm='ortho')
def idct2(a):
return idct(idct(a, axis=0, norm='ortho'), axis=1, norm='ortho')
def compress_image(im, Q):
# 对图像进行DCT变换
imF = dct2(im)
# 设置量化矩阵
QM = 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]])
# 进行量化
imQ = np.round(imF / (QM * Q))
# 对图像进行IDCT变换
im1 = idct2(imQ)
# 限制像素值在0到255之间
im1 = np.clip(im1, 0, 255)
im1 = im1.astype(np.uint8)
return im1
# 读取图像
im = cv2.imread('lena.png', cv2.IMREAD_GRAYSCALE)
# 设置量化参数Q
Q = 50
# 进行图像压缩
im1 = compress_image(im, Q)
# 计算压缩比率
cr = im.size / (im1.size * np.ceil(np.log2(Q)))
# 计算PSNR和SSIM
psnr = peak_signal_noise_ratio(im, im1)
ssim = structural_similarity(im, im1, multichannel=False)
# 输出结果
print('压缩比率: {:.2f}'.format(cr))
print('PSNR: {:.2f}'.format(psnr))
print('SSIM: {:.2f}'.format(ssim))
```
在上面的代码中,你可以调整量化参数Q的大小来控制压缩比率和图像质量之间的平衡。同时,通过计算PSNR和SSIM等指标,可以对压缩后的图像质量进行评估。
import numpy as np import matplotlib.pyplot as plt from scipy.io import loadmat
这段代码导入了一些常用的Python库和加载.mat文件的函数loadmat。具体解释如下:
- numpy:Python数学计算库,提供了高效的数组运算和大量的数学函数。
- matplotlib.pyplot:Python绘图库,提供了广泛的绘图功能和自定义选项。
- scipy.io.loadmat:Scipy科学计算库的一个函数,用于读取MATLAB格式的数据文件。