当前位置: 首页 > article >正文

(数字图像处理MATLAB+Python)第四章图像正交变换-第二节:离散余弦变换和K-L变换

文章目录

  • 一:离散余弦变换(Discrete Cosine Transform,DCT)
    • (1)一维DCT
      • A:定义
      • B:实例
    • (2)二维DCT
      • A:定义
      • B:实例
      • C:程序
    • (3)DCT在图像处理中的应用
  • 二:K-L变换(Karhunen-Loeve Transform)

一:离散余弦变换(Discrete Cosine Transform,DCT)

离散余弦变换(Discrete Cosine Transform,DCT):是一种数学变换,它将一连串的离散值,如数字图像或信号,转换为代表图像或信号的频率成分的系数序列。DCT被广泛用于图像和信号处理、数据压缩和数字通信中。DCT的主要优点之一是它提供了一个图像或信号在其主要频率成分方面的紧凑表示,使其有可能在不损失很多信息的情况下压缩数据。DCT类似于更知名的傅里叶变换,但更适合于处理现实世界中具有有限长度和非周期性的信号和图像。DCT被用于几种流行的图像和视频压缩格式,如JPEG和MPEG

(1)一维DCT

A:定义

一维DCT变换定义:一维DCT是一种数学变换,它为一个给定的输入序列计算一组频率系数,使用不同频率的余弦函数的加权和。由此产生的频率系数可用于分析和压缩输入序列,以及其他应用。定义式如下

  • f ( x ) f(x) f(x)代表输入信号或序列,它由** N N N样本或数值**组成
  • DCT用于将这个输入序列转换为一组 N N N的频率系数 F ( u ) F(u) F(u),其中 u u u是频率系数的索引
  • 求和里面的余弦函数是DCT的主要部分。它的参数由索引 u u u和样本索引 x x x组成,其参数由 ( 2 x + 1 ) u π 2 N \frac{(2x+1)u\pi}{2N} 2N(2x+1)uπ给出。余弦函数用于提取输入序列的频率成分,而求和则用于计算每个样本对每个频率系数的贡献
  • 因子 2 N \sqrt\frac{2}{N} N2 是一个归一化常数,确保DCT是一个正交变换,也就是说,它保留了输入序列的能量。常数 C ( u ) C(u) C(u)是另一个归一化常数,它取决于索引 u u u和正在使用的DCT的变体。DCT的不同变体使用不同的归一化常数,这影响了变换的特性

F ( u ) = C ( u ) 2 N ∑ x = 0 N − 1 f ( x ) cos ⁡ ( 2 x + 1 ) u π 2 N u = 0 , 1 , ⋯   , N − 1 F(u)=C(u) \sqrt{\frac{2}{N}} \sum_{x=0}^{N-1} f(x) \cos \frac{(2 x+1) u \pi}{2 N} \quad u=0,1, \cdots, N-1 F(u)=C(u)N2 x=0N1f(x)cos2N(2x+1)uπu=0,1,,N1

一维IDCT变换定义:IDCT是DCT的逆变换,定义式如下

f ( x ) = 2 N ∑ u = 0 N − 1 C ( u ) F ( u ) cos ⁡ ( 2 x + 1 ) u π 2 N x = 0 , 1 , ⋯   , N − 1 f(x)=\sqrt{\frac{2}{N}} \sum_{u=0}^{N-1} C(u) F(u) \cos \frac{(2 x+1) u \pi}{2 N} \quad x=0,1, \cdots, N-1 f(x)=N2 u=0N1C(u)F(u)cos2N(2x+1)uπx=0,1,,N1

