使用PIl和numpy进行图像压缩

我正在尝试使用PIL和Numpy进行简单的图像压缩。

我正在执行以下步骤:

1)从3d数组(彩色图像)转换为灰度2d数组

2)从numpy数组的每个值中减去128进行居中

3)将DCT应用于结果数组

4)用下面的量化矩阵将每个8 x 8块除。

完成上述步骤后,我意识到除非将图像转换为uint8(0至255),否则无法保存图像。 另外,如果我保存在uint8中,则该图像是实际图像的非常糟糕的副本,并且其大小几乎是现有图像大小的5倍。

我在此过程中缺少什么。

下面是测试图像

使用PIl和numpy进行图像压缩

我不想应用任何编码等,但这不是必需的。

# DCT based image transform

import PIL
from PIL import Image
import numpy as np
from scipy.fftpack import fft,dct
image = Image.open('7a1a6fcba15c2f3feb72726aa2386f30.jpg')
im = np.array(image.convert('L'))
gr_im= Image.fromarray(im).save('glasses.jpg')
im_step1 = np.int8(im) - 128 # Convert fromunit8 to int8 and subtract 128 from each element for centering 

quant = np.array([[16,11,10,16,24,40,51,61],[12,12,14,19,26,58,60,55],[14,13,57,69,56],17,22,29,87,80,62],[18,37,56,68,109,103,77],[25,35,55,64,81,104,113,92],[49,78,121,120,101],[72,92,95,98,112,100,99],])

num_row,num_col =im_step1.shape
for i in range ( 0,num_row,8):
    for j in range( 0,num_col,8):
        im_step1[i:i+8,j:j+8] = dct(im_step1[i:i+8,j:j+8])
        im_step1[i:i+8,j:j+8] = im_step1[i:i+8,j:j+8]/quant

im_step1 = np.uint8(im_step1)
conv_im= Image.fromarray(im_step1).save('glasses_conv.jpg')
iCMS 回答:使用PIl和numpy进行图像压缩

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2257220.html

大家都在问