(数字图像处理MATLAB+Python)第四章图像正交变换-第一节:离散傅里叶变换

文章目录

  • 一:一维离散傅里叶变换
    • (1)定义
    • (2)实例
  • 二:一维快速傅里叶变换
    • (1)定义
    • (2)实例
  • 三:二维离散傅里叶变换
    • (1)定义
    • (2)程序
    • (3)性质
      • A:可分性
      • B:线性
      • C:周期性
      • D:几何变换性
  • 四:二维离散傅里叶变换的性质
  • 五:离散傅里叶变换在图像处理中的应用

一:一维离散傅里叶变换

(1)定义

一维离散傅里叶变换(Discrete Fourier Transform,DFT):是一种数学技术,用于将代表离散时间信号的N个复数序列从时域转换到频域。DFT被广泛用于许多应用,如音频和图像处理、通信和控制系统。DFT是傅里叶变换的离散版本,傅里叶变换是一种用于分析频域信号的连续数学技术。DFT将信号表示为不同频率的复数正弦波之和,每个正弦波都有相关的幅度和相位。这些正弦波的频率是均匀的,由信号的采样率和长度决定。其定义式如下,该方程通过对时域中所有样本的贡献进行加总,计算出频率分量 u u u在频域中的复数振幅,并以频率为 u u u的复数指数函数加权

  • f ( x ) f(x) f(x)是N个复数的序列,代表时域中的离散时间信号
  • F ( u ) F(u) F(u)是N个复数的序列,代表频域中的同一信号
  • 复指数函数 e − j 2 π u x N e^{-j\frac{2 \pi u x}{N}} ejN2πux的幅值为1,相位取决于频率 u u u和时间指数 x x x。它代表一个频率为 u u u、相位与时间指数 x x x成正比的正弦波。指数 − j -j j表示该波与参考信号是正交的,参考信号在零点时相位为零

F ( u ) = ∑ x = 0 N − 1 f ( x ) e − j 2 π u x N u = 0 , 1 , 2 , ⋯   , N − 1 F(u)=\sum_{x=0}^{N-1} f(x) e^{-j \frac{2 \pi u x}{N}} \quad u=0,1,2, \cdots, N-1 F(u)=x=0N1f(x)ejN2πuxu=0,1,2,,N1

一维逆向离散傅里叶变换(Inverse Discrete Fourier Transform, IDFT):代表离散时间信号的复数序列从频域转回时域。IDFT是离散傅里叶变换(DFT)的逆运算,它是一种广泛使用的数学技术,用于分析和处理各种应用中的信号,如音频和图像处理、通信和控制系统。IDFT可用于从其频域表示中恢复原始时域信号,频域表示可通过对信号施加DFT获得。换句话说,IDFT允许我们将信号从频域转换回时域,这对进一步的处理或分析很有用。其定义式如下,IDFT定义方程将反离散傅里叶变换(IDFT)表示为不同频率的复指数函数之和

  • F ( u ) F(u) F(u) N N N个复数的序列,代表频域中的信号
  • f ( x ) f(x) f(x)是N个复数的序列,代表时域中的同一信号

f ( x ) = 1 N ∑ u = 0 N − 1 F ( u ) e j 2 π u x N x = 0 , 1 , 2 , ⋯   , N − 1 f(x)=\frac{1}{N} \sum_{u=0}^{N-1} F(u) e^{j \frac{2 \pi u x}{N}} \quad x=0,1,2, \cdots, N-1 f(x)=N1u=0N1F(u)ejN2πuxx=0,1,2,,N1

为了表示方便,我们 W = e − j 2 π N W=e^{-j \frac{2\pi}{N}} W=ejN2π,则DFT和IDFT可以表示为

