JPEG проблема преобразования DCT - PullRequest
0 голосов
/ 04 декабря 2018

Я пытался программировать преобразования JPEG в python, я был в состоянии сделать все шаги до сих пор, где мне нужно преобразовать мои данные обратно в новое изображение.это мой код на данный момент, будьте осторожны, мое использование переменных очень плохо.У меня не было много времени, чтобы закодировать это, и я все еще учусь, как кодировать на python.

from PIL import Image
import numpy as np
import sympy as sp
import skimage.util
from scipy import fftpack

#
#ALLEMAAL INFORMATIE GEEN BEREKENINGEN
img = Image.open('C:\\Users\\dbe\\Documents\\KULAK\\2018-2019\\Semester 1\\Python\\Python FFt\\mario4.png')  
img = img.convert('L') # converteren naar monochrome
img.show()
pixels = list(img.getdata())
pixelArray = np.array(img.getdata())
grootte = list(img.size)
kolommen, rijen = img.size

#tot hier allemaal informatie

  #PixelMatrix
pixelMatrix = []
while pixels != []:
    pixelMatrix.append(pixels[:kolommen])
    pixels = pixels[kolommen:]

pixelMatrix = np.array(pixelMatrix)


# 8 op 8 
foto_dct = skimage.util.view_as_blocks(pixelMatrix, block_shape=(8, 8))
print("Voor aftrekking:","\n",foto_dct[3,3])




    # (1) -128
for x in foto_dct:
    x = x - 128 # pixel 8 op 8 matrix -128
print("Voor DCT","\n",foto_dct[3,3])

    # (2) DCT 2x
for x in foto_dct:
    x = fftpack.dct(fftpack.dct(x.T,norm = 'ortho').T,norm ='ortho') # 2x dct
print("Voor de deling",'\n',foto_dct[3,3])

    # (3) quantisatie ( /Q)

Q = 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]]) # quantisatie matrix

for x in foto_dct:
        x = np.divide(x,Q)
print("Na de deling:","\n",foto_dct[3,3])

    # (4) *Q
for x in foto_dct:
    x = np.multiply(x,Q)
print("Na vermenigvuldiging terug:","\n",foto_dct[3,3])

    # (5) idct 2x 
for x in foto_dct:
        x = fftpack.idct(fftpack.idct(x.T,norm = 'ortho').T,norm ='ortho')
print("Na IDCT:","\n",foto_dct[3,3])

    # (6) +128
for x in foto_dct:
        x = (x + 128 ).clip(0,255) 
print("Na optelling","\n",foto_dct[3,3])
print("test","\n",foto_dct[3,4])


foto_dct = np.reshape(foto_dct,(kolommen,rijen)) 

flatArray = np.array(foto_dct.flatten())

finalim = Image.new('L',(rijen,kolommen))
finalim.putdata(flatArray)
finalim.show()

Или вот ссылка на скриншот: Скриншот моего кода Теперь проблема в том, что когда я преобразовываю матрицы 8x8 обратно в матрицу 128x128 (rijen x kolommen), порядок искажается, и моя исходная картинка: Исходная картинка теперь выглядит следующим образом: JPEG картинка Может кто-нибудь помочь мне понять, почему это неверно?

Дополнительная информация: foto_dct.shape is (16,16,8,8): когда я беру матрицу 8x8 пикселей перед # (1), и когда я беру соответствующую 8x8 пиксельную матрицу после операций, после # (6) они верны, когда я их печатаю.

foto_dct [5,7]: ДО ПРЕОБРАЗОВАНИЯ

foto_dct [5,7]: ПОСЛЕ ПРЕОБРАЗОВАНИЯ Хотя мне не удается объединитьсявновь сделанные матрицы обратно в изображение.С уважением.

...