Сжатие изображений с использованием PIl & numpy - PullRequest
0 голосов
/ 28 мая 2020

Я пробую простое сжатие изображений с использованием PIL и Numpy.

Я выполняю следующие шаги:

1) Преобразование из трехмерного массива (цветное изображение) в 2d-массив в оттенках серого

2) Вычтите 128 из каждого значения массива numpy для центрирования

3) Примените DCT к результирующему массиву

4) Разделите каждое 8 на 8 на матрицу квантования ниже.

По завершении вышеуказанных шагов я понимаю, что не могу сохранить изображение, пока не конвертирую его в uint8 (от 0 до 255). Также, если я сохраню в uint8, изображение будет очень плохой копией фактического изображения, а его размер почти в 5 раз больше размера существующего изображения.

Что мне не хватает в процессе.

Ниже тестовое изображение Glasses.jpg Я не хочу применять кодировку 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...