离散傅里叶变换(Discrete Fourier Transform, DFT)及其在图像处理中的应用
离散傅里叶变换(DFT)及其在图像处理中的应用
什么是离散傅里叶变换?
离散傅里叶变换(Discrete Fourier Transform, DFT)是一种强大的数学工具,用于将离散信号从时域(或空间域)转换到频域。它可以将一个有限长度的信号分解成一系列正弦和余弦波的组合,每个波都有特定的频率、幅度和相位。DFT 的核心思想来源于傅里叶分析,但它适用于离散信号,是数字信号处理和图像处理的基础。
DFT 的数学定义如下:对于长度为 ( N N N) 的一维信号 ( x [ n ] x[n] x[n]),其离散傅里叶变换为:
X [ k ] = ∑ n = 0 N − 1 x [ n ] e − j 2 π N n k , k = 0 , 1 , . . . , N − 1 X[k] = \sum_{n=0}^{N-1} x[n] e^{-j \frac{2\pi}{N} nk}, \quad k = 0, 1, ..., N-1 X[k]=n=0∑N−1x[n]e−jN2πnk,k=0,1,...,N−1
其中:
- ( X [ k ] X[k] X[k]) 是频域中的复数系数,表示频率分量;
- ( x [ n ] x[n] x[n]) 是时域或空间域的输入信号;
- ( e − j 2 π N n k e^{-j \frac{2\pi}{N} nk} e−jN2πnk) 是复指数函数,包含正弦和余弦成分;
- ( j j j) 是虚数单位。
反变换(IDFT)可以将频域信号转换回时域:
x [ n ] = 1 N ∑ k = 0 N − 1 X [ k ] e j 2 π N n k x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{j \frac{2\pi}{N} nk} x[n]=N1k=0∑N−1X[k]ejN2πnk
DFT 有什么用?
DFT 的用途非常广泛,尤其是在信号处理和图像处理领域。以下是一些主要应用:
- 频谱分析:分析信号的频率成分,例如音频信号中的音调或图像中的纹理。
- 滤波:通过修改频域系数实现低通、高通或带通滤波,去除噪声或增强特定特征。
- 图像压缩:提取主要频率成分,丢弃次要信息(如 JPEG 中的 DCT)。
- 卷积加速:利用快速傅里叶变换(FFT)实现高效卷积运算,广泛应用于图像处理和深度学习。
在图像处理中,二维 DFT 特别重要,因为图像本质上是一个二维信号。通过分析图像的频域特性,我们可以进行去噪、边缘检测、纹理分析等操作。
二维 DFT 在图像处理中的应用
对于一张二维图像 ( f ( x , y ) f(x, y) f(x,y))(大小为 ( M × N M \times N M×N)),二维 DFT 的公式为:
F ( u , v ) = ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x , y ) e − j 2 π ( u x M + v y N ) F(u, v) = \sum_{x=0}^{M-1} \sum_{y=0}^{N-1} f(x, y) e^{-j 2\pi \left( \frac{ux}{M} + \frac{vy}{N} \right)} F(u,v)=x=0∑M−1y=0∑N−1f(x,y)e−j2π(Mux+Nvy)
其中:
- ( F ( u , v ) F(u, v) F(u,v)) 是频域系数,( u u u) 和 ( v v v) 分别表示水平和垂直方向的频率;
- ( f ( x , y ) f(x, y) f(x,y)) 是图像像素值。
反变换为:
f ( x , y ) = 1 M N ∑ u = 0 M − 1 ∑ v = 0 N − 1 F ( u , v ) e j 2 π ( u x M + v y N ) f(x, y) = \frac{1}{MN} \sum_{u=0}^{M-1} \sum_{v=0}^{N-1} F(u, v) e^{j 2\pi \left( \frac{ux}{M} + \frac{vy}{N} \right)} f(x,y)=MN1u=0∑M−1v=0∑N−1F(u,v)ej2π(Mux+Nvy)
在图像处理中,二维 DFT 的结果是一个复数矩阵,其幅度谱(Magnitude Spectrum)通常用于可视化:
∣ F ( u , v ) ∣ = Re ( F ( u , v ) ) 2 + Im ( F ( u , v ) ) 2 |F(u, v)| = \sqrt{\text{Re}(F(u, v))^2 + \text{Im}(F(u, v))^2} ∣F(u,v)∣=Re(F(u,v))2+Im(F(u,v))2
以下是一个 Python 代码示例,展示如何对图像应用二维 DFT 并可视化频谱。
Python 代码实现(二维 DFT)
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft2, ifft2, fftshift# Load and process an image
def load_image():# Create a simple synthetic image (grayscale)image = np.zeros((256, 256))image[100:156, 100:156] = 255 # Add a white square in the centerreturn image# Apply 2D DFT and visualize
def apply_dft(image):# Compute 2D DFTdft = fft2(image)# Shift the zero frequency component to the centerdft_shifted = fftshift(dft)# Compute magnitude spectrum (log scale for better visualization)magnitude_spectrum = np.log(1 + np.abs(dft_shifted))# Reconstruct the image using inverse DFTreconstructed_image = np.abs(ifft2(dft))return magnitude_spectrum, reconstructed_image# Main function
if __name__ == "__main__":# Load imageoriginal_image = load_image()# Apply DFTmagnitude_spectrum, reconstructed_image = apply_dft(original_image)# Visualizationplt.figure(figsize=(12, 4))plt.subplot(1, 3, 1)plt.imshow(original_image, cmap='gray')plt.title("Original Image")plt.axis('off')plt.subplot(1, 3, 2)plt.imshow(magnitude_spectrum, cmap='gray')plt.title("Magnitude Spectrum (Log Scale)")plt.axis('off')plt.subplot(1, 3, 3)plt.imshow(reconstructed_image, cmap='gray')plt.title("Reconstructed Image")plt.axis('off')plt.tight_layout()plt.show()
代码说明
load_image:生成一个简单的 256x256 灰度图像,中间有一个白色方块,用于测试。apply_dft:- 使用
scipy.fft.fft2计算二维 DFT。 - 使用
fftshift将零频分量移到频谱中心,便于可视化。 - 计算幅度谱并取对数(
np.log(1 + np.abs())),增强显示效果。 - 使用
ifft2进行逆变换,重构图像。
- 使用
- 可视化:展示原始图像、频谱图和重构图像。
运行结果

