from math import pi,cos
blocks = [list(map(int, input().split())) for i in range(8)]
n=int(input())
T=int(input())
scan_data=list(map(int,input().split())) # 扫描数据
# 计算循环往复的64个扫描数据出现的次序,8*8矩阵按Z形应该有64个数据位置,分两部分计算
lst,sum=[[0,0]],0
for j in range(0, 8, 2):
# right
lst.append([0, j + 1])
sum += 1
# left_down
for i in range(1, j + 2):
lst.append([i, j - i + 1])
sum += 1
if i+1<7:
# down
lst.append([j + 1 + 1, 0])
sum += 1
# right_up
for i in range(1, j + 3):
lst.append([j + 2 - i, i])
sum += 1
for i in range(0,8,2):
# right
lst.append([7,i+1])
sum+=1
if i+1<7:
# right_up
for j in range(1, 7 - i):
lst.append([7 - j, j + i + 1])
sum += 1
# down
lst.append([i + 1 + 1, 7])
sum += 1
# left_down
for j in range(1, 6-i):
lst.append([j + i+2, 7 - j])
sum += 1
lst_n=lst[:n:]
# 填充后的图像矩阵
scans_0=[[0 for i in range(8)] for j in range(8)]
for i in range(n):
scans_0[lst[i][0]][lst[i][1]]=scan_data[i]
# 量化后的图像矩阵
scans_1=[[0 for i in range(8)] for j in range(8)]
for i in range(8):
for j in range(8):
scans_1[i][j]=scans_0[i][j]*blocks[i][j]
# 离散余弦逆变换后的矩阵,且经过加128取整
def func1(i,j,scans_1):
res=0
for u in range(8):
for v in range(8):
if u==0:
au=pow(1/2,1/2)
else:
au=1
if v==0:
av=pow(1/2,1/2)
else:
av=1
res+=au*av*scans_1[u][v]*cos(pi/8*(i+0.5)*u)*cos(pi/8*(j+0.5)*v)
return res
scans_2=[[0 for i in range(8)] for j in range(8)]
for i in range(8):
for j in range(8):
res=round(0.25*func1(i,j,scans_1)+128)
if res<0:
scans_2[i][j]=0
elif res>255:
scans_2[i][j] = 255
else:
scans_2[i][j] = res
if T==0:
for ls in scans_0:
print(" ".join(map(str, ls)))
elif T==1:
for ls in scans_1:
print(" ".join(map(str, ls)))
elif T==2:
for ls in scans_2:
print(" ".join(map(str, ls)))
CCF-CSP 202212-3 JPEG解码 赛题练习(PYTHON语言)
于 2023-03-02 11:59:59 首次发布