F ( u ) = ∑ x = 0 N − 1 f ( x ) W u x u = 0 , 1 , 2 , ⋯   , N − 1 f ( x ) = 1 N ∑ u = 0 N − 1 F ( u ) W − u x x = 0 , 1 , 2 , ⋯   , N − 1 \begin{array}{l} F(u)=\sum_{x=0}^{N-1} f(x) W^{u x} \quad u=0,1,2, \cdots, N-1 \\ f(x)=\frac{1}{N} \sum_{u=0}^{N-1} F(u) W^{-u x} \quad x=0,1,2, \cdots, N-1 \end{array} F(u)=x=0N1f(x)Wuxu=0,1,2,,N1f(x)=N1u=0N1F(u)Wuxx=0,1,2,,N1

W W W因子具有周期性和对称性

在这里插入图片描述

(2)实例

对于一个长度为4的数字序列,求其DFT

F ( u ) = ∑ x = 0 3 f ( x ) W u x = f ( 0 ) W 0 + f ( 1 ) W u + f ( 2 ) W 2 u + f ( 3 ) W 3 u F(u)=\sum_{x=0}^{3} f(x) W^{u x}=f(0) W^{0}+f(1) W^{u}+f(2) W^{2 u}+f(3) W^{3 u} F(u)=x=03f(x)Wux=f(0)W0+f(1)Wu+f(2)W2u+f(3)W3u

[ F ( 0 ) F ( 1 ) F ( 2 ) F ( 3 ) ] = [ W 0 W 0 W 0 W 0 W 0 W 1 W 2 W 3 W 0 W 2 W 4 W 6 W 0 W 3 W 6 W 9 ] [ f ( 0 ) f ( 1 ) f ( 2 ) f ( 3 ) ] \left[\begin{array}{l} F(0) \\ F(1) \\ F(2) \\ F(\mathbf{3}) \end{array}\right]=\left[\begin{array}{llll} W^{0} & W^{0} & W^{0} & W^{0} \\ W^{0} & W^{1} & W^{2} & W^{3} \\ W^{0} & W^{2} & W^{4} & W^{6} \\ W^{0} & W^{3} & W^{6} & W^{9} \end{array}\right]\left[\begin{array}{l} f(0) \\ f(1) \\ f(2) \\ f(3) \end{array}\right] F(0)F(1)F(2)F(3) = W0W0W0W0W0W1W2W3W0W2W4W6W0W3W6W9 f(0)f(1)f(2)f(3)

根据 W W W的对称性和周期性有

  • 对称性
    • W 2 = − W 0 W^{2}=-W^{0} W2=W0
    • W 3 = − W 1 W^{3}=-W^{1} W3=W1
  • 周期性
    • W 4 = W 0 W^{4}=W^{0} W4=W0
    • W 6 = W 2 W^{6}=W^{2} W6=W2
    • W 9 = W 1 W^{9}=W^{1} W9=W1

于是

