Я пробую простое сжатие изображений с использованием PIL и Numpy.
Я выполняю следующие шаги:
1) Преобразование из трехмерного массива (цветное изображение) в 2d-массив в оттенках серого
2) Вычтите 128 из каждого значения массива numpy для центрирования
3) Примените DCT к результирующему массиву
4) Разделите каждое 8 на 8 на матрицу квантования ниже.
По завершении вышеуказанных шагов я понимаю, что не могу сохранить изображение, пока не конвертирую его в uint8 (от 0 до 255). Также, если я сохраню в uint8, изображение будет очень плохой копией фактического изображения, а его размер почти в 5 раз больше размера существующего изображения.
Что мне не хватает в процессе.
Ниже тестовое изображение Я не хочу применять кодировку et c. , но это не обязательно.
# 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,16,24,40,57,69,56],
[14,17,22,29,51,87,80,62],
[18,22,37,56,68,109,103,77],
[25,35,55,64,81,104,113,92],
[49,64,78,87,103,121,120,101],
[72,92,95,98,112,100,103,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')