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

文章目录

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

一:离散余弦变换(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)

K-L变换(Karhunen-Loeve Transform):是建立在统计特性基础上的一种变换,又称为霍特林(Hotelling)变换或主成分分析(PCA)。K-L变换的突出优点是相关性好,是均方误差(MSE,Mean Square Error)意义下的最佳变换,它在数据压缩技术中占有重要地位

注意:K-L变换和主成分分析关系虽然很密切,但不能说是一回事

  • K-L变换:是一种数学技术,它将一个给定的信号分解成一组正交的基础函数,称为特征函数。它是以数学家Richard Kullback和Solomon Linnik的名字命名的,他们在20世纪50年代首次描述了它。K-L变换被广泛用于信号处理、图像压缩和数据分析
  • PCA:PCA是一种统计技术,用于通过寻找捕捉数据中最大变化量的最重要特征来降低数据集的维度。它通常被用于数据可视化、数据压缩和机器学习

PCA与K-L变换密切相关,因为这两种技术都涉及寻找协方差矩阵的特征向量和特征值。事实上,从PCA得到的主成分是协方差矩阵的特征向量,而特征值代表每个主成分所捕获的方差量。综上所述,虽然K-L变换和PCA有一些相似之处,但它们并不完全是一回事。K-L变换是一种用于信号处理的数学技术,而PCA是一种用于降维和特征提取的统计技术。

(1)K-L变换原理

A:K-L展开式

假设有一个二维随机向量 x = [ x 1 , x 2 ] \mathbf{x} = [x_1, x_2] x=[x1,x2],其均值为 μ = [ μ 1 , μ 2 ] \boldsymbol{\mu} = [\mu_1, \mu_2] μ=[μ1,μ2],协方差矩阵为 C x \mathbf{C}_{\mathbf{x}} Cx。K-L 展开的目的是找到一组正交基函数 ϕ i ( x ) {\phi_i(\mathbf{x})} ϕi(x),使得随机向量 x \mathbf{x} x 可以被表示为

x = μ + ∑ i = 1 ∞ z i λ i ϕ i ( x ) \mathbf{x}=\boldsymbol{\mu}+\sum_{i=1}^{\infty} z_{i} \sqrt{\lambda_{i}} \boldsymbol{\phi}_{i}(\mathbf{x}) x=μ+i=1ziλi ϕi(x)

其中, z i {z_i} zi 是一组独立同分布的随机变量, ϕ i ( x ) {\boldsymbol{\phi}_i(\mathbf{x})} ϕi(x) 是一组标准正交函数, λ i \lambda_i λi C x \mathbf{C}_{\mathbf{x}} Cx 的第 i i i 个特征值, ϕ i ( x ) \phi_i(\mathbf{x}) ϕi(x) C x \mathbf{C}_{\mathbf{x}} Cx 的第 i i i 个特征向量

由于特征向量 ϕ i ( x ) {\boldsymbol{\phi}_i(\mathbf{x})} ϕi(x) 是标准正交函数,因此 K-L 展开保证了展开系数 z i z_i zi 是独立的。此外,K-L 展开中的基函数 ϕ i ( x ) {\boldsymbol{\phi}_i(\mathbf{x})} ϕi(x) 是协方差矩阵 C x \mathbf{C}_{\mathbf{x}} Cx 的特征向量,因此它们对应的是数据中的主成分,可以用于数据降维和特征提取等任务

K-L 展开的实现可以通过对协方差矩阵进行特征值分解得到。在实际应用中,由于数据维度往往很高,因此需要使用一些数值技巧来加速计算,例如矩阵的迹技巧和 Lanczos 迭代等

B:离散K-L变换

离散K-L变换(Discrete Karhunen-Loève Transform,DKLT):是 K-L 变换在离散信号处理中的一种形式。它将离散信号表示为一组正交基函数的线性组合,类似于离散余弦变换(DCT)和离散小波变换(DWT)