( F ( 0 ) F ( 1 ) F ( 2 ) F ( 3 ) ) = ( W 0 W 0 W 0 W 0 W 0 W 1 − W 0 − W 1 W 0 − W 0 W 0 − W 0 W 0 − W 1 − W 0 W 1 ) ( f ( 0 ) f ( 1 ) f ( 2 ) f ( 3 ) ) = ( 1 1 1 1 1 W 1 − 1 − W 1 1 − 1 1 − 1 1 − W 1 − 1 W 1 ) ( f ( 0 ) f ( 1 ) f ( 2 ) f ( 3 ) ) = ( f ( 0 ) + f ( 2 ) + [ f ( 1 ) + f ( 3 ) ] f ( 0 ) − f ( 2 ) + [ f ( 1 ) − f ( 3 ) ] W 1 f ( 0 ) + f ( 2 ) − [ f ( 1 ) + f ( 3 ) ] f ( 0 ) − f ( 2 ) − [ f ( 1 ) − f ( 3 ) ] W 1 ) \left(\begin{array}{c} F(0) \\ F(1) \\ F(2) \\ F(3) \end{array}\right)=\left(\begin{array}{cccc} W^{0} & W^{0} & W^{0} & W^{0} \\ W^{0} & W^{1} & -W^{0} & -W^{1} \\ W^{0} & -W^{0} & W^{0} & -W^{0} \\ W^{0} & -W^{1} & -W^{0} & W^{1} \end{array}\right)\left(\begin{array}{c} f(0) \\ f(1) \\ f(2) \\ f(3) \end{array}\right)=\left(\begin{array}{cccc} 1 & 1 & 1 & 1 \\ 1 & W^{1} & -1 & -W^{1} \\ 1 & -1 & 1 & -1 \\ 1 & -W^{1} & -1 & W^{1} \end{array}\right)\left(\begin{array}{c} f(0) \\ f(1) \\ f(2) \\ f(3) \end{array}\right)=\left(\begin{array}{c} f(0)+f(2)+[f(1)+f(3)] \\ f(0)-f(2)+[f(1)-f(3)] W^{1} \\ f(0)+f(2)-[f(1)+f(3)] \\ f(0)-f(2)-[f(1)-f(3)] W^{1} \end{array}\right) F(0)F(1)F(2)F(3) = W0W0W0W0W0W1W0W1W0W0W0W0W0W1W0W1 f(0)f(1)f(2)f(3) = 11111W11W111111W11W1 f(0)f(1)f(2)f(3) = f(0)+f(2)+[f(1)+f(3)]f(0)f(2)+[f(1)f(3)]W1f(0)+f(2)[f(1)+f(3)]f(0)f(2)[f(1)f(3)]W1

二:一维快速傅里叶变换

(1)定义

一维快速傅里叶变化(Fast Fourier Transform, FFT):FFT是快速傅里叶变换的缩写,它是计算 N N N个复数序列的离散傅里叶变换(DFT)的一种有效算法。FFT算法将DFT的计算复杂度从 O ( N 2 ) O(N^2) O(N2)降低到 O ( N l o g N ) O(N log N) O(NlogN),使其对实时信号处理应用非常实用。FFT的工作原理是利用DFT计算中使用的复数指数函数的对称性和周期性特性。通过巧妙地重新安排计算,FFT算法将DFT计算分成更小的子问题,这些子问题可以以分而治之的方式被递归解决。具体来说,将原函数分为奇数项和偶数项,通过不断的一个奇数一个偶数的相加(减),最终得到需要的结果,因此FFT是将复杂的运算变成两个数相加(减)的简单运算的重复

在这里插入图片描述

在这里插入图片描述

(2)实例

对于一个长度为8的数字序列,利用FFT算法求其DFT

F ( u ) = ∑ x = 0 7 f ( x ) W u x = f ( 0 ) W 0 + f ( 1 ) W u + f ( 2 ) W 2 u + f ( 3 ) W 3 u + f ( 4 ) W 4 u + f ( 5 ) W 5 u + f ( 6 ) W 6 u + f ( 7 ) W 7 u F(u)=\sum_{x=0}^{7} f(x) W^{u x}=f(0) W^{0}+f(1) W^{u}+f(2) W^{2 u}+f(3) W^{3 u}+f(4) W^{4u}+f(5) W^{5u}+f(6) W^{6 u}+f(7) W^{7 u} F(u)=x=07f(x)Wux=f(0)W0+f(1)Wu+f(2)W2u+f(3)W3u+f(4)W4u+f(5)W5u+f(6)W6u+f(7)W7u

在这里插入图片描述

在这里插入图片描述

三:二维离散傅里叶变换

(1)定义

二维傅里叶变换(two-dimensional Fourier transform):是一种数学运算,将一个二维函数从时域转换到频域。在二维傅里叶变换中,输入是一个二维函数 f ( x , y ) f(x, y) f(x,y),输出是一个描述输入函数的频率内容的函数 F ( u , v ) F(u, v) F(u,v)。输出 F ( u , v ) F(u, v) F(u,v)是一个复值函数,其中 F ( u , v ) F(u, v) F(u,v)的幅度代表 ( u , v ) (u, v) (u,v)处频率成分的振幅, F ( u , v ) F(u, v) F(u,v)的相位代表该成分的相移

