电子科技大学图像与视频处理(视频部分)课程测试

本文详细介绍了如何从视频序列中提取I帧和P帧,进行8x8 DCT变换,量化操作,以及后续的反量化和反DCT过程,最后比较原始与重构视频的PSNR。通过这个过程,读者将学习到视频编码基础知识和图像处理技术。
摘要由CSDN通过智能技术生成
                                     电子科技大学图像与视频处理(视频部分)课程测试

1、 读取原视频序列(2帧),其中第1帧为I帧,第2帧为P帧;

video_path = "E:/foreman_qcif.y4m" # 注意修改路径
cap = cv2.VideoCapture(video_path)
cap.set(cv2.CAP_PROP_POS_FRAMES,1)  #设置要获取的帧号
a,m_I=cap.read()  #read方法返回一个布尔值和一个视频帧。若帧读取成功,则返回True0
cap.set(cv2.CAP_PROP_POS_FRAMES,2)  #设置要获取的帧号
a,m_p=cap.read()  
m_P = m_p - m_I

结果
在这里插入图片描述

2、 进行8×8分块的DCT变换;

def dctpad(src):
    h, w = src.shape[:2]
    h1 = int((h/8+0.5))*8
    w1 = int((w/8+0.5))*8
    #拷贝到补充的数组
    dft_A = np.zeros((h1, w1), dtype=np.float32)
    dft_A[:h, :w] = src    
return dft_A
def dct_l(image):
    #image = m_I[:,:,2]
    h,w = image.shape[:2]
    print(w,h)

    imgf = dctpad(image)
    print(imgf.dtype, imgf.shape)
    dct = np.zeros_like(imgf)
    imsize = imgf.shape
#8x8 DCT
    for i in range(0,imgf.shape[0],8):
        for j in range(0,imgf.shape[1],8):
            dct[i:(i+8),j:(j+8)] = cv2.dct(imgf[i:(i+8),j:(j+8)])
# 显示完整的DCT图像
    plt.figure()
    plt.imshow(dct,cmap='gray',vmax = np.max(dct)*0.01,vmin = 0)
    plt.title( "8x8 DCT的图像")

结果
在这里插入图片描述

3、 设定量化步长Qstep=22进行量化;

ratio=22 # 设置量化比率
    for i in range(dct.shape[0]):
        for j in range(dct.shape[1]):
       # for k in range(dct.shape[2]):
            dct_thresh[i][j]=(round(dct[i][j]/ratio))

    plt.figure()
    plt.imshow(dct_thresh,cmap='gray',vmax = np.max(dct)*0.01,vmin = 0)
    plt.title( "量化 8x8 DCT 图像")

结果
在这里插入图片描述

4、 完成相应的反量化和反DCT变换;

   for i in range(dct_thresh.shape[0]):
        for j in range(dct_thresh.shape[1]):
            dct_thresh[i][j]=(dct_thresh[i][j]*ratio)
    plt.figure()
    plt.imshow(dct_thresh,cmap='gray',vmax = np.max(dct)*0.01,vmin = 0)
    plt.title( "反量化 8x8 DCT 图像")
    
    im_dct = np.zeros(imsize)
# 8x8 IDCT 
    for i in range(0,im_dct.shape[0],8):
        for j in range(0,im_dct.shape[1],8):
            im_dct[i:(i+8),j:(j+8)] = cv2.idct(dct_thresh[i:(i+8),j:(j+8)])

结果
在这里插入图片描述

5、 讲重组数据写入文件“re_foreman.qcif”(2帧);

m_I1 = np.zeros_like(m_I)
m_P1 = np.zeros_like(m_P)
m_I1[:,:,0]=dct_l(m_I[:,:,0])
m_I1[:,:,1]=dct_l(m_I[:,:,1])
m_I1[:,:,2]=dct_l(m_I[:,:,2])
m_P1[:,:,0]=dct_l(m_P[:,:,0])
m_P1[:,:,1]=dct_l(m_P[:,:,1])
m_P1[:,:,2]=dct_l(m_P[:,:,2])

reforeman1 = np.concatenate((m_I1,m_P1))
cv2.imshow('I',m_I1)
cv2.waitKey()
f = open("reforeman.yuv", "x")
f.write(str(reforeman1))
f.close()

6、 计算“foreman.qcif”和“re_foreman.qcif”的PSNR