设有一个 N N N 维离散信号 x = [ x 1 , x 2 , ⋯   , x N ] \mathbf{x} = [x_1, x_2, \cdots, x_N] x=[x1,x2,,xN],其均值为 μ = 1 N ∑ i = 1 N x i \mu = \frac{1}{N}\sum_{i=1}^{N}x_i μ=N1i=1Nxi,协方差矩阵为 C x \mathbf{C}_\mathbf{x} Cx。DKLT 的目的是找到一组正交基函数 ϕ i ( x ) {\boldsymbol{\phi}_i(\mathbf{x})} ϕi(x),使得信号 x \mathbf{x} x 可以被表示为

x = μ + ∑ i = 1 ∞ z i λ i ϕ i ( x ) \mathbf{x}=\boldsymbol{\mu}+\sum_{i=1}^{\infty} z_{i} \sqrt{\lambda_{i}} \boldsymbol{\phi}_{i}(\mathbf{x}) x=μ+i=1ziλi ϕi(x)

其中, z i {z_i} zi 是一组独立同分布的随机变量, ϕ i ( x ) \boldsymbol{\phi}_i(\mathbf{x}) ϕi(x) 是信号 x \mathbf{x} x 的第 i i i 个正交基函数, λ i \lambda_i λi C x \mathbf{C}_{\mathbf{x}} Cx 的第 i i i 个特征值

在实际应用中,由于离散信号的维度往往很高,因此需要使用数值方法来计算 DKLT。一种常用的方法是使用矩阵特征值分解。设 X \mathbf{X} X 是将信号 x \mathbf{x} x 按列排成的 N × N N\times N N×N 矩阵, Λ \mathbf{\Lambda} Λ 是协方差矩阵 C x \mathbf{C}_{\mathbf{x}} Cx 的特征值对角矩阵, U \mathbf{U} U C x \mathbf{C}_{\mathbf{x}} Cx 的特征向量组成的矩阵,则 DKLT 的系数 z i {z_i} zi 可以通过以下公式计算

z = U T ( X − μ ) \mathbf{z}=\mathbf{U}^{T}(\mathbf{X}-\boldsymbol{\mu}) z=UT(Xμ)

其中, μ \boldsymbol{\mu} μ 是信号 x \mathbf{x} x 的均值向量。然后,可以通过以下公式将信号 x \mathbf{x} x 进行还原

x = μ + U z \mathbf{x}=\mathbf{\mu}+\mathbf{Uz} x=μ+Uz

与其他离散变换类似,DKLT 可以用于信号压缩、数据降维和特征提取等领域

C:程序

clc,clear;
X=[0 0 0;1 0 1;1 0 0;1 1 0;0 0 1;0 1 1;0 1 0;1 1 1]';
[n, N]=size(X);
V=X*X'/N;
[coeff, D]=eigs(V);
[D_sort,index] = sort(diag(D),'descend');
D=D(index,index);
coeff = coeff(:,index);
score=coeff'*X;
figure; plot(score(1,:),score(2,:),'ko'),title('K-L变换');
xlabel('第一主成分得分');ylabel('第二主成分得分');

在这里插入图片描述

(2)图像K-L变换

A:原理

图像K-L变换:是一种将图像转换到一个新的基下的线性变换,旨在提取图像的主要特征。其数学表达式与离散 K-L 变换类似,但是在图像处理中需要将信号扩展到两维

设有一幅 M × N M \times N M×N 的灰度图像 I \mathbf{I} I,其均值为 μ \mu μ,协方差矩阵为 C I \mathbf{C_I} CI。图像 K-L 变换的目的是找到一组正交基函数 ϕ i , j ( I ) {\boldsymbol{\phi}_{i,j}(\mathbf{I})} ϕi,j(I),使得图像 I \mathbf{I} I 可以被表示为

I = μ + ∑ i = 1 M ∑ j = 1 N z i , j λ i , j ϕ i , j ( I ) \mathbf{I}=\mu+\sum_{i=1}^{M} \sum_{j=1}^{N} z_{i, j} \sqrt{\lambda_{i, j}} \phi_{i, j}(\mathbf{I}) I=μ+i=1Mj=1Nzi,jλi,j ϕi,j(I)