在这里插入图片描述

如下,频域中的复值函数 F ( u , v ) F(u,v) F(u,v)可以用每个频率分量 ( u , v ) (u,v) (u,v)的振幅 ∣ F ( u , v ) ∣ |F(u,v)| F(u,v)和相位角 ϕ ( u , v ) \phi(u,v) ϕ(u,v)表示。 F ( u , v ) F(u,v) F(u,v)的实部和虚部 R ( u , v ) R(u,v) R(u,v) I ( u , v ) I(u,v) I(u,v)可用于计算每个频率分量 F ( u , v ) F(u,v) F(u,v)的振幅和相位角

F ( u , v ) = R ( u , v ) + j I ( u , v ) = ∣ F ( u , v ) ∣ e j φ ( u , v ) F(u, v)=R(u, v)+j I(u, v)=|F(u, v)| e^{j \varphi(u, v)} F(u,v)=R(u,v)+jI(u,v)=F(u,v)ejφ(u,v)

  • 傅里叶谱 ∣ F ( u , v ) ∣ = R 2 ( u , v ) + I 2 ( u , v ) |F(u, v)|=\sqrt{R^{2}(u, v)+I^{2}(u, v)} F(u,v)=R2(u,v)+I2(u,v)
  • 相位谱 φ ( u , v ) = arctan ⁡ I ( u , v ) R ( u , v ) \varphi(u, v)=\arctan \frac{I(u, v)}{R(u, v)} φ(u,v)=arctanR(u,v)I(u,v)
  • 功率谱 E ( u , v ) = ∣ F ( u , v ) ∣ 2 = R 2 ( u , v ) + I 2 ( u , v ) E(u, v)=|F(u, v)|^{2}=R^{2}(u, v)+I^{2}(u, v) E(u,v)=F(u,v)2=R2(u,v)+I2(u,v)

(2)程序

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

  • fft函数:计算一个向量或一个数组的一维快速傅里叶变换(FFT)
  • ifft函数:计算一个向量或一个数组的一维快速傅里叶逆变变换(IFFT)
  • fft2函数:计算一个矩阵的二维傅里叶变换
  • ifft2函数:计算一个矩阵的二维傅里叶逆变换
  • fftshift函数:将零频分量移到频谱中心。换句话说,它重新排列信号或图像的频域值,使零频分量位于频谱的中心。这对于可视化信号或图像的频率内容是很有用的。
  • ifftshift函数:将零频率分量移回频谱的原点。这对于将移位后的频域信号或图像转换回其原始形式很有用

实现如下效果:频谱搬移图中间部分为低频部分,越靠外边频率越高。图像中的能量主要集中在低频区,高频能量很少或为零

在这里插入图片描述

这段MATLAB代码读入图像 “desert.jpg”,将其转换为灰度,使用fft2函数计算其二维离散傅里叶变换(DFT),并计算所得DFT的绝对值。然后,它使用最小-最大归一化将绝对DFT的值缩放到[0, 100]的范围内,并将这个缩放的DFT保存为ADFTI1。接下来,代码使用fftshift函数将DFT的零频分量移到频谱的中心。得到的移位后的DFT被保存为ADFTI2。最后,代码使用subplotimshow来显示原始图像、其未缩放的DFT和其移位的DFT在1x3网格的子图中并排排列。总之,这段代码对输入图像进行了基本的频率分析,并将DFT和移位的DFT可视化

