python-3.x - 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] :转换后 虽然我无法将新制作的矩阵组合回图像中。亲切的问候。
解决方案
推荐阅读
- json - 过滤来自 ECDC 服务器的 JSON 响应
- r - 我无法安装任何 Bioconductor 软件包:“readRDS(dest) 中的错误:从连接读取错误”
- ruby-on-rails - Ruby 正则表达式 (regex) 从数据库中获取 JSON 数据
- javascript - 我的 xhr 状态总是返回 200 但是在我的情况下,如果它不考虑它
- java - 返回列表中的最后一项
- java - 计算两个字符串之间相等的布尔值
- jquery - 如何让 jQuery 更改(函数()以每个父级为目标并隐藏未选择的 div 对应值
- css - 使用 CSS 为 Squarespace 网站完全控制图像的位置
- mysql - 选择sql中不反向重复的记录
- java - 如何将以 h:mm 格式输入的时间转换为 hh:mm 格式?