JPEG图像的DCT(Discrete Cosine Transform)变换公式代码详解

引 言 网络上图像在传输过程中为节省内存空间主要采用jpeg格式。jpeg图属于有损压缩图像的一种。在图像篡改检测过程中,可以利用jpeg图像的单双压缩伪影的不同而判别图像为伪造图并可以定位伪造区域。RGB图像变成jpeg图像过程中涉及从RGB图变成YCbCr图像,DCT变换,DCT系数量化过程,和DCT系数反量化,IDCT逆变化过程。本文讲述DCT变化的公式和几种常用代码。

文章目录

    • 一、DCT变换公式
    • 二、DCT变化编程
    • 三、总结

一、DCT变换公式

DCT最常用的变化是 8x8的块变换,变换后的图像与原始图像大小一样。
在这里插入图片描述

二、DCT变化编程

  • 方法一
import numpy as npdef dct_transform_1(img):block = 8coef = np.zeros((block,block)).astype(np.float32)coef[0:] = np.sqrt(1.0/block)for i in range(1,block):for j in range(block):coef[i,j] = np.sqrt(2.0 /block) * np.cos((2 * j + 1) * np.pi * i / (2.0 * block))# split image to block 8*8#[h,w] -> [(h/8)*(w/8),8,8]h,w = img.shapeprint('img.shape',img.shape)input = img.reshape(h//8,8,w//8,8).transpose(0,2,1,3).reshape(-1,8,8)output = np.zeros_like(input)# for i in range(input.shape[0]):#     dct_inter = np.matmul(coef,input[i,:,:])#     output[i,:,:] = np.matmul(dct_inter,coef.transpose(1,0))dct_inter = np.matmul(coef,input)output = np.matmul(dct_inter,coef.transpose(1,0))return outputif __name__ == "__main__":np.random.seed(20)image = np.random.randn(16,8)*255dct_result = dct_transform_1(image)print(dct_result)print('*' * 50)
  • 方法二
def dct(input):block = 8output = np.zeros_like(input)for u in range(block):for v in range(block):if u==0:alpha = np.sqrt(1.0/block)else:alpha = np.sqrt(2.0/block)if v==0:beta = np.sqrt(1.0/block)else:beta = np.sqrt(2.0/block)temp = 0.0for i in range(block):for j in range(block):temp += input[i,j]*np.cos((2*i+1)*np.pi*u/(2*block))*np.cos((2*j+1)*np.pi*v/(2*block))output[u,v] =alpha*beta*tempreturn outputdef dct_transform_2(img):block = 8# split image to block 8*8#[h,w] -> [(h/8)*(w/8),8,8]h,w = img.shapeinput = img.reshape(h//8,8,w//8,8).transpose(0,2,1,3).reshape(-1,8,8)output = np.zeros_like(input)for i in range(input.shape[0]):output[i,:,:] = dct(input[i,:,:])return outputif __name__ == "__main__":np.random.seed(20)image = np.random.randn(16,8)*255dct_result2 = dct_transform_2(image)print(dct_result2)print('*' * 50)
  • 方法三