Image=imread('desert.jpg');%读取图像
grayI=rgb2gray(Image);%将彩色图像灰度化
DFTI1=fft2(grayI); % 二维离散傅里叶变换
ADFTI1=abs(DFTI1); % 获得其绝对值
top=max(ADFTI1(:));
bottom=min(ADFTI1(:));
ADFTI1=(ADFTI1-bottom)/(top-bottom)*100; % 使用max-min归一化,缩放至[0,100]
ADFTI2=fftshift(ADFTI1);%计算傅里叶变换并移位
subplot(131),imshow(Image),title('原图');%显示原图像
subplot(132),imshow(ADFTI1),title('原频谱图');%显示傅里叶变换频谱图
subplot(133),imshow(ADFTI2),title('移位频谱图');%显示傅里叶变换频谱图


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

  • cv2.dft函数:计算单通道(灰度)或多通道阵列的一维或二维离散傅里叶变换。这个函数支持正向和反向变换
  • cv2.idft函数:计算单通道或多通道数组的反离散傅里叶变换
  • cv2.fftshift函数:将一维或二维阵列的零频率分量移到频谱中心
  • cv2.ifftshift函数:将一维或二维阵列的零频率分量移回频谱的原点
# Load the image
img = cv2.imread('desert.jpg')

# Convert to grayscale
gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

# Compute the 2D Discrete Fourier Transform
dft_img = np.fft.fft2(gray_img)

# Get the absolute values
abs_dft_img = np.abs(dft_img)

# Normalize using max-min normalization and scale to [0, 100]
top = np.max(abs_dft_img)
bottom = np.min(abs_dft_img)
abs_dft_img = ((abs_dft_img - bottom) / (top - bottom)) * 100

# Shift the Fourier Transform
shifted_dft_img = np.fft.fftshift(abs_dft_img)

