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

news2024/12/23 22:08:00

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

文章目录

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

一、DCT变换公式

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

二、DCT变化编程

  • 方法一
import numpy as np

def dct_transform_1(img):
    block = 8
    coef = 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.shape
    print('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 output

if __name__ == "__main__":
    np.random.seed(20)
    image = np.random.randn(16,8)*255

    dct_result = dct_transform_1(image)
    print(dct_result)
    print('*' * 50)
  • 方法二
def dct(input):
    block = 8
    output = 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.0
            for 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*temp
    return output

def dct_transform_2(img):
    block = 8
    # split image to block 8*8
    #[h,w] -> [(h/8)*(w/8),8,8]
    h,w = 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]):
        output[i,:,:] = dct(input[i,:,:])

    return output


if __name__ == "__main__":
    np.random.seed(20)
    image = np.random.randn(16,8)*255
    dct_result2 = dct_transform_2(image)
    print(dct_result2)
    print('*' * 50)
  • 方法三
def dct_transform_3(img):
    h,w = img.shape
    input = 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.25
    output = scale * np.tensordot(input, tensor, axes=2)
    return output

if __name__ == "__main__":
    np.random.seed(20)
    image = np.random.randn(16,8)*255
    dct_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.coloradmin.cn/o/2168811.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用离火插件yoloV8数据标注,模型训练

1. 启动 2.相关配置 2.1 data.yaml path: D:/yolo-tool/yaunshen-yolov8/YOLOv8ys/YOLOv8-CUDA10.2/1/datasets/ceshi001 train: images val: images names: [蔡徐坤,篮球] 2.2 cfg.yaml # Ultralytics YOLOv8, GPL-3.0 license # Default training settings and hyp…

物联网行业中通信断线重连现象介绍以及如何实现

01 概述 断线重连是指在计算机网络中,当网络连接遇到异常中断或者断开时,系统会自动尝试重新建立连接,以保证网络通信的连续性和稳定性。这是一种常见的网络通信技术,广泛应用于各种计算机网络场景,包括互联网、局域…

蓝队技能-应急响应篇Web内存马查杀Spring框架型中间件型JVM分析Class提取

知识点: 1、应急响应-Web框架内存马-分析&清除 2、应急响应-Web中间件内存马-分析&清除 注:框架型内存马与中间件内存马只要网站重启后就清除了。 目前Java内存马具体分类: 1、传统Web应用型内存马 Servlet型内存马:…

探索EasyCVR视频融合平台:在视频编解码与转码领域的灵活性优势

随着视频监控技术的飞速发展,各类应用场景对视频数据的处理需求日益复杂多样。从公共安全到智慧城市,再到工业监控,高效、灵活的视频处理能力成为衡量视频融合平台性能的重要标准。在众多解决方案中,EasyCVR视频融合平台凭借其在视…

Java面试题之JVM20问

1、说说 JVM 内存区域 这张图就是一个 JVM 运行时数据图,「紫色区域代表是线程共享的区域」,JAVA 程序在运行的过程中会把他管理的内存划分为若干个不同的数据区域,「每一块儿的数据区域所负责的功能都是不同的,他们也有不同的创建…

Django设计批量导入Excel数据接口(包含图片)

Django设计批量导入Excel数据接口(包含图片) 目录 Django设计批量导入Excel数据接口(包含图片)示例xlsx文件接口详情前端上传FormData后端APIView调用函数 Django 4.2.7 openpyxl 3.1.5示例xlsx文件 接口详情 前端上传FormData …

2-104 基于MATLAB的动态模式分解(Dynamic Mode Decomposition,DMD)

基于MATLAB的动态模式分解(Dynamic Mode Decomposition,DMD),从人类步行数据中提取信息.动态模式分解是一种降维算法,在流体力学领域引入的。与提供内部坐标系和相应投影的SVD相似,DMD为您提供随不同时间行为演变的特定…

【架构】前台、中台、后台

文章目录 前台、中台、后台1. 前台(Frontend)特点:技术栈: 2. 中台(Middleware)特点:技术栈: 3. 后台(Backend)特点:技术栈: 示例场景…

PMOS的原理

