CCF-CSP 202212-3 JPEG解码 赛题练习(PYTHON语言)

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)))
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值