首页 > 解决方案 > JPEG DCT 转换问题

问题描述

我尝试在 python 中对 JPEG 转换进行编程,到目前为止,我已经能够完成所有步骤,我需要将我的数据转换回新图像。这是我现在的代码,请注意,我对变量的使用非常差。我没有太多时间来编写这个代码,而且我还在学习如何在 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):当我在#(1)之前取一个8x8像素矩阵时,当我在操作之后取相应的8x8像素矩阵时,在#(6)之后它们是正确的我打印它们。

foto_dct[5,7]:转换前

foto_dct[5,7] :转换后 虽然我无法将新制作的矩阵组合回图像中。亲切的问候。

标签: python-3.xjpegdct

解决方案


推荐阅读