# Plot the results using Matplotlib
fig, axs = plt.subplots(1, 3, figsize=(10, 5))
axs[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
axs[0].set_title('Original Image')
axs[1].imshow(abs_dft_img, cmap='gray')
axs[1].set_title('Original Spectrum')
axs[2].imshow(shifted_dft_img, cmap='gray')
axs[2].set_title('Shifted Spectrum')
plt.show()

(3)性质

A:可分性

可分性:两个函数在空间域的乘积的傅里叶变换等于它们在频率域的傅里叶变换的卷积。在数学上,如果 f ( x , y ) f(x,y) f(x,y) g ( x , y ) g(x,y) g(x,y)是空间域中的两个函数,那么它们的乘积为

h ( x , y ) = f ( x , y ) ∗ g ( x , y ) h(x,y) = f(x,y) * g(x,y) h(x,y)=f(x,y)g(x,y)

h ( x , y ) h(x,y) h(x,y)的傅里叶变换是

H ( u , v ) = F { h ( x , y ) } = F { f ( x , y ) ∗ g ( x , y ) } H(u,v) = F\{h(x,y)\} = F\{f(x,y) * g(x,y)\} H(u,v)=F{h(x,y)}=F{f(x,y)g(x,y)}

利用傅里叶变换的卷积定理,我们可以将 H ( u , v ) H(u,v) H(u,v)表示为

H ( u , v ) = F { f ( x , y ) } ∗ F { g ( x , y ) } H(u,v) = F\{f(x,y)\} \ast F\{g(x,y)\} H(u,v)=F{f(x,y)}F{g(x,y)}

因此,两个函数之积的傅里叶变换等于它们的傅里叶变换的卷积。这一属性在图像处理和计算机视觉中很有用,因为它允许我们在空间域中对图像进行复杂的操作,把它们转换到频域并在那里应用更简单的操作。例如,我们可以利用这一特性来实现线性滤波器,如平滑或锐化滤波器,这在频域中更容易定义

B:线性

线性:二维傅里叶变换的线性属性指出,函数的线性组合的傅里叶变换等于它们的傅里叶变换的同一线性组合。在数学上,如果 f 1 ( x , y ) f1(x,y) f1(x,y) f 2 ( x , y ) f2(x,y) f2(x,y)是空间域的两个函数, a a a b b b是任意两个常数,那么我们有

F { a ∗ f 1 ( x , y ) + b ∗ f 2 ( x , y ) } = a ∗ F { f 1 ( x , y ) } + b ∗ F { f 2 ( x , y ) } F\{a * f1(x,y) + b * f2(x,y)\} = a * F\{f1(x,y)\} + b * F\{f2(x,y)\} F{af1(x,y)+bf2(x,y)}=aF{f1(x,y)}+bF{f2(x,y)}

这一特性使我们可以很容易地将多个函数结合起来,并将傅里叶变换应用到所产生的函数上,而不是对每个函数进行单独的傅里叶变换,然后再将结果结合起来

C:周期性

周期性:二维傅里叶变换的周期性属性指出,一个周期性函数的傅里叶变换也是一个周期性函数,其周期相同。在数学上,如果 f ( x , y ) f(x,y) f(x,y)是一个周期为 T T T的周期性函数,那么它的傅里叶变换 F ( u , v ) F(u,v) F(u,v)也是周期为 1 T \frac{1}{T} T1的。在处理具有重复模式或结构的图像时,这一属性特别有用,因为它允许我们轻松分析和处理这些模式的频率成分

D:几何变换性

几何变换性

四:二维离散傅里叶变换的性质

五:离散傅里叶变换在图像处理中的应用

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

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

相关文章

Python入门教程+项目实战-7.4节: 程序实战-计算次大值

目录 7.2.1 计算四个中的次大值 7.2.2 使用循环计算次小值 7.2.3 系统学习python 7.2.1 计算四个中的次大值 假设有四个整型变量,该怎么计算四个中的次大值? 初学者解出这道题并不困难,但是将代码写得简洁优雅却是一个不小的挑战。 直接通…

aspnet016计算机组成原理精品课程shfw程序

2网站项目范围 计算机组成原理精品课程系统从两种用户角度进行功能划分。 1、学生部分: 1.1:新闻查看; 1.2:课程公告查看; 1.3:用户注册; 1.4:在线留言; 1.5&#xf…

Spring Boot 配置文件配置自动提示 Configuration Processor

效果 在使用Idea等开发工具时,配置文件中输入前缀就有对应的补全提示,使开发者可以很方便配置相应属性,效果截图如下: 元数据说明 这些提示来自于 spring 自动配置规范中的源数据文件 spring-configuration-metadata.json 和 ad…

百度储瑞松谈智能驾驶:极个别车厂才能做全栈自研

百度集团副总裁、智能汽车事业部总经理储瑞松在百人会论坛表示,汽车智能化系统不同于车企所熟悉的以金属件为主的车辆其他部分的系统,是一个以硬件为载体、由算法软件驱动的大规模动态系统,它的复杂性比起以金属件为主的系统是指数级增长的。…

【环境与工具】IDE配置——vscode配置

配置vscode的 Python , C 的编译环境 2. Python 2.1 Python解释器 2.1.1 安装python环境 2.1.2 创建vscode-python文件夹 裸配置 如图,与在命令行运行无区别 2.1.2 安装vscode-python插件 2.1.3 code插件运行.py 添加配置文件 program 设置启动文件 "progr…

多线程进阶学习12------ConcurrentHashMap详解

JDK 7 HashMap 并发死链 注意:要在 JDK 7 下运行,否则扩容机制和 hash 的计算方法都变了 import java.io.*; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.StringTokenizer; import java.util.concurrent.*; import java.…

AR”将会成为“更加日常化的移动设备应用的一部分”吗

目录 1:AR是什么 2:AR给人类带来的贡献 3:人们在生活中可以遇到许多 AR 技术应用 4:AR 技术的未来发展的趋势: 大学主攻VR,从大一就对VR的知识,设备,已经所涉及的知识伴随我的整…

AI工具(ChatGPT)常用指令,持续更新...

要国内使用AI工具,关注:码视野,回复:1002使用VensiGPT时,当你给的指令越精准,它回复就会越完美,例如,如果你要请它协助撰写文案,如果没有给与指定情景与目标,…

作为大学生,你还不会搭建chatGPT微应用吗?

目录 引言ChatGPT是什么?背景:ChatGPT敢为人先,打破全球僵局示例演示:基于ChatGPT微应用实现的条件及步骤(1)整体框架(2)搭建前的准备工作(3)实际搭建步骤&a…

文件或目录损坏怎么办?4个实用方法!

案例:文件或目录损坏怎么恢复? 【有谁知道为什么文件会突然无法打开且显示损坏了呀?我有一个很重要的文件无法打开了,之前从来没有遇到过这样的问题,这让我很无措,请大家帮我想想办法吧!】 我…

ThreeJS-聚光等衰减(二十一)

聚光灯可以联系到现实中的手电筒 衰减分为:距离衰减和边缘衰减 .decay : Float(控制的是灯光自身的亮度) The amount the light dims along the distance of the light. Default is 2. In context of physically-correct rendering the defa…

pip lanms-neo报错问题

pip lanms-neo报错问题 安装Polygon3的时候,就遇到需要Microsoft Visual C 14.0的问题,以为通过本地whl安装,就能避免。结果,lanms-neo这个库,网上还不好找whl文件,找到的都是csdn里面的付费下载&#xff…

【Java8最优解】P1478 陶陶摘苹果(升级版)

陶陶摘苹果(升级版) 题目描述 又是一年秋季时,陶陶家的苹果树结了 nnn 个果子。陶陶又跑去摘苹果,这次他有一个 aaa 公分的椅子。当他手够不着时,他会站到椅子上再试试。 这次与 NOIp2005 普及组第一题不同的是&…

HotSpot笔记——共享库操作

共享库操作前言MakefileHotspot的Makefile如何定义需要共享库使用编译选项使用链接器选项dlopendlsym前言 jvm启动时,libjli.so、libjvm.so、libjava.so这些共享库的加载操作,都是c语言的,我们记录一下这些操作函数。 Makefile 以下是一个…

python学习笔记2

使用链接: Python 3 basics - GeeksforGeeks 对应的英文是: 这里联想一下Redis的数据类型: string list set hash zset 列表 有一个细节,可以看到下面的输出里面也带了中括号: 字典 第一行定义的时候是中括号,因为…

文章八:YOLOv5车牌识别系统的Web应用与API开发

在本篇文章中,我们将探讨如何使用YOLOv5车牌识别系统开发一个Web应用,以及如何创建一个车牌识别API供其他开发者使用。我们将介绍Flask框架的基本概念,并实现一个简单的车牌识别Web应用和API。 车牌识别视频Flask框架介绍 Flask是一个轻量级的…

vue-cropper 拖动图片和截图框

现象 开发遇到vue--cropper不能拖动图片和截图框 解决方法 can-move-box设置为true,表示可以拖动截图框 can-move设置为true,表示可以拖动图片 *注意: 我外层套了一个el-col, el-col的宽高一定要大于截图框的宽高,否则移动不了…

网络安全工程师做什么?

​ 网络安全很复杂。数字化转型、远程工作和不断变化的威胁形势需要不同的工具和不同的技能组合。 系统必须到位以保护端点、身份和无边界网络边界。负责处理这种复杂安全基础设施的工作角色是网络安全工程师。 简而言之,网络安全工程师是负责设计和实施组织安全系…

ELK、ELFK企业级日志分析系统

目录 一、ELK简介 1、什么是ELK 2、ELK工作原理及过程​编辑 3、ELK相关名词介绍 ①Elasticsearch介绍 ②Logstash介绍 ③Kibana介绍 ④Fluentd介绍 ⑤Filebeat介绍 二、ELK部署 1、实验环境 2、安装elasticsearch 3、安装logstash ​编辑4、安装kiabana ​编辑…

网站是怎么屏蔽脏话的呢:简单学会SpringBoot项目敏感词、违规词过滤方案

一个社区最重要的就是交流氛围与审查违规,而这两者都少不了对于敏感词进行过滤的自动维护措施。基于这样的措施,我们才能基本保证用户在使用社区的过程中,不至于被敏感违规词汇包围,才能够正常的进行发布帖子和评论,享…