def dct_transform_3(img):h,w = img.shapeinput = img.reshape(h//8,8,w//8,8).transpose(0,2,1,3).reshape(-1,8,8)tensor = np.zeros((8, 8, 8, 8), dtype=np.float32)for x, y, u, v in itertools.product(range(8), repeat=4):tensor[x, y, u, v] = np.cos((2 * x + 1) * u * np.pi / 16) * np.cos((2 * y + 1) * v * np.pi / 16)alpha = np.array([1. / np.sqrt(2)] + [1] * 7)scale = np.outer(alpha, alpha) * 0.25output = scale * np.tensordot(input, tensor, axes=2)return outputif __name__ == "__main__":np.random.seed(20)image = np.random.randn(16,8)*255dct_result3 = dct_transform_3(image)print(dct_result3)print('*' * 50)

调用以下两句发现三个程序的运行结果相同。

print(np.round(dct_result,decimals=3) == np.round(dct_result2,decimals=3))
print(np.round(dct_result,decimals=3) == np.round(dct_result3,decimals=3))

三、总结

本文只是描述了将YCbCr图像变成DCT系数矩阵的过程,对于传统RGB图变成YCbCr图像过程的代码没有介绍。请浏览者自己查阅资料。如果本代码对于你有所帮助请记得点赞收藏呦😊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/432902.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS(四)FreeRTOS列表与列表项

目录 列表 列表项 迷你列表项 列表和列表项的关系 列表相关API函数 列表初始化 列表项初始化 列表项插入 列表项末尾插入 列表项删除 列表遍历 在 FreeRTOS 中,列表(List)和列表项(ListItem)是核心数据结构&…

Centos7系统根分区空间小home空间大如何增加分区

Centos7 默认安装,区划默认划分,用着怎么感觉有问题,根分区太小50G,而home分区太大。 如果处理,能扩大根分区呢?如果是新安装的,可以先删除home,然后再扩容 根分区。最后使其生效。…

计算机视觉硬件整理(四):相机与镜头参数介绍

文章目录 前言一、工业相机常用分类二、工业相机的基本参数三、工业相机的接口四、工业镜头的参数五、工业镜头的选择要点 前言 随着科技的飞速发展,工业自动化和智能制造在当今社会扮演着越来越重要的角色。在这个背景下,工业相机作为一种关键的视觉检…

Qualitor processVariavel.php 未授权命令注入漏洞复现(CVE-2023-47253)

0x01 漏洞概述 Qualitor 8.20及之前版本存在命令注入漏洞,远程攻击者可利用该漏洞通过PHP代码执行任意代码。 0x02 复现环境 FOFA:app"Qualitor-Web" 0x03 漏洞复现 PoC GET /html/ad/adpesquisasql/request/processVariavel.php?gridValoresPopHi…

【azure-openai】批量翻译demo【python】【gradio】

要求:拥有azure-openai-api,上传文件为csv格式,utf-8编码。 注意:如果出现乱码,重新运行,换种方式打开,有时候wps会自动改编码。 实现功能:选择语言,使用gpt4omini&…

使用docker形式部署prometheus+alertmanager+钉钉告警

一、拉取所需要的镜像 docker pull prom/node-exporter docker pull grafana/grafana docker pull prom/prometheus docker pull prom/alertmanager 其中 prom/node-exporter:用于收集主机系统信息和指标的 grafana/grafana:是一个用于可视化和分…

mac 上配置Jmeter代理进行web脚本录制过程容易踩坑的点

macOS 配置 Jmeter代理录制web脚本&容易踩坑的点 mac配置下载:前景提要:Jmeter中具体操作容易踩坑的点1、进入浏览器后,显示访问连接不安全。2、证书失效需要重新生成3、重新生成证书的方式4、没有生成新的证书5、jmeter安装路径找不到 m…

硬件设计很简单?合宙低功耗4G模组Air780E—开机启动及外围电路设计

Air780E是合宙低功耗4G-Cat.1模组经典型号之一,上期我们解答了大家关心的系列问题,并讲解了选型的注意要点。 有朋友问:能不能讲些硬件设计相关的内容? 模组的上电开机,是硬件设计调试的第一步。 本期特别分享——Ai…

MySQL数据库进阶知识(五)《锁》

学习目标: 一周掌握数据库锁相关知识 学习内容: 一. 概述 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共…

将本地文件上传至虚拟机

1、查看虚拟机ip地址 ip addr 2、xshell连接上虚拟机 连接root连接不上的解决办法更改配置文件vim /etc/ssh/sshd_config 重启(sudo service ssh restart)并查看是否开启ssh服务(sudo ps -e | grep ssh) 即可连接成功 3、复制文…

在实时语音交互上超过GPT-4o,端到端语音模型Mini-Omni部署

Mini-Omni是清华大学开源的多模态大型语言模型,具备实时语音输入和流式音频输出的能力。 Mini-Omni模型能够一边听、一边说,一边思考,类似于ChatGPT的语言对话模式。 Mini-Omni模型的主要特点是能够直接通过音频模态进行推理,并…

Skywalking告警配置

背景 skywalking 9.7.0,地址:Backend setup | Apache SkyWalking helm:skywalking-helm:4.5.0,地址:skywalking-helm/chart/skywalking/values.yaml at v4.5.0 首先来说一下为什么使用skywalking告警? …

JS设计模式之组合模式:打造灵活高效的对象层次结构

引言 当我们构建复杂的应用程序时,经常会遇到处理对象层次结构的情况。这些层次结构通常是树形结构,由组合节点和叶子节点组成。在这样的情况下,JavaScript 设计模式之一的组合模式就能派上用场。 组合模式是一种结构型设计模式&#xff0c…

MySQL从入门到精通 - 基础篇

一、MySQL概述 1. 数据库相关概念 二、SQL (1)SQL通用语法 (2)SQL分类 (3)数据定义语言DDL 数据库操作 表操作 数据类型 1. 数值类型 2. 字符串类型 二进制数据:以二进制格式(0和…

【JavaEE初阶】深入解析死锁的产生和避免以及内存不可见问题

前言: 🌈上期博客:【后端开发】JavaEE初阶—线程安全问题与加锁原理(超详解)-CSDN博客 🔥感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 ⭐️小编会在后端开发的学习中不断更新~~~ &#…

C#图像处理学习笔记(屏幕截取,打开保存图像、旋转图像、黑白、马赛克、降低亮度、浮雕)

1、创建Form窗体应用程序 打开VS,创建新项目-语言选择C#-Window窗体应用(.NET Framework) 如果找不到,检查一下有没有安装.NET 桌面开发模块,如果没有,需要下载,记得勾选相关开发工具 接上一步,…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第四篇-着色器投影-接收阴影部分】

上一章中实现了体积渲染的光照与自阴影,那我们这篇来实现投影 回顾 勘误 在开始本篇内容之前,我已经对上一章中的内容的错误进行了修改。为了确保不会错过这些更正,同时也避免大家重新阅读一遍,我将在这里为大家演示一下修改的…

叉车司机信息权限采集系统,保障与优化叉车运输网络的安全

叉车司机信息权限采集系统可以通过监控司机的行车行为和车辆状况,实时掌握车辆位置和行驶路线,从而提高运输安全性,优化运输网络,降低事故风险。同时,该系统还可以通过对叉车司机信息和行车数据的分析,优化…

Flutter屏幕适配

我们可以根据下面有适配属性的Widget来进行屏幕适配 1.MediaQuery 通过它可以直接获得屏幕的大小(宽度 / 高度)和方向(纵向 / 横向) Size screenSize MediaQuery.of(context).size; double width screenSize.width; double h…

springboot异常(三):异常处理原理

🍅一、BasicErrorController ☘️1.1 描述 BasicErrorController是Springboot中默认的异常处理方法,无需额外的操作,当程序发生了异常之后,Springboot自动捕获异常,重新请求到BasicErrorController中,在B…