其中, z i , j {z_{i,j}} zi,j 是一组独立同分布的随机变量, ϕ i , j ( I ) \boldsymbol{\phi}_{i,j}(\mathbf{I}) ϕi,j(I) 是图像 I \mathbf{I} I 的第 ( i , j ) (i,j) (i,j) 个正交基函数, λ i , j \lambda_{i,j} λi,j C I \mathbf{C_I} CI 的第 ( i , j ) (i,j) (i,j) 个特征值

在实际应用中,通常采用二维离散余弦变换(2D-DCT)作为正交基函数。具体来说,对于一幅 M × N M \times N M×N 的图像 I \mathbf{I} I,可以将其分解为 M M M 个行向量和 N N N 个列向量,然后对每一行和每一列分别进行一维离散余弦变换。设变换后的结果为 F \mathbf{F} F,则 F \mathbf{F} F 的第 ( i , j ) (i,j) (i,j) 个元素为

F i , j = 2 M N cos ⁡ [ ( 2 i − 1 ) ( j − 1 ) π 2 M ] cos ⁡ [ ( 2 j − 1 ) ( i − 1 ) π 2 N ] ∑ m = 1 M ∑ n = 1 N ( I m , n − μ ) cos ⁡ [ ( 2 m − 1 ) ( i − 1 ) π 2 M ] cos ⁡ [ ( 2 n − 1 ) ( j − 1 ) π 2 N ] \begin{array}{l}F_{i, j}=\sqrt{\frac{2}{M N}} \cos \left[\frac{(2 i-1)(j-1) \pi}{2 M}\right] \cos \left[\frac{(2 j-1)(i-1) \pi}{2 N}\right] \sum_{m=1}^{M} \sum_{n=1}^{N}\left(I_{m, n}-\right. \mu) \cos \left[\frac{(2 m-1)(i-1) \pi}{2 M}\right] \cos \left[\frac{(2 n-1)(j-1) \pi}{2 N}\right]\end{array} Fi,j=MN2 cos[2M(2i1)(j1)π]cos[2N(2j1)(i1)π]m=1Mn=1N(Im,nμ)cos[2M(2m1)(i1)π]cos[2N(2n1)(j1)π]

其中, I m , n I_{m,n} Im,n 是原始图像 I \mathbf{I} I 的第 ( m , n ) (m,n) (m,n) 个像素值。由于 DKLT 是一种正交变换,因此它可以保持图像的信息不变,但是将其表示为更加紧凑的形式。在实际应用中,图像 K-L 变换可以用于图像压缩、特征提取、图像分类等领域

B:程序

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

clear,clc,close all;
fmt={'*.jpg','JPEG image(*.jpg)';'*.*','All Files(*.*)'};
[FileName,FilePath]=uigetfile(fmt,'导入数据','face*.jpg','MultiSelect','on');
if ~isequal([FileName,FilePath],[0,0])
    FileFullName=strcat(FilePath,FileName);
else 
    return;
end 
N=length(FileFullName); 
for k=1:N
    Image=im2double(rgb2gray(imread(FileFullName{k})));
    X(:,k) = Image(:);           % 把图像放在矩阵x的第k列