PMOS(金属氧化物半导体场效应晶体管)是一种以空穴为主要载流子的场效应管,它的D极(漏极)、S极(源极)和G极(栅极)的工作原理如下: 1. D极(漏极&am…

已存在的Python项目使用依赖管理工具UV

1. 文档 uv文档 2. 如何转换 初始化 uv initrequirements.txt转换成pyproject.toml uv add $(cat requirements.txt)删除requirements.txt 如果更新pyproject.toml之后,使用命令 uv sync替换项目环境 如果有库没有加入依赖,自己手动加一下&am…

详解电力物联网通常使用哪些通信规约?

在电力物联网行业中,通信规约是关键的技术之一,用于实现电网设备与控制中心之间的数据通信和信息管理。本篇就为大家简单说明电力物联网通常使用哪些通信规约。 1、IEC 60870-5-101/104 这是由国际电工委员会(IEC)制定的一系列标…

微信小程序配置prettier+eslint

虽然微信开发者工具是基于vscode魔改的.但是由于版本过低,导致很多插件也用不上新版本.所以在微信开发者工具限制的版本下使用的prettier,eslint也是有版本要求. 本文主要就是记录一下需要的版本号 1.微信开发者工具安装插件 2.package.json中添加以下依赖及安装依赖 "de…

【HarmonyOS】组件长截屏方案

【HarmonyOS】普通组件与web组件长截屏方案:原则是利用Scroll内的组件可以使用componentSnapshot完整的截屏 【普通组件长截屏】 import { componentSnapshot, promptAction } from kit.ArkUI import { common } from kit.AbilityKit import { photoAccessHelper }…

增量式编码器实现原理

目录 概述 1 认识增量式编码器 1.1 概述 1.2 增量式编码器的特性 1.3 编码器的硬件 2 增量式编码器实现原理 2.1 编码器信号 2.2 正反转判断 概述 本文主要介绍增量式编码器实现原理,包括增量式编码器的特性,信号特性,以及如何使用编…

【稳定且高效的分治排序 —— 归并排序算法】

【稳定且高效的分治排序 —— 归并排序算法】 归并排序(Merge sort)是建立在归并操作上的一种有效、稳定的排序算法,采用分治法的典型应用。将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序&#xff0…

深度探索与实战编码:利用Python与AWS签名机制高效接入亚马逊Product Advertising API获取商品详情

亚马逊商品详情接口技术贴及代码示例 在电商数据分析和产品管理中,获取商品的详细信息是至关重要的一环。亚马逊作为全球领先的电商平台,提供了丰富的商品数据和强大的API接口,使得开发者能够轻松获取商品的详细信息。本文将详细介绍如何使用…

NASA:ATLAS/ICESat-2 L3 A沿线内陆地表水数据V006数据集

目录 简介 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATLAS/ICESat-2 L3A Along Track Inland Surface Water Data V006 简介 ATLAS/ICESat-2 L3 A沿线内陆地表水数据V006 ATLAS/ICESat-2 L3 A沿线内陆地表水数据V006是指由ATLAS/ICESat-2卫星获取的针对陆地…

矿石运输船数据集、散货船数据集、普通货船数据集、集装箱船数据集、渔船数据集以及客船数据集

海船:用于船只检测的大规模精准标注数据集 我们很高兴地介绍一个新的大规模数据集——海船,该数据集专为训练和评估船只目标检测算法而设计。目前,这个数据集包含31,455张图像,并涵盖了六种常见的船只类型,包括矿石运…

en造数据结构与算法C# 二叉排序树 泛型类的基本构成

前置知识:二叉树 en造数据结构与算法C# 二叉树的顺序存储和前中后序遍历-CSDN博客 二叉排序树基本规则 二叉排序树的特点就是有序,其基本规则分为两个点 1.按照顺序去存储节点(下图绿色的顺序) 2.其次,在第一点的基础上,比…

python之装饰器、迭代器、生成器

装饰器 什么是装饰器? 用来装饰其他函数,即为其他函数添加特定功能的函数。 装饰器的两个基本原则: 装饰器不能修改被装饰函数的源码 装饰器不能修改被装饰函数的调用方式 什么是可迭代对象? 在python的任意对象中&#xff…