离散傅里叶变换(Discrete Fourier Transform, DFT)及其在图像处理中的应用

news2025/3/4 20:45:02

离散傅里叶变换(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=0N1x[n]ejN2πnk,k=0,1,...,N1

其中:

  • ( 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} ejN2π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=0N1X[k]ejN2πnk

DFT 有什么用?

DFT 的用途非常广泛,尤其是在信号处理和图像处理领域。以下是一些主要应用:

  1. 频谱分析:分析信号的频率成分,例如音频信号中的音调或图像中的纹理。
  2. 滤波:通过修改频域系数实现低通、高通或带通滤波,去除噪声或增强特定特征。
  3. 图像压缩:提取主要频率成分,丢弃次要信息(如 JPEG 中的 DCT)。
  4. 卷积加速:利用快速傅里叶变换(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=0M1y=0N1f(x,y)ej2π(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=0M1v=0N1F(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 center
    return image

# Apply 2D DFT and visualize
def apply_dft(image):
    # Compute 2D DFT
    dft = fft2(image)
    
    # Shift the zero frequency component to the center
    dft_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 DFT
    reconstructed_image = np.abs(ifft2(dft))
    
    return magnitude_spectrum, reconstructed_image

# Main function
if __name__ == "__main__":
    # Load image
    original_image = load_image()
    
    # Apply DFT
    magnitude_spectrum, reconstructed_image = apply_dft(original_image)
    
    # Visualization
    plt.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()
代码说明
  1. load_image:生成一个简单的 256x256 灰度图像,中间有一个白色方块,用于测试。
  2. apply_dft
    • 使用 scipy.fft.fft2 计算二维 DFT。
    • 使用 fftshift 将零频分量移到频谱中心,便于可视化。
    • 计算幅度谱并取对数(np.log(1 + np.abs())),增强显示效果。
    • 使用 ifft2 进行逆变换,重构图像。
  3. 可视化:展示原始图像、频谱图和重构图像。
运行结果

在这里插入图片描述

运行代码后,你会看到:

  • 原始图像:一个带有白色方块的灰度图像。
  • 幅度谱:频谱图显示低频分量集中在中心,高频分量分布在边缘,形成对称图案。
  • 重构图像:通过逆 DFT 恢复的图像,应与原始图像几乎一致。

DFT 与 DCT 的区别

关于DCT,可以参考笔者的另一篇博客:离散余弦变换(Discrete Cosine Transform, DCT):从数学到图像压缩的魔法(Python代码实现)

离散傅里叶变换(DFT)和离散余弦变换(DCT)都是频域变换工具,但在原理和应用上有显著差异:

  1. 数学基础

    • DFT:使用复指数函数 ( e − j θ e^{-j\theta} ejθ),输出是复数(包含幅度和相位),能完整表示信号的频率和相位信息。
    • DCT:仅使用实数的余弦函数,输出是实数,专注于信号的幅度信息,相位信息被简化。
  2. 边界条件

    • DFT:假设信号是周期性的,因此在边界处可能引入伪影(称为“周期性边界效应”)。
    • DCT:假设信号在边界处通过镜像对称扩展,减少边界伪影,特别适合图像处理。
  3. 能量集中

    • DCT:将信号能量更多地集中在低频系数中,这使得它在压缩(如 JPEG)中更高效。
    • DFT:能量分布较均匀,不如 DCT 集中,但在频谱分析中更全面。
  4. 计算复杂度

    • DFT:直接计算复杂度为 ( O ( N 2 ) O(N^2) O(N2)),但通过快速傅里叶变换(FFT)可降至 (O(N \log N)),适用于大尺寸信号。
    • DCT:复杂度也为 ( O ( N 2 ) O(N^2) O(N2)),但在图像压缩中通常处理小块(如 8x8),实际计算量较小。
  5. 应用场景

    • 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 center
    return 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 pattern
                image[i, j] = 255
    return 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 images
    low_freq_image = load_low_freq_image()  # Low frequency dominant
    high_freq_image = load_high_freq_image()  # High frequency dominant
    
    # Apply DFT to both
    low_freq_spectrum, low_freq_reconstructed = apply_dft(low_freq_image)
    high_freq_spectrum, high_freq_reconstructed = apply_dft(high_freq_image)
    
    # Visualization
    plt.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()
运行结果分析

在这里插入图片描述

  1. 低频主导图像(白色方块)

    • 频谱图中心很亮,因为白色方块的均匀区域贡献了大量低频能量。
    • 边缘较暗,高频分量(方块边界)的能量较少。
  2. 高频主导图像(棋盘格图案)

    • 频谱图中亮度分布到远离中心的位置,形成离散的亮点,对应棋盘格的高频周期性变化。
    • 中心(低频)不再是最亮的区域,因为图像缺少大范围平滑结构。

总结

频谱图中“亮”的区域反映的是幅度的大小,而幅度的大小取决于图像的能量分布:

  • 低频分量亮:在你的原始例子中,低频分量因白色方块的平滑区域而具有高幅度,因此中心很亮。
  • 高频分量暗:高频分量的能量通常较分散,且幅度较小,在对数缩放下不突出。
  • 亮的不是高频的误解:高频分量可能在边缘或细节丰富的图像中更显著,但在典型图像中,低频分量往往占主导地位。

如果你对特定图像的频谱有疑问,可以提供图像或描述,我可以帮你进一步分析!

为什么频谱图通常只显示幅度谱 ( ∣ 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))+jIm(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。

这表明相位谱对图像的视觉结构(可识别性)至关重要,而幅度谱更多影响亮度和对比度。

为什么不常关心相位谱?
  1. 人类视觉对相位的敏感度较低
    人眼对图像的整体结构(由相位决定)非常敏感,但对相位的微小扰动不敏感。例如:

    • 如果幅度谱保持不变,轻微改变相位谱,图像仍可识别。
    • 如果相位谱保持不变,改变幅度谱(如滤波),图像的感知变化更明显(如变模糊或变清晰)。
      在压缩或滤波中,丢弃或修改部分相位信息对视觉影响较小,因此相位常被忽略。
  2. 相位信息难以处理和利用

    • 相位谱的周期性和跳跃性使其难以直接操作。例如,滤波时修改相位可能引入伪影(如振铃效应),而修改幅度更直观。
    • 在压缩中(如 JPEG),相位信息被 DCT 简化(DCT 是实数变换,不保留相位),但仍能重构可接受的图像。
  3. 计算和存储成本
    DFT 输出是复数,包含幅度和相位需要双倍存储空间(实部和虚部)。而在许多应用中,只保留幅度谱即可完成任务(如频谱分析或压缩),省去了存储和处理相位的开销。


两者结合不是更好吗?

理论上,幅度谱和相位谱结合确实能完整描述信号,因为:

  • 幅度谱:提供频率分量的强度;
  • 相位谱:提供频率分量的空间排列。

完整的 DFT 重构(使用 ( F ( u , v ) F(u, v) F(u,v)) 的实部和虚部)需要两者结合,否则无法准确恢复原始信号。然而,在实践中:

  • 特定任务不需要完整信息:如频谱分析只看幅度,压缩只用幅度简化计算。
  • 相位的重要性因应用而异:在信号传输或某些逆问题(如相位检索)中,相位至关重要,但在图像可视化或压缩中,幅度往往足够。

总结

  • 为什么只显示幅度谱? 因为它直观反映能量分布,易于可视化和分析,满足大多数应用需求。
  • 为什么不常关心相位谱? 因为相位对视觉感知的影响不如幅度明显,且处理复杂,在压缩或滤波中常被简化。
  • 两者结合更好吗? 是的,在需要完整信号重构或特定任务(如相位检索)时,相位不可或缺。但在图像处理的常见场景中,幅度谱已足够实用。

希望这个解答和代码能让你更清楚地理解幅度谱和相位谱的角色!

后记

2025年3月3日15点58分于上海,在grok3大模型辅助下完成。

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

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

相关文章

记一次误禁用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高清渲染管线的了解&#xff0…

nlp第十节——LLM相关

一、模型蒸馏技术 本质上是从一个大模型蒸馏出小模型,从小模型训练出来的概率分布(如自回归模型预测下一个字的概率分布)分别与大模型预测的概率分布和ground label求loss。与大模型预测的概率分布用KL散度求loss,与ground label用…

Flutter管理项目实战

目录: 1、项目的构建和介绍 1、项目的构建和介绍 登录官网下载flutter的zip压缩包,解压到某个文件夹下即可,里面自带sdk的文件,无需再下载;创建项目时选定flutter的sdk的路径即可创建项目完成。 后续待完善&#xff0…

UniApp 中封装 HTTP 请求与 Token 管理(附Demo)

目录 1. 基本知识2. Demo3. 拓展 1. 基本知识 从实战代码中学习,上述实战代码来源:芋道源码/yudao-mall-uniapp 该代码中,通过自定义 request 函数对 HTTP 请求进行了统一管理,并且结合了 Token 认证机制 请求封装原理&#xff…

基于开源库编写MQTT通讯

目录 1. MQTT是什么?2. 开发交互UI3. 服务器核心代码4. 客户端核心代码5. 消息订阅与发布6. 通讯测试7. MQTT与PLC通讯最后. 核心总结 1. MQTT是什么? MQTT(Message Queuing Terlemetry Transport)消息队列遥测协议;是…

基于springboot+vue美食与健康分享推广网站

目录 项目介绍 图片展示 运行环境 项目介绍 管理员: 个人中心:修改个人信息、修改密码 美食分类管理:增删改查美食分类 商品分类管理:增删改查商品分类 热门美事管理:增删改查热门美食、以及查看评论、预览视频 在线…

计算机毕业设计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 华为数通设备操作系统)是华为公司数据通信产品的通用操作系统平台,从低端到核心的全系列路由器、以太网交换机、业务网关等…

【计算机网络入门】初学计算机网络(九)

目录 1.令牌传递协议 2. 局域网&IEEE802 2.1 局域网基本概念和体系结构 3. 以太网&IEEE802.3 3.1 MAC层标准 3.1.1 以太网V2标准 ​编辑 3.2 单播广播 3.3 冲突域广播域 4. 虚拟局域网VLAN 1.令牌传递协议 先回顾一下令牌环网技术,多个主机形成…

Lumoz Chain正式上线:AI 时代的新算力破局者

新的叙事和技术突破永远是推动行业前行的核心动力。当下,AI Agent无疑是最炙手可热的赛道之一。 当加密世界将目光投向AI领域时,大多数项目仍停留在以AI为工具或应用场景的层面,试图通过集成AI模型或优化链上功能来吸引用户。然而&#xff0…

sql调优:优化响应时间(优化sql) ; 优化吞吐量

Sql性能调优的目的 1.优化响应时间>>优化sql 经过调优后,执行查询、更新等操作的时候,数据库的反应速度更快,花费的时间更少。 2.优化吞吐量 即“并发”, 就是“同时处理请求”的能力。 优化sql 尽量将多条SQL语句压缩到一句>…

2020最新Java面试题

2020最新Java面试题 序Java基础JVMRedis 序 研发了这么多年,每天都在搬砖,斗转星移,从一个被面试者,成为了一个面试者。总感觉自己在面试的时候提出的问题没有一个由浅入深的感觉,总是东一个问题,西一个…

批量设置 Word 样式,如字体信息、段落距离、行距、页边距等信息

在 Word 文档中,我们可以做各种样式的处理。比如设置 Word 文档的字体样式、设置 Word 文档的段落样式以及设置 Word 文档的页面样式。我们通常可以在 Office 中完成这些操作,相信绝大部分场景我们也是这样完成的。但是如果我们手上有 1000 个 Word 文档…