end
[h,w,c]=size(Image);
% %----------- 计算每幅训练图像的与平均脸的差值 -------%
averagex = mean(X')';             %计算均值图像 
X=X-averagex;                     % 求中心化图像向量

%-----奇异值分解方法计算协方差矩阵的特征值和特征向量----%
R = X'*X;                   %协方差矩阵为x*x’,这里用奇异值分解
[Q,D] = eig(R);         %V为以特征向量为列的矩阵,D为特征值组成的对角阵
[D_sort,index] = sort(diag(D),'descend');
D=D(index,index);
Q = Q(:,index);
P = X*Q*(abs(D))^-0.5;

total = 0.0;
count = sum(D_sort);
for r =1:N
    total = total + D_sort(r);
    if total/count > 0.95        %当差异信息比例达到85%时退出循环
        break;
    end
end
%-------------测试样本在新空间上投影后的坐标-----------%
KLCoefR = P'*X;
figure; plot(KLCoefR(1,:),KLCoefR(2,:),'ko'),title('K-L变换行压缩');
xlabel('第一主成分得分');ylabel('第二主成分得分');
Y= P(:,1:2)*KLCoefR(1:2,:)+averagex;                     %重建
for j=1:N
    outImage=reshape(Y(:,j),h,w);
%     top=max(outImage(:));
%     bottom=min(outImage(:));
%     outImage=(outImage-bottom)/(top-bottom);
%     str=strcat('feaface12_',num2str(j),'.jpg');
%     imwrite(outImage,str);
    figure,imshow(outImage,[]);
end
Z= P(:,1:r)*KLCoefR(1:r,:)+averagex;                     %重建
for j=1:N
    outImage=reshape(Z(:,j),h,w);
%     top=max(outImage(:));
%     bottom=min(outImage(:));
%     outImage=(outImage-bottom)/(top-bottom);
%     str=strcat('feaface1r_',num2str(j),'.jpg');
%     imwrite(outImage,str);
    figure,imshow(outImage,[]);
end
KLCoefC = X*Q;
for j =1:N
    outImage=reshape(KLCoefC(:,j),h,w);
%     top=max(outImage(:));
%     bottom=min(outImage(:));
%     outImage=(outImage-bottom)/(top-bottom);
%     str=strcat('feaface',num2str(j),'.jpg');
%     imwrite(outImage,str);
    figure,imshow(outImage,[]);
end
% 
% 

在这里插入图片描述

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

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 导入数据
fmt = [("*.jpg", "JPEG image(*.jpg)"), ("*.*", "All Files(*.*)")]
FileName, FilePath = tkinter.filedialog.askopenfilename(filetypes=fmt, title="导入数据", initialdir=".", multiple=True)
if FileName:
    N = len(FileName)
    X = np.zeros((h * w, N))
    for k in range(N):
        Image = cv2.imread(FileName[k])
        Image = cv2.cvtColor(Image, cv2.COLOR_BGR2GRAY).astype(np.float64)
        X[:, k] = np.reshape(Image, -1)  # 把图像放在矩阵x的第k列

[h, w] = Image.shape

# 计算每幅训练图像的与平均脸的差值
averagex = np.mean(X, axis=1)
X = X - np.tile(averagex[:, np.newaxis], (1, N))

# 奇异值分解方法计算协方差矩阵的特征值和特征向量
R = np.dot(X.T, X)
[D, Q] = np.linalg.eigh(R)  # Q为以特征向量为列的矩阵,D为特征值组成的对角阵
idx = D.argsort()[::-1]
D = D[idx]
Q = Q[:, idx]
P = np.dot(X, Q)
P = np.dot(P, np.diag(1 / np.sqrt(abs(D) + np.finfo(np.float32).eps)))  # 使P正交

total = 0.0
count = np.sum(D)
for r in range(N):
    total += D[r]
    if total / count > 0.95:
        break

# 测试样本在新空间上投影后的坐标
KLCoefR = np.dot(P.T, X)

plt.plot(KLCoefR[0, :], KLCoefR[1, :], "ko")
plt.title("K-L变换行压缩")
plt.xlabel("第一主成分得分")
plt.ylabel("第二主成分得分")
plt.show()

Y = np.dot(P[:, :2], KLCoefR[:2, :]) + np.tile(averagex[:, np.newaxis], (1, N))  # 重建
for j in range(N):
    outImage = np.reshape(Y[:, j], (h, w))
    plt.imshow(outImage, cmap="gray")
    plt.show()

Z = np.dot(P[:, :r], KLCoefR[:r, :]) + np.tile(averagex[:, np.newaxis], (1, N))  # 重建
for j in range(N):
    outImage = np.reshape(Z[:, j], (h, w))
    plt.imshow(outImage, cmap="gray")
    plt.show()

KLCoefC = np.dot(X, Q)
for j in range(N):
    outImage = np.reshape(KLCoefC[:, j], (h, w))
    plt.imshow(outImage, cmap="gray")
    plt.show()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE4 几种常见的项目优化方式

1.灯光范围优化 当屏幕某一块像素被多盏灯光所影响,那么也会拖慢帧率,可以打开灯光复杂度视图进行查看,屏幕上越红的地方灯光复杂度越高,尝试降低灯光半径可以解决: 2.材质纹素优化 有时候我们并不知道目标模型的…

OJ练习LeetCode-118:杨辉三角

题目 118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 可以看到&#xff0c;默认的代码块中出现List<List<Integer>>为二级ArrayList&#xff0c;类似于数组中的二维数组。List<元素类型> 在List<List<Integer>>中&#xff0c;元素类型…

百度天工AIoT设备应用使能平台助力企业低成本开发

数字中国建设的顶层文件《数字中国建设整体布局规划》&#xff08;以下简称《规划》&#xff09;于近日印发&#xff0c;作为数字中国建设的重要基础&#xff0c;《规划》指出&#xff0c;要全面赋能经济社会发展&#xff0c;推动数字技术和实体经济的深度融合&#xff0c;产业…

如何将本地项目上传到Github的方法步骤

默认&#xff1a;已经安装好了git。 第一步&#xff1a;我们需要先创建一个本地的版本库&#xff08;其实也就是一个文件夹&#xff09;。 你可以直接右击新建文件夹&#xff0c;也可以右击打开Git bash命令行窗口通过命令来创建。 第二步&#xff1a;通过命令git init把这个…

chatGPT所在地区不支持怎么解决-需要下载ChatGPT吗

ChatGPT国内能下载吗 ChatGPT是基于云端的人工智能交互服务&#xff0c;无需下载即可使用。因此&#xff0c;您不需要在国内下载ChatGPT&#xff0c;只需要在网络环境联通的情况下&#xff0c;通过浏览器访问ChatGPT官网或合作伙伴提供的ChatGPT服务即可使用。当然&#xff0c…

怎么评价2023年第十三届MathorCup高校数学建模挑战赛?

文章目录赛题思路选题建议1 竞赛信息2 竞赛时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; 选题建议 首先要注意&#xff0c;A、B题为研究生组可选题目&#xff0c;A…

【分享购】“消费+分享”的新型聚合生态模式

“分享购”是一个以创新的商业模式整合流量与资源&#xff0c;实现整个生态布局的应用。结合了CPS资源、商城、礼包、异业联盟/O2等应用&#xff0c;可实现“消费分享”的新型聚合生态模式。 分享购模式所采用的五五复制的会员裂变制度是这个模式的核心亮点。 用户通过平台用户…

【Python学习笔记】4. Python大数据编程入门

4. Python大数据编程入门4.1 Python操作MySQL4.2 Spark与PySpark4.2.1 PySpark基础4.2.2 数据输入4.2.2.1 Python数据容器转换为RDD对象4.2.2.2 读取文本文件得到RDD对象4.2.3 数据计算4.2.3.1 map算子4.2.3.2 flatMap算子4.2.3.3 reduceByKey算子4.2.3.4 案例&#xff1a;单词…

亚马逊云科技云创计划,打造创新创业生态系统

在充满着不确定性的2022年&#xff0c;电子消费市场一片哀鸿遍野&#xff0c;智能家居行业却如同逆水行舟&#xff0c;显示出稳健的发展之势&#xff0c;宣告着智能家居时代已来。在2023年3月24日举办的“智能家居&#xff0c;出海闭门会”上&#xff0c;为进一步发挥产业带潜力…

zabbix自动发现和自动注册部署

目录 zabbix自动发现 确保客户端上的zabbix-agent2服务状态正常 在web页面删除原有的客户端主机 在服务端和客户端上配置 hosts 解析 在 Web 页面配置自动发现 zabbix自动注册 环境准备 修改 zabbix-agent2 配置文件 在 Web 页面配置自动注册 zabbix自动发现 对于agen…

Python 进阶指南(编程轻松进阶):七、编程术语

原文&#xff1a;http://inventwithpython.com/beyond/chapter7.html 在 XKCD 漫画《飞人五号》&#xff08;xkcd.com/1133&#xff09;中&#xff0c;网络漫画的艺术家兰道尔门罗只用了 1000 个最常见的英语单词&#xff0c;就创作出了土星五号火箭的技术示意图。这部漫画把所…

python学习之合并多张图片转成mp4视频代码实现

文章目录前言一、需要调入的模块1、imageio模块2、Image 模块二、实现合并多张图片转成 mp4 视频三、优化改进一下总结前言 随着现代科技飞速发展和人们提升视觉上体验&#xff0c;利用图片生成视频的方法&#xff0c;确实为工作或者提升生活体验感做了很多成功案例&#xff1…

vue实现好看的相册、图片网站

目录 一、效果图 1.项目访问地址 2.画虫官方效果图&#xff1a; 3.作者实现的效果图&#xff1a; 二、代码实现 1.项目结构截图 2.路由配置代码&#xff1a; 3. 头部底部主页面内容显示容器的代码 4.首页&#xff0c;即标签页的代码 三、项目启动说明 四、总结 一、…

Talk预告 | 浙江大学特聘研究员廖依伊:面向自动驾驶仿真平台的神经渲染

本期为TechBeat人工智能社区第477期线上Talk&#xff01; 北京时间3月1日(周三)20:00&#xff0c;浙江大学信电学院特聘研究员——廖依伊的Talk将准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “面向自动驾驶仿真平台的神经渲染”&#xff0c;届时将探…

Vue.js 2.0 实例

构造器 每个 Vue.js 应用都是通过构造函数 Vue 创建一个 Vue 的根实例 启动的&#xff1a; var vm new Vue({// 选项 }) 虽然没有完全遵循 MVVM 模式&#xff0c; Vue 的设计无疑受到了它的启发。因此在文档中经常会使用 vm 这个变量名表示 Vue 实例。 在实例化 Vue 时&…

爱智EdgerOS之深入解析在爱智应用中如何使用Socket.IO轻松实现双向通信

一、什么是 Socket.IO&#xff1f; Socket.IO 是一个基于事件通信的实时应用程序框架&#xff0c;它在即时通讯、通知和消息推送&#xff0c;实时分析等场景中有广泛的应用。Socket.IO 包括两个部分&#xff1a; 在 Server 端的模块&#xff08;JSRE 已提供了 socket.io 模块&…

密码和生物识别技术可以阻止不良行为者

网络安全漏洞是一个持续的威胁&#xff0c;而且只会越来越严重。2021 年&#xff0c;45% 的美国公司遭受了与凭证泄露相关的数据泄露&#xff0c;4200 万人因身份盗用和相关欺诈遭受了超过 500 亿美元的总价值损失&#xff0c;并且在过去五年中&#xff0c;超过5 亿个凭证和密码…

AI绘画王炸功能Control Net安装教程

原文&#xff1a;AI绘画王炸功能Control Net安装教程 - 知乎 AI绘画&#xff0c;最近两大王炸功能出圈了。 一个就是超真实超细节的美女图片&#xff0c;已经快和照片无异了&#xff0c;甚至有人用AI绘画的“女仆照片”开始招募游艇会了&#xff0c;具体教程可以查看Lora这篇…

多元时间序列 | GRU门控循环单元多变量时间序列预测(Matlab完整程序)

多元时间序列 | GRU门控循环单元多变量时间序列预测(Matlab完整程序) 目录 多元时间序列 | GRU门控循环单元多变量时间序列预测(Matlab完整程序)预测结果评价指标基本介绍程序设计参考资料预测结果 评价指标 训练集数据的R2为:0.98197 测试集数据的R2为:0.97913 训练集数…