# 求PSNR
foreman = np.concatenate((m_I,m_P))
res = np.mean((reforeman1 - foreman) ** 2)
psnr = 20 * np.log10(255.0/ (res)**(1/2))
print(psnr)

结果

33.85399161347282
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 电子科技大学的C大作业涉及到计算机科学和技术相关的内容。在这个项目中,学生通常会被要求完成一个具有一定规模和复杂性的程序或系统。这个项目旨在培养学生的编程和软件开发能力,使他们能够应用所学知识解决实际问题。 在开始C大作业之前,学生往往需要对C语言进行深入学习和掌握。C语言是一种通用的高级编程语言,广泛应用于软件开发领域。它具有强大的表达能力和高效的执行速度,适用于编写各种类型的程序。学生需要掌握C语言的语法和常用函数,熟悉指针和内存管理的概念,并能够使用C语言解决实际问题。 在C大作业中,学生可以选择各种主题,例如游戏开发、嵌入式系统设计、网络编程等。根据项目的要求,学生需要进行需求分析、系统设计、编码实现和测试等工作。他们需要运用所学知识与技巧来设计和实现一个完整的C程序或系统,并保证其正确性和稳定性。 在项目完成后,学生还需要进行项目总结和报告撰写。他们需要描述项目的整体架构和实现细节,分析遇到的问题和解决方案,并总结自己在项目中的收获和体会。 总之,电子科技大学的C大作业是一个重要的学习任务,它让学生能够深入学习和应用C语言,并培养他们的编程和问题解决能力。通过完成这个项目,学生将能够在实际应用中运用所学知识,并为未来的学习和职业发展打下坚实的基础。 ### 回答2: 电子科技大学的C大作业通常是指该学校计算机科学与技术专业的C语言编程课程的大作业。该大作业旨在帮助学生深入理解C语言的特点和使用,并能够独立完成一项实际的编程任务。 C大作业的内容通常包括以下几个方面: 1. 题目选择:学校会给出一个或多个编程题目供学生选择,一般会与计算机领域相关,如图像处理、数据结构等。学生可以根据自己的兴趣和技术水平选择适合自己的题目。 2. 需求分析:学生需要仔细分析题目的需求,明确任务的具体要求和功能。 3. 设计方案:学生需要设计程序的整体框架和逻辑,包括使用的数据结构和算法等。 4. 编码实现:学生需要根据设计方案,使用C语言编写程序代码,实现所需功能。 5. 调试测试:在代码编写完成后,学生需要进行调试和测试,确保程序的正确性和稳定性。 6. 文档撰写:学生需要编写实验报告,详细记录程序的设计思路、实现过程和问题解决方案等。 C大作业旨在培养学生编程和解决问题的能力,同时加深对计算机科学与技术专业的认识和理解。通过完成C大作业,学生能够提升自己的编程技巧和思维能力,为今后的学习和工作奠定良好的基础。 ### 回答3: 电子科技大学的C大作业相信是指计算机相关的大作业。C语言作为一种广泛应用于计算机编程的高级语言,是计算机科学与技术专业的基础课程之一。C大作业是为了让学生集中运用C语言所学的知识和技巧,解决一个相对复杂的问题或者设计一个实际应用程序。 在C大作业中,学生可能需要运用C语言的不同特性和功能,如条件语句、循环语句、数组、字符串、函数等,来实现一个具有一定功能的程序。这个程序可以是一个小型的应用程序,例如计算器、学生成绩管理系统等,也可以是一个更大型、更复杂的项目,例如迷宫游戏、火车票订购系统等。 完成C大作业需要学生具备计算机编程的基本能力,包括对C语言语法的熟悉程度、问题分析与算法设计能力、程序实现能力以及调试与测试能力。学生需要理解题目的要求,设计合理的解决方案,并通过编程实现这个方案。在实现过程中,学生需要编写和调试代码,确保程序能够正确运行并达到预期的功能。 通过完成C大作业,学生不仅能够巩固和应用所学的C语言知识,还能够增强问题解决和编程能力。此外,C大作业还培养了学生的团队合作和沟通能力,因为在一些大型项目中,学生可能需要与队友共同合作完成任务,分工合作、交流沟通,并协调各自编写的代码。 总之,电子科技大学的C大作业为学生提供了一个实践运用C语言知识的机会,促使学生掌握计算机编程的基本技能,培养解决问题和合作的能力。这对于学生的综合素质提升以及未来的学习和工作都有积极意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CinzWS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值