运行代码后,你会看到:
- 原始图像:一个带有白色方块的灰度图像。
- 幅度谱:频谱图显示低频分量集中在中心,高频分量分布在边缘,形成对称图案。
- 重构图像:通过逆 DFT 恢复的图像,应与原始图像几乎一致。
DFT 与 DCT 的区别
关于DCT,可以参考笔者的另一篇博客:离散余弦变换(Discrete Cosine Transform, DCT):从数学到图像压缩的魔法(Python代码实现)
离散傅里叶变换(DFT)和离散余弦变换(DCT)都是频域变换工具,但在原理和应用上有显著差异:
-
数学基础
- DFT:使用复指数函数 ( e − j θ e^{-j\theta} e−jθ),输出是复数(包含幅度和相位),能完整表示信号的频率和相位信息。
- DCT:仅使用实数的余弦函数,输出是实数,专注于信号的幅度信息,相位信息被简化。
-
边界条件
- DFT:假设信号是周期性的,因此在边界处可能引入伪影(称为“周期性边界效应”)。
- DCT:假设信号在边界处通过镜像对称扩展,减少边界伪影,特别适合图像处理。
-
能量集中
- DCT:将信号能量更多地集中在低频系数中,这使得它在压缩(如 JPEG)中更高效。
- DFT:能量分布较均匀,不如 DCT 集中,但在频谱分析中更全面。
-
计算复杂度
- DFT:直接计算复杂度为 ( O ( N 2 ) O(N^2) O(N2)),但通过快速傅里叶变换(FFT)可降至 (O(N \log N)),适用于大尺寸信号。
- DCT:复杂度也为 ( O ( N 2 ) O(N^2) O(N2)),但在图像压缩中通常处理小块(如 8x8),实际计算量较小。
-
应用场景
- DFT:更适合需要完整频率信息和相位的场景,如信号分析、滤波、卷积运算。
- DCT:专为数据压缩设计(如 JPEG、MPEG),因其能量集中特性在有损压缩中占优。
总结
离散傅里叶变换(DFT)是一个通用的信号分析工具,在图像处理中通过二维 DFT 可以揭示图像的频率特性,适用于滤波、去噪等任务。而 DCT 则是图像压缩的“秘密武器”,通过能量集中和实数运算优化了压缩效率。选择 DFT 还是 DCT,取决于你的具体需求:如果你需要全面的频域分析,DFT 是首选;如果目标是高效压缩,DCT 更胜一筹。
希望这篇博客和代码能让你更好地理解 DFT 及其与 DCT 的差异!如果有疑问,欢迎留言讨论。
你的疑问非常好!关于频谱图中“低频分量集中在中心且很亮”的现象,以及为什么亮的不是高频分量,这涉及到频域表示的特点和可视化时的处理方式。下面我来详细解答:
为什么频谱图中低频分量集中在中心且很亮?
1. 频谱图的中心化(fftshift 的作用)
在代码中,我们使用了 fftshift 函数对二维 DFT 的结果进行了移位处理。原始的 DFT 输出 ( F ( u , v ) F(u, v) F(u,v)) 将零频分量(即频率为 0 的分量)放在矩阵的左上角 ( ( 0 , 0 ) (0, 0) (0,0)) 位置。但在实际可视化时,为了更直观地观察频率分布,我们通常将零频分量移到频谱图的中心。这种移位操作使得:
- 低频分量(接近零频的频率)集中在频谱图的中心。
- 高频分量(较大的频率)分布在边缘。
因此,在你看到的频谱图中,中心区域代表低频分量,而边缘区域代表高频分量。
2. 亮度与幅度谱的关系
频谱图显示的是幅度谱 ( ∣ F ( u , v ) ∣ |F(u, v)| ∣F(u,v)∣),即 DFT 复数系数的模(magnitude),计算公式为:
∣ F ( u , v ) ∣ = Re ( F ( u , v ) ) 2 + Im ( F ( u , v ) ) 2 |F(u, v)| = \sqrt{\text{Re}(F(u, v))^2 + \text{Im}(F(u, v))^2} ∣F(u,v)∣=Re(F(u,v))2+Im(F(u,v))2
为了让幅度谱的可视化更清晰,代码中还对幅度取了对数:
magnitude_spectrum = log ( 1 + ∣ F ( u , v ) ∣ ) \text{magnitude\_spectrum} = \log(1 + |F(u, v)|) magnitude_spectrum=log(1+∣F(u,v)∣)
-
低频分量为什么亮?
在图像中,低频分量通常对应平滑区域或整体亮度变化(例如大块的白色或黑色区域)。这些区域的能量(幅度)往往很大,因为它们占据了图像的主要内容。在你的示例图像中,白色方块是一个较大的均匀区域,其能量集中在低频部分,因此中心区域的幅度值很高。取对数后,这些高幅度值在灰度图中表现为“很亮”。 -
高频分量为什么不亮?
高频分量对应图像中的细节、边缘或快速变化的部分(例如白色方块的边界)。这些分量的幅度通常较小,因为细节部分的能量分布较分散,且在图像中占的比例较低。即使某些高频分量的幅度可能不小,取对数后它们的值也被压缩,不如低频分量突出,因此边缘区域显得较暗。
3. 为什么亮的不是高频?
疑问:“亮的一般不是高频吗?”
这可能是因为在某些直观理解中,高频分量与“尖锐”或“显著”的边缘相关,容易让人觉得它们应该很“亮”。但在频谱图中,亮度直接反映的是幅度的大小,而不是频率的高低:
- 图像特性决定能量分布:对于大多数自然图像或简单图像(如你的白色方块示例),低频分量包含大部分能量,因为它们描述了图像的主要结构。而高频分量的能量通常较少,除非图像充满了密集的细节或噪声。
- 对数缩放的影响:未经对数缩放的幅度谱动态范围很大,低频分量可能比高频分量高出几个数量级。如果直接显示原始幅度谱,低频的亮度会过于强烈,其他部分几乎不可见。取对数是为了平衡这种差异,让高频分量也能被看到,但低频的高幅度仍然主导了亮度。
用代码验证亮度的来源
为了进一步说明,我们可以修改代码,观察不同图像的频谱图,验证低频和高频的亮度分布。以下是扩展代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft2, ifft2, fftshift# Create a synthetic image with a white square (low frequency dominant)
def load_low_freq_image():image = np.zeros((256, 256))image[100:156, 100:156] = 255 # White square in the centerreturn image# Create a synthetic image with high-frequency details (checkerboard pattern)
def load_high_freq_image():image = np.zeros((256, 256))for i in range(256):for j in range(256):if (i // 16 + j // 16) % 2 == 0: # Checkerboard patternimage[i, j] = 255return image# Apply 2D DFT and visualize
def apply_dft(image):dft = fft2(image)dft_shifted = fftshift(dft)magnitude_spectrum = np.log(1 + np.abs(dft_shifted))reconstructed_image = np.abs(ifft2(dft))return magnitude_spectrum, reconstructed_image# Main function
if __name__ == "__main__":# Test two imageslow_freq_image = load_low_freq_image() # Low frequency dominanthigh_freq_image = load_high_freq_image() # High frequency dominant# Apply DFT to bothlow_freq_spectrum, low_freq_reconstructed = apply_dft(low_freq_image)high_freq_spectrum, high_freq_reconstructed = apply_dft(high_freq_image)# Visualizationplt.figure(figsize=(12, 8))plt.subplot(2, 3, 1)plt.imshow(low_freq_image, cmap='gray')plt.title("Low Frequency Image")plt.axis('off')plt.subplot(2, 3, 2)plt.imshow(low_freq_spectrum, cmap='gray')plt.title("Magnitude Spectrum (Low Freq)")plt.axis('off')plt.subplot(2, 3, 3)plt.imshow(low_freq_reconstructed, cmap='gray')plt.title("Reconstructed Image (Low Freq)")plt.axis('off')plt.subplot(2, 3, 4)plt.imshow(high_freq_image, cmap='gray')plt.title("High Frequency Image")plt.axis('off')plt.subplot(2, 3, 5)plt.imshow(high_freq_spectrum, cmap='gray')plt.title("Magnitude Spectrum (High Freq)")plt.axis('off')plt.subplot(2, 3, 6)plt.imshow(high_freq_reconstructed, cmap='gray')plt.title("Reconstructed Image (High Freq)")plt.axis('off')plt.tight_layout()plt.show()
运行结果分析

-
低频主导图像(白色方块):
- 频谱图中心很亮,因为白色方块的均匀区域贡献了大量低频能量。
- 边缘较暗,高频分量(方块边界)的能量较少。
-
高频主导图像(棋盘格图案):
- 频谱图中亮度分布到远离中心的位置,形成离散的亮点,对应棋盘格的高频周期性变化。
- 中心(低频)不再是最亮的区域,因为图像缺少大范围平滑结构。
总结
频谱图中“亮”的区域反映的是幅度的大小,而幅度的大小取决于图像的能量分布:
- 低频分量亮:在你的原始例子中,低频分量因白色方块的平滑区域而具有高幅度,因此中心很亮。
- 高频分量暗:高频分量的能量通常较分散,且幅度较小,在对数缩放下不突出。
- 亮的不是高频的误解:高频分量可能在边缘或细节丰富的图像中更显著,但在典型图像中,低频分量往往占主导地位。
如果你对特定图像的频谱有疑问,可以提供图像或描述,我可以帮你进一步分析!
为什么频谱图通常只显示幅度谱 ( ∣ F ( u , v ) ∣ |F(u, v)| ∣F(u,v)∣),而相位谱往往被忽略?
什么是幅度谱和相位谱?
在二维离散傅里叶变换(DFT)中,输出 ( F ( u , v ) F(u, v) F(u,v)) 是一个复数矩阵,每个元素可以表示为:
F ( u , v ) = Re ( F ( u , v ) ) + j ⋅ Im ( F ( u , v ) ) F(u, v) = \text{Re}(F(u, v)) + j \cdot \text{Im}(F(u, v)) F(u,v)=Re(F(u,v))+j⋅Im(F(u,v))
其中:
- ( Re ( F ( u , v ) ) \text{Re}(F(u, v)) Re(F(u,v))) 是实部;
- ( Im ( F ( u , v ) ) \text{Im}(F(u, v)) Im(F(u,v))) 是虚部。
我们可以将其转换为极坐标形式:
F ( u , v ) = ∣ F ( u , v ) ∣ e j ϕ ( u , v ) F(u, v) = |F(u, v)| e^{j \phi(u, v)} F(u,v)=∣F(u,v)∣ejϕ(u,v)
-
幅度谱 ( ∣ F ( u , v ) ∣ |F(u, v)| ∣F(u,v)∣):
∣ F ( u , v ) ∣ = Re ( F ( u , v ) ) 2 + Im ( F ( u , v ) ) 2 |F(u, v)| = \sqrt{\text{Re}(F(u, v))^2 + \text{Im}(F(u, v))^2} ∣F(u,v)∣=Re(F(u,v))2+Im(F(u,v))2
表示每个频率分量的强度或能量大小。 -
相位谱 ( ϕ ( u , v ) \phi(u, v) ϕ(u,v)):
ϕ ( u , v ) = arctan ( Im ( F ( u , v ) ) Re ( F ( u , v ) ) ) \phi(u, v) = \arctan\left(\frac{\text{Im}(F(u, v))}{\text{Re}(F(u, v))}\right) ϕ(u,v)=arctan(Re(F(u,v))Im(F(u,v)))
表示每个频率分量的相位角,反映信号在时间或空间上的偏移。
为什么频谱图通常只显示幅度谱?
1. 幅度谱直接反映能量分布
幅度谱 ( ∣ F ( u , v ) ∣ |F(u, v)| ∣F(u,v)∣) 表示每个频率分量的强度,直接对应于信号的能量分布。在图像处理和信号分析中,我们通常关心:
- 哪些频率分量占主导地位(例如低频的平滑区域还是高频的边缘);
- 信号的频率特性如何(例如是否有噪声或特定模式)。
幅度谱提供了直观的“强度图”,可以快速判断信号的主要成分。例如:
- 在你的白色方块图像中,幅度谱中心的亮点表明低频分量占主导;
- 在噪声图像中,高频分量可能更显著。
相比之下,相位谱 ( ϕ ( u , v ) \phi(u, v) ϕ(u,v)) 是一个角度值(通常在 ( [ − π , π ] [- \pi, \pi] [−π,π]) 范围内),它的数值没有直接的物理意义(如能量或强度),可视化后往往是一片杂乱的图案,不易直观解读。
2. 可视化难度
- 幅度谱:取对数后(如 ( log ( 1 + ∣ F ( u , v ) ∣ ) \log(1 + |F(u, v)|) log(1+∣F(u,v)∣))),幅度谱的值被压缩到一个合理的范围,便于用灰度图或彩色图显示,人类视觉系统能轻松分辨。
- 相位谱:相位值是周期性的角度(如 ( − π -\pi −π) 到 ( π \pi π)),直接显示时会形成复杂的跳跃图案(由于相位的周期性,可能出现不连续的边界)。即使映射到灰度值,也很难看出规律,除非进行特殊处理(如解缠绕或平滑),但这增加了分析复杂性。
3. 应用场景的侧重点
在许多实际应用中,幅度谱已经足以满足需求:
- 图像压缩:如 JPEG 使用 DCT,只关心幅度信息来量化系数,相位被忽略。
- 滤波:设计低通或高通滤波器时,主要修改幅度谱(如削弱高频分量),相位通常保持不变。
- 频谱分析:检查信号的频率分布时,幅度谱直接给出答案。
相位谱虽然包含信息,但在这些场景下不是首要关注的,因为它对最终结果的感知影响较小(后面会详细解释)。
相位谱的作用是什么?为什么不常关心?
相位谱的作用
相位谱 ( ϕ ( u , v ) \phi(u, v) ϕ(u,v)) 描述了每个频率分量在空间或时间上的相对位置或偏移。换句话说,它决定了信号的“形状”或“结构”,而幅度谱决定了“强度”。在图像中:
- 幅度谱:控制每个频率分量的大小,影响图像的对比度和能量分布。
- 相位谱:控制频率分量的排列方式,影响图像的空间结构(如边缘的位置、物体的轮廓)。
一个经典实验可以说明两者的作用:将两张图像的幅度谱和相位谱互换,然后用逆 DFT 重构:
- 用图像 A 的幅度谱 + 图像 B 的相位谱:重构图像更像图像 B。
- 用图像 B 的幅度谱 + 图像 A 的相位谱:重构图像更像图像 A。
这表明相位谱对图像的视觉结构(可识别性)至关重要,而幅度谱更多影响亮度和对比度。
为什么不常关心相位谱?
-
人类视觉对相位的敏感度较低
人眼对图像的整体结构(由相位决定)非常敏感,但对相位的微小扰动不敏感。例如:- 如果幅度谱保持不变,轻微改变相位谱,图像仍可识别。
- 如果相位谱保持不变,改变幅度谱(如滤波),图像的感知变化更明显(如变模糊或变清晰)。
在压缩或滤波中,丢弃或修改部分相位信息对视觉影响较小,因此相位常被忽略。
-
相位信息难以处理和利用
- 相位谱的周期性和跳跃性使其难以直接操作。例如,滤波时修改相位可能引入伪影(如振铃效应),而修改幅度更直观。
- 在压缩中(如 JPEG),相位信息被 DCT 简化(DCT 是实数变换,不保留相位),但仍能重构可接受的图像。
-
计算和存储成本
DFT 输出是复数,包含幅度和相位需要双倍存储空间(实部和虚部)。而在许多应用中,只保留幅度谱即可完成任务(如频谱分析或压缩),省去了存储和处理相位的开销。
两者结合不是更好吗?
理论上,幅度谱和相位谱结合确实能完整描述信号,因为:
- 幅度谱:提供频率分量的强度;
- 相位谱:提供频率分量的空间排列。
完整的 DFT 重构(使用 ( F ( u , v ) F(u, v) F(u,v)) 的实部和虚部)需要两者结合,否则无法准确恢复原始信号。然而,在实践中:
- 特定任务不需要完整信息:如频谱分析只看幅度,压缩只用幅度简化计算。
- 相位的重要性因应用而异:在信号传输或某些逆问题(如相位检索)中,相位至关重要,但在图像可视化或压缩中,幅度往往足够。
总结
- 为什么只显示幅度谱? 因为它直观反映能量分布,易于可视化和分析,满足大多数应用需求。
- 为什么不常关心相位谱? 因为相位对视觉感知的影响不如幅度明显,且处理复杂,在压缩或滤波中常被简化。
- 两者结合更好吗? 是的,在需要完整信号重构或特定任务(如相位检索)时,相位不可或缺。但在图像处理的常见场景中,幅度谱已足够实用。
希望这个解答和代码能让你更清楚地理解幅度谱和相位谱的角色!
后记
2025年3月3日15点58分于上海,在grok3大模型辅助下完成。
相关文章:
离散傅里叶变换(Discrete Fourier Transform, DFT)及其在图像处理中的应用
离散傅里叶变换(DFT)及其在图像处理中的应用 什么是离散傅里叶变换? 离散傅里叶变换(Discrete Fourier Transform, DFT)是一种强大的数学工具,用于将离散信号从时域(或空间域)转换…...
记一次误禁用USB导致键盘鼠标失灵的修复过程
背景说明 在电脑上插入了一个USB hub,然后弹窗提示:“集线器端口上出现电涌”,点开让选择“重置”或者“关闭”,不小心点了关闭,结果这个usb口就被关了,再插任何东西都没反应,找了很多办法都恢…...
Apache nifi demo 实验
Apache nifi 是个数据流系统,可以通过配置 自定义的流程来实现数据的转换。 比如可以配置一个流程,读取数据库里的数据,再转换,最后保存到本地文件。 这样可以来实现一些数据转换的操作,而不用特地编写程序来导入导出。…...
Leetcode 57-插入区间
给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示另一个区间的开始和…...
SpringCloud之Eureka、Ribbon、OpenFeign
目录1. SpringCloud Eureka(服务注册与发现组件)2. SpringCloud Ribbon(负载均衡与服务调用组件)3. SpringCloud OpenFeign(负载均衡与服务调用组件)SpringCloud:用于开发高度可扩展、高性能的分…...
如何在MacOS 10.15上安装Docker Desktop
前文提到MacOS 10.15上无法通过Homebrew安装最新版本的docker,自然想到了去安装更早版本的docker。在MacOS上安装Docker Desktop比安装Docker Engine要更方便一些,具体原因可以自己搜索。通过Docker Desktop的Release notes得知最后一个支持MacOS 10.15的…...
Moticon智能鞋垫传感器OpenGo:经济实用的运动科学研究与临床评估工具
Moticon智能鞋垫传感器OpenGo是运动科学研究领域的一款高性能工具,其无线设计和精准传感器为步态分析、平衡评估以及疾病诊断提供了稳定的数据支持。通过实时捕捉足底压力分布、动态变化及平衡状态,OpenGo 为研究人员和临床医生提供了深入洞察个体运动模…...
打造高清3D虚拟世界|零基础学习Unity HDRP高清渲染管线(第一天)
打造高清3D虚拟世界|零基础学习Unity HDRP高清渲染管线(第一天) 前言最后 前言 说真的,用Unity工作这几年,经历的项目大大小小,对于场景的渲染算是有一定的经验,但涉及到HDRP高清渲染管线的了解࿰…...
nlp第十节——LLM相关
一、模型蒸馏技术 本质上是从一个大模型蒸馏出小模型,从小模型训练出来的概率分布(如自回归模型预测下一个字的概率分布)分别与大模型预测的概率分布和ground label求loss。与大模型预测的概率分布用KL散度求loss,与ground label用…...
Flutter管理项目实战
目录: 1、项目的构建和介绍 1、项目的构建和介绍 登录官网下载flutter的zip压缩包,解压到某个文件夹下即可,里面自带sdk的文件,无需再下载;创建项目时选定flutter的sdk的路径即可创建项目完成。 后续待完善࿰…...
智能差旅管理新范式:MyAgent如何重塑企业差旅全流程自动化
在快节奏的商业环境中,企业差旅管理长期面临着流程碎片化、人工操作繁复、合规风险高等痛点。传统模式下,员工需要反复填写纸质表单、逐级跑动审批,财务部门则要耗费大量时间核对票据,这种低效流程每年造成企业平均约15%的差旅管理…...
PostgreSQL 生产环境升级指南:pg_upgrade 快速完成版本升级!
前言 PostgreSQL 的版本号由主要版本号和次要版本号组成。例如,在 10.1 中,10 是主要版本,1 是次要版本。关于更多版本的规划,请参考 PostgreSQL 版本路线图。 版本号规则: PostgreSQL 10 及以后:版本号…...
UniApp 中封装 HTTP 请求与 Token 管理(附Demo)
目录 1. 基本知识2. Demo3. 拓展 1. 基本知识 从实战代码中学习,上述实战代码来源:芋道源码/yudao-mall-uniapp 该代码中,通过自定义 request 函数对 HTTP 请求进行了统一管理,并且结合了 Token 认证机制 请求封装原理ÿ…...
@update 的常见用法 Vue.js
在 Vue.js 中,update 是一个事件监听器,通常用于监听自定义组件或某些 Vue 原生组件(如 <input> 或自定义组件)的更新事件。它并不是 Vue 的核心 API,而是一种约定俗成的命名方式,用于处理组件内部状…...
基于开源库编写MQTT通讯
目录 1. MQTT是什么?2. 开发交互UI3. 服务器核心代码4. 客户端核心代码5. 消息订阅与发布6. 通讯测试7. MQTT与PLC通讯最后. 核心总结 1. MQTT是什么? MQTT(Message Queuing Terlemetry Transport)消息队列遥测协议;是…...
基于springboot+vue美食与健康分享推广网站
目录 项目介绍 图片展示 运行环境 项目介绍 管理员: 个人中心:修改个人信息、修改密码 美食分类管理:增删改查美食分类 商品分类管理:增删改查商品分类 热门美事管理:增删改查热门美食、以及查看评论、预览视频 在线…...
React面试葵花宝典之二
36.Fiber的更新机制 React Fiber 更新机制详解 React Fiber 是 React 16 引入的核心架构重构,旨在解决可中断渲染和优先级调度问题,提升复杂应用的流畅性。其核心思想是将渲染过程拆分为可控制的工作单元,实现更细粒度的任务管理。以下是其…...
计算机毕业设计SpringBoot+Vue.js装饰工程管理系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
从波士顿动力到Figure AI:探寻人工智能驱动的机器人智能化
一、引言 1.1 研究背景与意义 在科技飞速发展的当下,机器人智能化已成为全球科技竞争的关键领域,深刻影响着人类社会的生产与生活方式。从工业制造到日常生活服务,从医疗保健到探索未知领域,机器人正逐步渗透进各个行业,展现出巨大的发展潜力与应用价值。其智能化水平的…...
华为 VRP 系统简介配置SSH,TELNET远程登录
华为 VRP 系统简介&配置TELNET远程登录 1.华为 VRP 系统概述 1.1 什么是 VRP VRP(Versatile Routing Platform 华为数通设备操作系统)是华为公司数据通信产品的通用操作系统平台,从低端到核心的全系列路由器、以太网交换机、业务网关等…...
Token相关设计
文章目录 1. 双Token 机制概述1.1 访问令牌(Access Token)1.2 刷新令牌(Refresh Token) 2. 双Token 认证流程3. Spring Boot 具体实现3.1 生成 Token(使用 JWT)3.2 解析 Token3.3 登录接口(返回…...
【计算机网络入门】初学计算机网络(九)
目录 1.令牌传递协议 2. 局域网&IEEE802 2.1 局域网基本概念和体系结构 3. 以太网&IEEE802.3 3.1 MAC层标准 3.1.1 以太网V2标准 编辑 3.2 单播广播 3.3 冲突域广播域 4. 虚拟局域网VLAN 1.令牌传递协议 先回顾一下令牌环网技术,多个主机形成…...
xss笔记与打靶(更新中)
这个文章好 https://blog.csdn.net/huangyongkang666/article/details/123624164?fromshareblogdetail&sharetypeblogdetail&sharerId123624164&sharereferPC&sharesource2401_88818565&sharefromfrom_link 什么是xss XSS(跨站脚本攻击&…...
Lumoz Chain正式上线:AI 时代的新算力破局者
新的叙事和技术突破永远是推动行业前行的核心动力。当下,AI Agent无疑是最炙手可热的赛道之一。 当加密世界将目光投向AI领域时,大多数项目仍停留在以AI为工具或应用场景的层面,试图通过集成AI模型或优化链上功能来吸引用户。然而࿰…...
sql调优:优化响应时间(优化sql) ; 优化吞吐量
Sql性能调优的目的 1.优化响应时间>>优化sql 经过调优后,执行查询、更新等操作的时候,数据库的反应速度更快,花费的时间更少。 2.优化吞吐量 即“并发”, 就是“同时处理请求”的能力。 优化sql 尽量将多条SQL语句压缩到一句>…...
Linux常见操作命令
Linux系统拥有丰富的命令行工具,通过这些命令可以高效地完成各种系统管理和日常操作任务。以下是一些常见的Linux操作命令: 文件和目录操作: - 创建目录:使用 mkdir 命令,例如 mkdir test 可以创建名为 test 的目录。如…...
2020最新Java面试题
2020最新Java面试题 序Java基础JVMRedis 序 研发了这么多年,每天都在搬砖,斗转星移,从一个被面试者,成为了一个面试者。总感觉自己在面试的时候提出的问题没有一个由浅入深的感觉,总是东一个问题,西一个…...
递归遍历目录 和 普通文件的复制 [Java EE]
递归遍历目录 首先 先列出当前目录所包含的内容 File[] files currentDir.listFiles();if (files null || files.length 0) {// 若是空目录或非法目录, 则直接返回return;} 然后 遍历列出的文件, 分情况两种讨论 for (File f: files) {// 加个日志, 方便查看程序执行情…...
批量设置 Word 样式,如字体信息、段落距离、行距、页边距等信息
在 Word 文档中,我们可以做各种样式的处理。比如设置 Word 文档的字体样式、设置 Word 文档的段落样式以及设置 Word 文档的页面样式。我们通常可以在 Office 中完成这些操作,相信绝大部分场景我们也是这样完成的。但是如果我们手上有 1000 个 Word 文档…...
搜索赋能:大型语言模型的知识增强与智能提升
引言 近年来,大型语言模型(LLM)取得了显著的进展,并在各个领域展现出强大的能力。然而,LLM也存在一些局限性,尤其是在知识库方面。由于训练数据的局限性,LLM无法获取最新的知识,也无…...