其中 C ( u ) = { 1 2 u = 0 1 u = 1 , 2 , … , N − 1 C(u)=\left\{\begin{array}{lc}\frac{1}{\sqrt{2}} & u=0 \\1 & u=1,2, \ldots, N-1\end{array}\right. C(u)={2 11u=0u=1,2,,N1

B:实例

如下,有一长为4的数组序列,求其DFT

F ( u ) = C ( u ) 2 4 ∑ x = 0 3 f ( x ) cos ⁡ ( 2 x + 1 ) u π 8 u = 0 , 1 , 2 , 3 F(u)=C(u) \sqrt{\frac{2}{4}} \sum_{x=0}^{3} f(x) \cos \frac{(2 x+1) u \pi}{8} \quad u=0,1,2,3 F(u)=C(u)42 x=03f(x)cos8(2x+1)uπu=0,1,2,3

如下
在这里插入图片描述

矩阵形式如下

在这里插入图片描述

(2)二维DCT

A:定义

二维DCT变换与逆变换定义:二维离散余弦变换(DCT)是一维DCT向二维的扩展。它用于将二维信号或图像转换为二维频域中的一组频率系数。总之,二维DCT是一种数学变换,它为给定的输入图像计算一组频率系数,使用具有不同水平和垂直频率的余弦函数的加权和。由此产生的频率系数可用于分析和压缩输入图像,以及其他应用

  • f ( x , y ) f(x, y) f(x,y)代表输入图像,它由 M M M行和 N N N列的像素组成
  • DCT用于将该输入图像转换为一组频率系数 F ( u , v ) F(u, v) F(u,v),其中 u u u v v v分别为水平和垂直方向上的频率系数的指数
  • 二维DCT的方程式与一维DCT的方程式相似,但在二维输入图像上有一个额外的求和。求和中的余弦函数由指数 u u u v v v x x x y y y设置参数,其参数分别由 π ( 2 x + 1 ) u 2 M \frac{\pi(2x+1)u}{2M} 2Mπ(2x+1)u π ( 2 y + 1 ) v 2 N \frac{\pi(2y+1)v}{2N} 2Nπ(2y+1)v给出。余弦函数被用来提取输入图像的水平和垂直频率分量,并通过求和来计算每个像素对每个频率系数的贡献
  • 因子 2 M N \frac{2}{\sqrt{MN}} MN 2 C ( u ) C(u) C(u) C ( v ) C(v) C(v)是归一化常数,确保DCT是一种正交变换,输入图像的能量被保留下来。这些常数取决于指数 u u u v v v和正在使用的DCT的变体

在这里插入图片描述

其中

x , u = 0 , 1 , 2 , ⋯   , M − 1 y , v = 0 , 1 , 2 , ⋯   , N − 1 C ( u ) , C ( v ) = { 1 2 u , v = 0 1 u , v = 1 , 2 , … , N − 1 \begin{array}{c}x, u=0,1,2, \cdots, M-1 \\y, v=0,1,2, \cdots, N-1 \\C(u), C(v)=\left\{\begin{array}{ll}\frac{1}{\sqrt{2}} & u, v=0 \\1 & u, v=1,2, \ldots, N-1\end{array}\right.\end{array} x,u=0,1,2,,M1y,v=0,1,2,,N1C(u),C(v)={2 11u,v=0u,v=1,2,,N1

二维DCT变换的矩阵形式表示为

F = A f A T , f = A T F A F=AfA^{T},f=A^{T}FA F=AfAT,f=ATFA

在这里插入图片描述

B:实例

如下有一幅输入图像 f ( x , y ) f(x,y) f(x,y),使用矩阵算法求其DCT

在这里插入图片描述

如下

在这里插入图片描述

C:程序

MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册

  • dct:这个函数计算给定输入信号或序列的一维离散余弦变换(DCT)。DCT用于将输入信号转换为频域中的一组频率系数。DCT函数需要以下参数
    • Src:输入信号或序列
    • dst:输出频率系数
    • flags:一组控制DCT行为的标志
    • nonzeroRows:输入信号中非零行的数量(可选)
  • idct:该函数计算一组给定频率系数的一维离散余弦逆变换(IDCT)。IDCT用于将频率系数转换回原始信号或序列。idct函数接收以下参数
    • src:输入频率系数
    • dst:输出信号或序列
    • flags:一组控制IDCT行为的标志
    • nonzeroRows:输入频率系数中非零行的数量(可选)
  • dct2:该函数计算给定输入图像的二维离散余弦变换(DCT)。DCT用于将输入图像转换为二维频域中的一组频率系数。dct2函数接受以下参数
    • src:输入图像
    • dst:输出频率系数
    • flags:一组控制DCT行为的标志
    • nonzeroRows:输入图像中非零行的数量(可选)
    • nonzeroCols:输入图像中非零列的数量(可选)
  • idct2:这个函数计算一组给定频率系数的二维离散余弦逆变换(IDCT)。IDCT用于将频率系数转换回原始图像。idct2函数接受以下参数
    • src:输入频率系数
    • dst:输出图像
    • flags:一组控制IDCT行为的标志
    • nonzeroRows:输入频率系数中非零行的数量(可选)
    • nonzeroCols:输入频率系数中非零列的数量(可选)

实现如下效果

在这里插入图片描述

Image=imread('cameraman.jpg');%读取图像
imshow(Image);%显示原图像
grayI=rgb2gray(Image);%将彩色图像灰度化
figure,imshow(grayI);
DCTI=dct2(grayI);%计算余弦变换并移位
ADCTI=abs(DCTI);
top=max(ADCTI(:));
bottom=min(ADCTI(:));
ADCTI=(ADCTI-bottom)/(top-bottom)*100;
figure,imshow(ADCTI);%显示余弦变换频谱图
imwrite(ADCTI,'cameramandct.jpg');


Python实现:使用Python实现上述同样的功能

  • cv2.dct:DCT
  • cv2.idct:IDCT
import cv2
import numpy as np
from matplotlib import pyplot as plt

# 读取图像
Image = cv2.imread('cameraman.jpg')

# 显示原图像
cv2.imshow('Original Image', Image)
cv2.waitKey(0)

# 将彩色图像灰度化
grayI = cv2.cvtColor(Image, cv2.COLOR_BGR2GRAY)

# 显示灰度图像
cv2.imshow('Grayscale Image', grayI)
cv2.waitKey(0)

# 计算离散余弦变换
DCTI = cv2.dct(np.float32(grayI))

# 计算幅值并将其归一化到0-100之间
ADCTI = cv2.convertScaleAbs(DCTI)
ADCTI = cv2.normalize(ADCTI, None, 0, 100, cv2.NORM_MINMAX)

# 显示余弦变换频谱图
plt.imshow(ADCTI, cmap='gray')
plt.show()

# 保存离散余弦变换频谱图
cv2.imwrite('cameramandct.jpg', ADCTI)

(3)DCT在图像处理中的应用

DCT在图像处理中的应用

  • 图像压缩:DCT常用于图像压缩中,它基于图像的统计特征,将图像数据压缩到更少的存储空间中,而且在重建过程中,可以几乎无损地还原原始图像
  • 图像水印:DCT可以用于图像水印的嵌入、提取和检测。通过将图像做DCT变换,然后将水印数据嵌入到DCT域的系数值中,以实现图像水印功能
  • 图像特征提取:DCT可以用于图像的特征提取,在图像分类、图像识别、目标追踪等领域中有广泛的应用。在DCT域中,最大的系数值通常表示最明亮、最精细的细节,因此可以用于提取图像的特征
  • 图像去噪:噪声常常会影响图像的质量和信息,DCT可以用于去除图像的高频噪声,以及平滑图像的细节信息,从而实现图像去噪的目的

二:K-L变换(Karhunen-Loeve Transform)


http://www.kler.cn/a/7738.html

相关文章:

  • 【测试】——Cucumber入门
  • C++ 11,14,17 新特性
  • 用OpenCV实现UVC视频分屏
  • 28、使用StreamPark管理作业中,关于默认环境变量设置和默认动态参数设置的修改
  • 【AJAX详解】
  • Android NDK开发实战之环境搭建篇(so库,Gemini ai)
  • CTFHub | 双写后缀
  • 使用Python、Contours绘制等高线
  • 软件安全测试有哪些测试手段?软件测试报告收费贵吗?
  • 增程汽车大厂上纯电,理想能行吗?
  • 实时聊天如何改变您的在线商店
  • 【文心一言】内测版 沉浸式深度体验——不间断 提问问题!它的表现如何?
  • SOLIDWORKS三维建模的十大应用技巧
  • 【Axure高保真原型】画图画板
  • 数组按照某个key分组
  • SpringCloud-高级篇(一)
  • 2021蓝桥杯真题小平方 C语言/C++
  • 【Java版oj】day28反转部分单向链表、猴子分桃
  • nginx 逻辑判断if语句使用
  • 【二叉树OJ题(二)】前序遍历中序遍历后序遍历另一颗树的子树二叉树遍历平衡二叉树
  • 精彩回顾 | 平行云亮相LiveVideoStack2022北京站
  • 2023年一个完整的B2B订货网站源码
  • NC65 部门预算DAO类
  • ‘protoc-gen-js‘ 不是内部或外部命令,也不是可运行的程序
  • 在DongshanPI-D1开箱使用分享与折腾记录实现MPU6050数据读取
  • 面向对象编程(基础)8:关键字:package、import