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

图像处理-Ch5-图像复原与重建

Ch5 图像复原

文章目录

  • Ch5 图像复原
    • 图像退化与复原(Image Degradation and Restoration)
    • 噪声模型(Noise Models)
      • i.i.d.空间随机噪声(Generating Spatial Random Noise with a Specified Distribution)
      • 周期噪声(Periodic Noise)
      • 估计噪声参数(Estimating Noise Parameters)
    • 在仅有噪声情况下图像复原-空域滤波
      • 均值滤波器(Mean Filters)
        • 统计排序滤波器(Order-statistics Filters)
    • 用频域滤波器消除周期噪声(Periodic Noise Reduction by Frequency Domain Filtering)
      • 带阻滤波器(Bandreject Filters)
      • 带通滤波器(Bandpass Filters)
      • 陷波滤波器(Notch filters)
    • 最佳陷波滤波算法(Optimum Notch Filtering)
    • 估计退化函数(Estimating the Degradation Function)
      • 运动引起的图像模糊(Image Blur due to Motion)
    • 直接逆滤波(Direct Inverse Filtering)
    • 维纳滤波器(Wiener Filtering)
    • 约束最小二乘图像复原算法(Constrained Least Squares Filtering)

图像退化与复原(Image Degradation and Restoration)

图像复原目的:以某种预定义的方式改善给定图像。

Q: 图像增强 v.s. 图像复原?

A: 图像增强是一个主观的过程:自行选定不同的工具,比如低通、高通滤波,使得图像主观上看上去比较美观(因个人审美不同而不同)。

而图像复原的大部分过程是客观的。原先是什么样子、恢复原来的样子。

image-20241222220207927
g ( x , y ) = H [ f ( x , y ) ] + η ( x , y ) g ( x , y ) = h ( x , y ) ∗ f ( x , y ) + η ( x , y ) G ( x , y ) = H ( u , v ) F ( u , v ) + N ( u , v ) g(x,y)=H[f(x,y)]+\eta(x,y)\\ g(x,y)=h(x,y)*f(x,y)+\eta(x,y)\\ G(x,y)=H(u,v)F(u,v)+N(u,v) g(x,y)=H[f(x,y)]+η(x,y)g(x,y)=h(x,y)f(x,y)+η(x,y)G(x,y)=H(u,v)F(u,v)+N(u,v)

噪声模型(Noise Models)

假设 H ( u , v ) = 1 H(u,v)=1 H(u,v)=1: g ( x , y ) = f ( x , y ) + η ( x , y ) g(x,y)=f(x,y)+\eta(x,y) g(x,y)=f(x,y)+η(x,y)

i.i.d.空间随机噪声(Generating Spatial Random Noise with a Specified Distribution)

如果 w w w是在区间 ( 0 , 1 ) (0,1) (0,1)上均匀分布的随机变量,那么可以通过求解方程 z = F z − 1 ( w ) z = F_z^{-1}(w) z=Fz1(w)得到一个具有特定累积分布函数(CDF) F z F_z Fz的随机变量 z z z
z = F z − 1 ( w ) z = F_z^{-1}(w) z=Fz1(w)

例:目标是生成具有瑞利(Rayleigh)累积分布函数(CDF)的随机数 z z z

瑞利分布的累积分布函数(CDF)为:
F z ( z ) = { 1 − e − ( z − a ) 2 / b if  z ≥ a 0 if  z < a F_z(z) = \begin{cases} 1 - e^{-(z - a)^2/b} & \text{if } z \geq a \\ 0 & \text{if } z < a \end{cases} Fz(z)={1e(za)2/b0if zaif z<a
通过求解方程 1 − e − ( z − a ) 2 / b = w 1 - e^{-(z - a)^2/b} = w 1e(za)2/b=w,可以得到 z z z的值:
z = a + − b ln ⁡ ( 1 − w ) z = a + \sqrt{-b \ln(1 - w)} z=a+bln(1w)

image-20241222225646091

image-20241222225734753

周期噪声(Periodic Noise)

在图像中,周期噪声是在图像获取时从电力或机电干扰中产生的。这是唯一一种空间依赖型噪声

周期噪声信号(Periodic Noise Signal)
r ( x , y ) = A sin ⁡ ( 2 π u 0 ( x + B x ) / M + 2 π v 0 ( y + B y ) / N ) r(x, y) = A \sin(2\pi u_0(x + B_x)/M + 2\pi v_0(y + B_y)/N) r(x,y)=Asin(2πu0(x+Bx)/M+2πv0(y+By)/N)
对于傅里叶变换:(实际上无法推出这个,但是大概是这个形式)
R ( u , v ) = A j 2 [ exp ⁡ ( j 2 π u 0 B x M ) δ ( u + u 0 , v + v 0 ) − exp ⁡ ( j 2 π v 0 B y N ) δ ( u − u 0 , v − v 0 ) ] R(u, v) = \frac{A}{j2} \left[\exp\left(\frac{j2\pi u_0 B_x}{M}\right) \delta(u + u_0, v + v_0) - \exp\left(\frac{j2\pi v_0 B_y}{N}\right) \delta(u - u_0, v - v_0)\right] R(u,v)=j2A[exp(Mj2πu0Bx)δ(u+u0,v+v0)exp(Nj2πv0By)δ(uu0,vv0)]

估计噪声参数(Estimating Noise Parameters)

分别是高斯、瑞丽、Erlanga噪声

假如没有被噪声污染,那么图中有三个灰度级,直方图中应该有三根线。但是有噪声,现在每根线向两边扩展。

image-20241222230729794

图l对应椒盐噪声的直方图:可以看见一共有4条线(两边分别有两条),椒盐噪声产生黑白、黑色估计和原有的背景色重合,于是直方图中最左的线特别的长(大概的解释)。

估计噪声参数:

  1. 周期噪声:对图像的傅里叶谱审视,可以直接发现:比如在除中心的亮点之外,还有其他的亮点。

    image-20241222231414852

  2. 具有先验知识:事先知道这种图像中会存在噪声、会出现在哪个频段。

  3. 在平坦的图像区域,噪声会暴露出来:比如说一块纯色的地板,应该灰度级是差不多的。

Q: 怎么做?

  1. 最简单的方法是利用图像中的采样数据来估计噪声的均值和方差。
  2. 通过直方图的形状来辨识最接近的概率密度函数(PDF)的匹配。
  3. 假如形状类似高斯,那么高斯只需要均值与方差。

统计矩与中心矩:

统计矩:
μ n = ∑ i = 0 L − 1 ( z i − m ) n p ( z i ) where m = ∑ i = 0 L − 1 z i p ( z i ) \mu_n = \sum_{i = 0}^{L - 1} (z_i - m)^n p(z_i) \quad \text{where} \quad m = \sum_{i = 0}^{L - 1} z_i p(z_i) μn=i=0L1(zim)np(zi)wherem=i=0L1zip(zi)
中心距:

n对应中心距
0 μ 0 = ∑ i = 0 L − 1 ( z i − m ) 0 p ( z i ) = 1 \mu_0 = \sum_{i = 0}^{L - 1} (z_i - m)^0 p(z_i) = 1 μ0=i=0L1(zim)0p(zi)=1
1 μ 1 = ∑ i = 0 L − 1 ( z i − m ) p ( z i ) = ∑ i = 0 L − 1 z i p ( z i ) − m ∑ i = 0 L − 1 p ( z i ) = 0 \mu_1 = \sum_{i = 0}^{L - 1} (z_i - m) p(z_i) = \sum_{i = 0}^{L - 1} z_i p(z_i) - m \sum_{i = 0}^{L - 1} p(z_i) = 0 μ1=i=0L1(zim)p(zi)=i=0L1zip(zi)mi=0L1p(zi)=0
2 μ 2 = ∑ i = 0 L − 1 ( z i − m ) 2 p ( z i ) = Var ( z ) \mu_2 = \sum_{i = 0}^{L - 1} (z_i - m)^2 p(z_i) = \text{Var}(z) μ2=i=0L1(zim)2p(zi)=Var(z)

在仅有噪声情况下图像复原-空域滤波

如果只有噪声, 图像退化模型可以表示为:
g ( x , y ) = f ( x , y ) + η ( x , y ) G ( u , v ) = F ( u , v ) + N ( u , v ) g(x,y)=f(x,y)+\eta(x,y)\\ G(u,v)=F(u,v)+N(u,v) g(x,y)=f(x,y)+η(x,y)G(u,v)=F(u,v)+N(u,v)

均值滤波器(Mean Filters)

均值相当于:给出一组数,经过一系列运算,得到一个新的值。这个值,比这组数中最小值大,比最大值小,那么调和均值滤波器、反调和均值滤波器就算均值滤波器。

滤波器公式
算术平均滤波器 f ^ ( x , y ) = 1 m n ∑ ( s , t ) ∈ S x y g ( s , t ) \hat{f}(x,y) = \frac{1}{mn} \sum_{(s,t) \in S_{xy}} g(s,t) f^(x,y)=mn1(s,t)Sxyg(s,t)
几何均值滤波器 f ^ ( x , y ) = [ ∏ ( s , t ) ∈ S x y g ( s , t ) ] 1 m n \hat{f}(x,y) = \left[ \prod_{(s,t) \in S_{xy}} g(s,t) \right]^{\frac{1}{mn}} f^(x,y)=[(s,t)Sxyg(s,t)]mn1
调和均值滤波器 f ^ ( x , y ) = m n ∑ ( s , t ) ∈ S x y 1 g ( s , t ) \hat{f}(x,y) = \frac{mn}{\sum_{(s,t) \in S_{xy}} \frac{1}{g(s,t)}} f^(x,y)=(s,t)Sxyg(s,t)1mn
反调和均值滤波器 f ^ ( x , y ) = ∑ ( s , t ) ∈ S x y g ( s , t ) Q + 1 ∑ ( s , t ) ∈ S x y g ( s , t ) Q \hat{f}(x,y) = \frac{\sum_{(s,t) \in S_{xy}} g(s,t)^{Q + 1}}{\sum_{(s,t) \in S_{xy}} g(s,t)^{Q}} f^(x,y)=(s,t)Sxyg(s,t)Q(s,t)Sxyg(s,t)Q+1

调和均值滤波器能够很好地去除盐噪声,但不能去除椒噪声。对于高斯噪声很好。

反调和均值滤波器非常适合消除椒盐噪声。当 Q Q Q为正值时,该滤波器消除胡椒噪声。当 Q Q Q为负值时,它消除盐噪声。它不能同时消除两种噪声。

  • 当Q=0时:算术均值是反调和均值的一个特例。
    y ^ ( x , y ) = ∑ ( s , t ) ∈ S x y g ( s , t ) ∑ ( s , t ) ∈ S x y 1 = 1 m n ∑ ( s , t ) ∈ S x y g ( s , t ) \hat y(x,y)= \frac{\sum_{(s,t) \in S_{xy}} g(s,t)}{\sum_{(s,t) \in S_{xy}}1}=\frac{1}{mn}\sum_{(s,t) \in S_{xy}}g(s,t) y^(x,y)=(s,t)Sxy1(s,t)Sxyg(s,t)=mn1(s,t)Sxyg(s,t)

  • 当Q=-1时:是调和均值滤波器。
    f ^ ( x , y ) = ∑ ( s , t ) ∈ S x y 1 ∑ ( s , t ) ∈ S x y g ( s , t ) = m n ∑ ( s , t ) ∈ S x y g ( s , t ) \hat f(x,y)=\frac{\sum_{(s,t) \in S_{xy}1} }{\sum_{(s,t) \in S_{xy}}g(s,t)} =\frac{mn}{\sum_{(s,t) \in S_{xy}}g(s,t)} f^(x,y)=(s,t)Sxyg(s,t)(s,t)Sxy1=(s,t)Sxyg(s,t)mn

统计排序滤波器(Order-statistics Filters)

椒盐噪声反复使用中值滤波器,总能完全去除;同时边缘信息也会丢失。

滤波器公式
中值滤波器 f ^ ( x , y ) = median ( s , t ) ∈ S x y g ( s , t ) \hat{f}(x,y) = \text{median}_{(s,t) \in S_{xy}} g(s,t) f^(x,y)=median(s,t)Sxyg(s,t)
中点滤波器 f ^ ( x , y ) = 1 2 [ max ⁡ ( s , t ) ∈ S x y g ( s , t ) + min ⁡ ( s , t ) ∈ S x y g ( s , t ) ] \hat{f}(x,y) = \frac{1}{2} \left[ \max_{(s,t) \in S_{xy}} g(s,t) + \min_{(s,t) \in S_{xy}} g(s,t) \right] f^(x,y)=21[max(s,t)Sxyg(s,t)+min(s,t)Sxyg(s,t)]
最大滤波器 f ^ ( x , y ) = max ⁡ ( s , t ) ∈ S x y g ( s , t ) \hat{f}(x,y) = \max_{(s,t) \in S_{xy}} g(s,t) f^(x,y)=max(s,t)Sxyg(s,t)
最小滤波器 f ^ ( x , y ) = min ⁡ ( s , t ) ∈ S x y g ( s , t ) \hat{f}(x,y) = \min_{(s,t) \in S_{xy}} g(s,t) f^(x,y)=min(s,t)Sxyg(s,t)
alpha均值滤波器 f ^ ( x , y ) = 1 m n − d ∑ ( s , t ) ∈ S x y g r ( s , t ) \hat{f}(x,y) = \frac{1}{mn - d} \sum_{(s,t) \in S_{xy}} g_{r}(s,t) f^(x,y)=mnd1(s,t)Sxygr(s,t)

用频域滤波器消除周期噪声(Periodic Noise Reduction by Frequency Domain Filtering)

关于以下三种滤波器的奇妙比喻:来自王伟强老师。

入冬时存储的土豆,在开春时会发芽。

  • 带阻滤波器:连皮肉带芽一起削掉。
  • 带通滤波器:与带阻合为1体。
  • 陷波滤波器:只把有芽的部分去除。

带阻滤波器(Bandreject Filters)

image-20241223093954276

idealGaussianButterworth
H ( u , v ) = { 1 if  D ( u , v ) < D 0 − W 2 0 if  D 0 − W 2 ≤ D ( u , v ) ≤ D 0 + W 2 1 if  D ( u , v ) > D 0 + W 2 H(u, v) = \begin{cases} 1 & \text{if } D(u, v) < D_0 - \frac{W}{2} \\ 0 & \text{if } D_0 - \frac{W}{2} \leq D(u, v) \leq D_0 + \frac{W}{2} \\ 1 & \text{if } D(u, v) > D_0 + \frac{W}{2} \end{cases} H(u,v)= 101if D(u,v)<D02Wif D02WD(u,v)D0+2Wif D(u,v)>D0+2W$H(u, v)=\frac{1}{1+\left[\frac{D_0}{D(u, v)}\right]^{2n}} $ H ( u , v ) = 1 − exp ⁡ [ − D 2 ( u , v ) 2 D 0 2 ] H(u, v)=1-\exp\left[-\frac{D^2(u, v)}{2D_0^2}\right] H(u,v)=1exp[2D02D2(u,v)]
这里 D ( u , v ) D(u, v) D(u,v)通常表示频率域中的距离, D 0 D_0 D0 W W W是常数。这种滤波器是一种理想高通滤波器,它在频率域中完全截断了低频部分,保留了高频部分。这里 n n n是滤波器的阶数。Butterworth高通滤波器是一种常用的滤波器,它在频率域中的响应是平滑过渡的,没有理想滤波器那样的尖锐截断。Gaussian高通滤波器也是一种平滑过渡的滤波器,其形状基于高斯函数。
当频率距离 D ( u , v ) D(u, v) D(u,v)小于 D 0 − W 2 D_0 - \frac{W}{2} D02W或大于 D 0 + W 2 D_0+\frac{W}{2} D0+2W时,滤波器的响应为1,表示完全通过;当频率距离在 D 0 − W 2 D_0 - \frac{W}{2} D02W D 0 + W 2 D_0+\frac{W}{2} D0+2W之间时,滤波器的响应为0,表示完全截断。随着 D ( u , v ) D(u, v) D(u,v)的增加,滤波器的响应从0逐渐增加到1,过渡的平滑程度由阶数 n n n决定。阶数越高,过渡越陡峭。它的响应从0逐渐增加到1,过渡更加平滑,没有明显的截断点。

带通滤波器(Bandpass Filters)

H b p = 1 − H b r ( u , v ) H_{bp}=1-H_{br}(u,v) Hbp=1Hbr(u,v)

带通滤波器执行与带阻滤波器相反的操作。得到噪声信号。

带通滤波器与带阻滤波器是一对儿;低通滤波器与高通滤波器是一对儿。

陷波滤波器(Notch filters)

成对出现。(a)是原图像,可以看见存在一些横纹(噪声)。然会得到(b)是(a)的傅里叶谱;通过©中的陷波滤波器的传递函数,可以去除掉噪声。(d)是图像复原后的图;(e)是提取出来的噪声。

IdealGaussianButterworth
H ( u , v ) = { 0 if  D 1 ( u , v ) ≤ D 0  or  D 2 ( u , v ) ≤ D 0 1 else H(u, v) = \begin{cases} 0 & \text{if } D_1(u, v) \leq D_0 \text{ or } D_2(u, v) \leq D_0 \\ 1 & \text{else} \end{cases} H(u,v)={01if D1(u,v)D0 or D2(u,v)D0else H ( u , v ) = 1 − exp ⁡ [ − 1 2 ( D 1 ( u , v ) D 2 ( u , v ) D 0 2 ) ] H(u, v)=1 - \exp\left[-\frac{1}{2}\left(\frac{D_1(u, v)D_2(u, v)}{D_0^2}\right)\right] H(u,v)=1exp[21(D02D1(u,v)D2(u,v))] H ( u , v ) = 1 1 + [ D 0 2 D 1 ( u , v ) D 2 ( u , v ) ] n H(u, v)=\frac{1}{1 + \left[\frac{D_0^2}{D_1(u, v)D_2(u, v)}\right]^n} H(u,v)=1+[D1(u,v)D2(u,v)D02]n1
D 1 ( u , v ) D_1(u, v) D1(u,v) D 2 ( u , v ) D_2(u, v) D2(u,v)是两个距离度量, D 0 D_0 D0是一个阈值。它的过渡比Butterworth滤波器更平滑。 n n n是滤波器的阶数。
D 1 ( u , v ) D_1(u, v) D1(u,v) D 2 ( u , v ) D_2(u, v) D2(u,v)都大于 D 0 D_0 D0时,滤波器的传递函数值为1,表示完全通过;否则,传递函数值为0,表示完全截止。这种滤波器基于高斯函数,传递函数的值从0逐渐增加到1。随着 D 1 ( u , v ) D_1(u, v) D1(u,v) D 2 ( u , v ) D_2(u, v) D2(u,v)的增加,传递函数的值从0逐渐增加到1。阶数 n n n越高,过渡越陡峭。

公式中还定义了 D 1 ( u , v ) D_1(u, v) D1(u,v) D 2 ( u , v ) D_2(u, v) D2(u,v)的具体形式:
D 1 ( u , v ) = [ ( u − M 2 − u 0 ) 2 + ( v − N 2 − v 0 ) 2 ] 1 2 D 2 ( u , v ) = [ ( u − M 2 + u 0 ) 2 + ( v − N 2 + v 0 ) 2 ] 1 2 D_1(u, v)=\left[\left(u - \frac{M}{2} - u_0\right)^2+\left(v - \frac{N}{2} - v_0\right)^2\right]^{\frac 1 2}\\D_2(u, v)=\left[\left(u - \frac{M}{2}+u_0\right)^2+\left(v - \frac{N}{2}+v_0\right)^2\right]^{\frac 1 2} D1(u,v)=[(u2Mu0)2+(v2Nv0)2]21D2(u,v)=[(u2M+u0)2+(v2N+v0)2]21
这里 M M M N N N是图像的尺寸, u 0 u_0 u0 v 0 v_0 v0是滤波器的中心坐标。 这些高通滤波器在图像处理中常用于增强图像的高频细节,例如边缘和纹理。

不同的滤波器适用于不同的应用场景,第一种滤波器是理想高通滤波器,具有最尖锐的截止,但会导致振铃效应;Butterworth和Gaussian高通滤波器则提供了更平滑的过渡,减少了振铃效应。

最佳陷波滤波算法(Optimum Notch Filtering)

当存在多个干扰分量时,之前提到的方法并不总是可行的,因为在滤波过程中会去除过多的图像信息。这里讨论的方法是最优的,因为它使恢复估计值 f ^ ( x , y ) \hat{f}(x,y) f^(x,y)的局部方差最小化。

首先,通过以下方式获得噪声的初始估计:
N ( u , v ) = F N ( u , v ) G ( u , v ) η ( x , y ) = J − 1 ( F N ( u , v ) G ( u , v ) ) N(u,v) = F_N(u,v)G(u,v)\\ \eta(x,y) = \mathfrak{J}^{-1}(F_N(u,v)G(u,v)) N(u,v)=FN(u,v)G(u,v)η(x,y)=J1(FN(u,v)G(u,v))
其中 F N ( u , v ) F_N(u,v) FN(u,v)被构建为仅通过与干扰模式相关的分量。

令:
f ^ ( x , y ) = g ( x , y ) − w ( x , y ) η ( x , y ) \hat{f}(x,y) = g(x,y) - w(x,y)\eta(x,y) f^(x,y)=g(x,y)w(x,y)η(x,y)
η ( x , y ) \eta(x,y) η(x,y)估计已知,我们将确定调制函数 w ( x , y ) w(x,y) w(x,y),以使 f ^ ( x , y ) \hat{f}(x,y) f^(x,y)的局部方差最小化。

目标:局部很好的平滑性,相邻的像素之间比较相似。
min ⁡ σ 2 ( x , y ) = 1 ( 2 a + 1 ) ( 2 b + 1 ) ∑ s = − a a ∑ t = − b b [ f ^ ( x + s , y + t ) − f ˉ ] 2 f ˉ = 1 ( 2 a + 1 ) ( 2 b + 1 ) ∑ s = − a a ∑ t = − b b f ^ ( x + s , y + t ) \min \sigma^2(x,y) = \frac{1}{(2a + 1)(2b + 1)} \sum_{s=-a}^{a} \sum_{t=-b}^{b} [\hat{f}(x + s, y + t) - \bar{f}]^2\\ \bar{f} = \frac{1}{(2a + 1)(2b + 1)} \sum_{s=-a}^{a} \sum_{t=-b}^{b} \hat{f}(x + s, y + t) minσ2(x,y)=(2a+1)(2b+1)1s=aat=bb[f^(x+s,y+t)fˉ]2fˉ=(2a+1)(2b+1)1s=aat=bbf^(x+s,y+t)
对上式展开:
σ 2 ( x , y ) = 1 ( 2 a + 1 ) ( 2 b + 1 ) ∑ s = − a a ∑ t = − b b [ [ g ( x + s , y + t ) − w ( x + s , y + t ) ⋅ η ( x + s , y + t ) ] − [ g ( x , y ) ‾ − w ( x , y ) η ( x , y ) ‾ ] ] 2 \sigma^2 (x,y)= \frac{1}{(2a + 1)(2b + 1)} \sum_{s=-a}^{a} \sum_{t=-b}^{b} \\ \left[ [g(x + s, y + t) - w(x + s, y + t) \cdot \eta(x + s, y + t)] - [\overline{g(x,y)} - \overline{w(x,y)\eta(x,y)}] \right]^2 σ2(x,y)=(2a+1)(2b+1)1s=aat=bb[[g(x+s,y+t)w(x+s,y+t)η(x+s,y+t)][g(x,y)w(x,y)η(x,y)]]2
这个式子中只有 w ( x + s , y + t ) w(x+s,y+t) w(x+s,y+t)是变量,变量一共有 ( 2 a + 1 ) ( 2 b + 1 ) w ( x + s , y + t ) (2a+1)(2b+1)w(x+s,y+t) (2a+1)(2b+1)w(x+s,y+t)个变量。可以看到每一个 ( x , y ) (x,y) (x,y)位置都能建立这样的目标函数、有这么多的变量去求解,实在是难以计算。因此进行简化:将原来的M*N个位置的多目标优化问题,转化为了M*N个i.i.d,优化问题。

w ( x + s , y + t ) = w ( x , y ) w(x + s, y + t) = w(x,y) w(x+s,y+t)=w(x,y), (将 ( 2 a + 1 ) ( 2 b + 1 ) (2a+1)(2b+1) (2a+1)(2b+1)个变元简化为 1 1 1 )我们有单变元函数:
σ 2 ( x , y ) = 1 ( 2 a + 1 ) ( 2 b + 1 ) ∑ s = − a a ∑ t = − b b ( [ g ( x + s , y + t ) − w ( x , y ) ⋅ η ( x + s , y + t ) ] − [ g ( x , y ) ‾ − w ( x , y ) η ( x , y ) ‾ ] ) 2 \sigma^2(x,y) = \frac{1}{(2a + 1)(2b + 1)} \sum_{s=-a}^{a} \sum_{t=-b}^{b}\\ \left( [g(x + s, y + t) - w(x,y) \cdot \eta(x + s, y + t)] - [\overline{g(x,y)} - \overline{w(x,y)\eta(x,y)}] \right)^2 σ2(x,y)=(2a+1)(2b+1)1s=aat=bb([g(x+s,y+t)w(x,y)η(x+s,y+t)][g(x,y)w(x,y)η(x,y)])2
为了最小化 σ 2 \sigma^2 σ2,我们求解:
∂ σ 2 ∂ w ( x , y ) = 0 w ( x , y ) = g ( x , y ) η ( x , y ) ‾ − g ˉ ( x , y ) η ˉ ( x , y ) η 2 ‾ ( x , y ) − η ˉ 2 ( x , y ) \begin{align}\frac{\partial \sigma^2}{\partial w(x,y)}& = 0\\ w(x,y) &= \frac{\overline{g(x,y)\eta(x,y)} - \bar{g}(x,y)\bar{\eta}(x,y)}{\overline{\eta^2}(x,y) - \bar{\eta}^2(x,y)} \end{align} w(x,y)σ2w(x,y)=0=η2(x,y)ηˉ2(x,y)g(x,y)η(x,y)gˉ(x,y)ηˉ(x,y)
η 2 ‾ ( x , y ) \overline{\eta^2}(x,y) η2(x,y)是平方的均值, η ˉ 2 ( x , y ) \bar{\eta}^2(x,y) ηˉ2(x,y)是均值的平方。

这样我们就能求解出每个位置的weight: w ( x , y ) w(x,y) w(x,y),需要求M*N次。

估计退化函数(Estimating the Degradation Function)

该节分为以下两个部分进行讨论:

  1. 假设没有噪声的情况: η ( x , y ) = 0 , g ( x , y ) = h ( x , y ) ∗ f ( x , y ) \eta(x,y)=0,g(x,y)=h(x,y)*f(x,y) η(x,y)=0,g(x,y)=h(x,y)f(x,y)
  2. 假设存在噪声的情况,如何处理?

进行图像复原,第一步要做的,就是找到 H ( u , v ) H(u,v) H(u,v). 有以下三种方法:

图像观察估计实验估计模型估计
H s ( u , v ) = G s ( u , v ) F ^ s ( u , v ) H_s(u,v) = \frac{G_s(u,v)}{\hat{F}_s(u,v)} Hs(u,v)=F^s(u,v)Gs(u,v) H ( u , v ) = G ( u , v ) A H(u,v) = \frac{G(u,v)}{A} H(u,v)=AG(u,v) H ( u , v ) = exp ⁡ [ − k ( u 2 + v 2 ) ] 5 / 6 H(u,v) = \exp\left[-k\left(u^2 + v^2\right)\right]^{5/6} H(u,v)=exp[k(u2+v2)]5/6
G s ( u , v ) G_s(u,v) Gs(u,v)表示观测到的子图像, F ^ s ( u , v ) \hat{F}_s(u,v) F^s(u,v)表示原始子图像的估计值,并且假设由于我们选择了强信号区域,噪声可以忽略不计,然后可以从 H s ( u , v ) H_s(u,v) Hs(u,v)推导出完整函数 H ( u , v ) H(u,v) H(u,v) .Hufnagel等人在1964年基于大气湍流的物理特性提出的退化模型. k → 0 k\rightarrow 0 k0,此时没有大气湍流,相应的 H ( u , v ) = 1 H(u,v)=1 H(u,v)=1,只有噪声影响了。
【一叶知秋】完全不知道图像是怎么获得的、只知道这副污染的图像.我知道图像是被何设备何场景下拍摄、且我手里有这个设备、我再对特定的对象(平坦)在同样的条件下拍摄。用这个特殊对象来估计污染图像.从高空拍摄地面,会受到气流的影响。

运动引起的图像模糊(Image Blur due to Motion)

现在,假设一幅图像由于均匀线性运动而变得模糊。
g ( x , y ) = ∫ 0 T f ( x − x 0 ( t ) , y − y 0 ( t ) ) d t g(x,y) = \int_{0}^{T} f\left(x - x_0(t),y - y_0(t)\right) dt g(x,y)=0Tf(xx0(t),yy0(t))dt
T T T是快门时间。然后,它的傅里叶变换是:
G ( u , v ) = ∫ − ∞ ∞ ∫ − ∞ ∞ g ( x , y ) exp ⁡ [ − j 2 π ( u x + v y ) ] d x d y = ∫ − ∞ ∞ ∫ − ∞ ∞ [ ∫ 0 T f ( x − x 0 ( t ) , y − y 0 ( t ) ) d t ] exp ⁡ [ − j 2 π ( u x + v y ) ] d x d y = ∫ 0 T [ ∫ − ∞ ∞ ∫ − ∞ ∞ f ( x − x 0 ( t ) , y − y 0 ( t ) ) exp ⁡ [ − j 2 π ( u x + v y ) ] d x d y ] d t = ∫ 0 T F ( u , v ) exp ⁡ [ − j 2 π ( u x 0 ( t ) + v y 0 ( t ) ) ] d t = F ( u , v ) ∫ 0 T exp ⁡ [ − j 2 π ( u x 0 ( t ) + v y 0 ( t ) ) ] H ( u , v ) = ∫ 0 T exp ⁡ [ − j 2 π ( u x 0 ( t ) + v y 0 ( t ) ) ] d t d t \begin{align*} G(u,v) &= \int_{-\infty}^{\infty}\int_{-\infty}^{\infty} g(x,y) \exp\left[-j2\pi(ux + vy)\right] dxdy\\ &= \int_{-\infty}^{\infty}\int_{-\infty}^{\infty} \left[\int_{0}^{T} f\left(x - x_0(t),y - y_0(t)\right) dt\right] \exp\left[-j2\pi(ux + vy)\right] dxdy\\ &= \int_{0}^{T} \left[\int_{-\infty}^{\infty}\int_{-\infty}^{\infty} f\left(x - x_0(t),y - y_0(t)\right) \exp\left[-j2\pi(ux + vy)\right] dxdy\right] dt\\ &= \int_{0}^{T} F(u,v) \exp\left[-j2\pi(ux_0(t) + vy_0(t))\right] dt\\ &= F(u,v) \int_{0}^{T} \exp\left[-j2\pi(ux_0(t) + vy_0(t))\right]\\\\ H(u,v)& = \int_{0}^{T} \exp\left[-j2\pi(ux_0(t) + vy_0(t))\right] dt dt\end{align*} G(u,v)H(u,v)=g(x,y)exp[j2π(ux+vy)]dxdy=[0Tf(xx0(t),yy0(t))dt]exp[j2π(ux+vy)]dxdy=0T[f(xx0(t),yy0(t))exp[j2π(ux+vy)]dxdy]dt=0TF(u,v)exp[j2π(ux0(t)+vy0(t))]dt=F(u,v)0Texp[j2π(ux0(t)+vy0(t))]=0Texp[j2π(ux0(t)+vy0(t))]dtdt

如果 x 0 ( t ) = a t / T x_0(t) = at/T x0(t)=at/T y 0 ( t ) = 0 y_0(t) = 0 y0(t)=0(垂直方向上没有发生运动,只是在水平方向上抖动了以下),那么:
H ( u , v ) = ∫ 0 T exp ⁡ ( − j 2 π u a t / T ) d t = T π u a sin ⁡ ( π u a ) exp ⁡ ( − j π u a ) H(u,v) = \int_{0}^{T} \exp\left(-j2\pi uat/T\right) dt = \frac{T}{\pi ua} \sin(\pi ua) \exp\left(-j\pi ua\right) H(u,v)=0Texp(j2πuat/T)dt=πuaTsin(πua)exp(ua)
如果 y 0 ( t ) = b t / T y_0(t) = bt/T y0(t)=bt/T而不是0(水平、垂直方向上都发生了运动),那么:
H ( u , v ) = T π ( u a + v b ) sin ⁡ ( π ( u a + v b ) ) exp ⁡ ( − j π ( u a + v b ) ) H(u,v) = \frac{T}{\pi(ua + vb)} \sin(\pi(ua + vb)) \exp\left(-j\pi(ua + vb)\right) H(u,v)=π(ua+vb)Tsin(π(ua+vb))exp((ua+vb))

直接逆滤波(Direct Inverse Filtering)

对于被退化函数 H H H退化的图像,最简单的恢复方法是直接逆滤波:
F ^ ( u , v ) = G ( u , v ) H ( u , v ) \hat{F}(u,v) = \frac{G(u,v)}{H(u,v)} F^(u,v)=H(u,v)G(u,v)
可以看到,这个式子中假设 N ( u , v ) = 0 N(u,v)=0 N(u,v)=0,且我们需要已知 G ( u , v ) , H ( u , v ) G(u,v),H(u,v) G(u,v),H(u,v).

那要是 N ( u , v ) ≠ 0 N(u,v)\neq0 N(u,v)=0,我们可以得到:
F ^ ( u , v ) = F ( u , v ) + N ( u , v ) H ( u , v ) \hat{F}(u,v) = F(u,v) + \frac{N(u,v)}{H(u,v)} F^(u,v)=F(u,v)+H(u,v)N(u,v)
如果退化函数 H ( u , v ) H(u,v) H(u,v)在某一个频率点有零值或非常小的值(一般都是离原点比较远的地方存在),那么 N ( u , v ) / H ( u , v ) N(u,v)/H(u,v) N(u,v)/H(u,v)的比值会很大、可能会压制 F ( u , v ) F(u,v) F(u,v)的估计,造成 F ( u , v ) F(u,v) F(u,v)的估计存在较大误差。

一种解决方法是利用原点附近退化函数的值来进行逆滤波的计算。比如设置一个半径: u 2 + v 2 ≤ R 2 u^2+v^2\le R^2 u2+v2R2,足够小的时候来计算 F ^ ( u , v ) \hat F(u,v) F^(u,v); u 2 + v 2 > R 2 u^2+v^2> R^2 u2+v2>R2的地方,做低通滤波。

image-20241223120002142
(a)(b)©(d)
这是使用完整滤波器(full filter)进行恢复的结果。这是将滤波器函数 H H H在半径为 40 以外进行截断后进行恢复的结果。这是将滤波器函数 H H H在半径为 70 以外进行截断后进行恢复的结果。这是将滤波器函数 H H H在半径为 85 以外进行截断(cut off outside a radius of 85)后进行恢复的结果。
图像看起来较为模糊,细节不够清晰。goodbetter依托。

可以推断出来噪声的频率大于70.(85把噪声包含进去,此时就是 N ( u , v ) / H ( u , v ) N(u,v)/H(u,v) N(u,v)/H(u,v)的比值会很大、可能会压制 F ( u , v ) F(u,v) F(u,v)的估计,造成 F ( u , v ) F(u,v) F(u,v)的估计存在较大误差。得到了依托)

维纳滤波器(Wiener Filtering)

理论上最优的一种图像复原方法。

维纳滤波器寻求使统计误差函数最小化的估计值 f ^ \hat f f^
e 2 = E { ( f − f ^ ) 2 } e^2 = E\{(f - \hat{f})^2\} e2=E{(ff^)2}
E E E是期望算子, f f f是未退化图像。

此表达式在频域中的解为:
F ^ ( u , v ) = [ 1 H ( u , v ) ∣ H ( u , v ) ∣ 2 ∣ H ( u , v ) ∣ 2 + S n ( u , v ) / S f ( u , v ) ] G ( u , v ) \hat{F}(u, v) = \left[\frac{1}{H(u, v)} \frac{|H(u, v)|^2}{|H(u, v)|^2 + S_n(u, v)/S_f(u, v)}\right] G(u, v) F^(u,v)=[H(u,v)1H(u,v)2+Sn(u,v)/Sf(u,v)H(u,v)2]G(u,v)
其中 :

| H ( u , v ) H(u, v) H(u,v) | ∣ H ( u , v ) ∣ 2 = H ∗ ( u , v ) H ( u , v ) |H(u, v)|^2 = H^*(u, v)H(u, v) H(u,v)2=H(u,v)H(u,v) | H ∗ ( u , v ) H^*(u, v) H(u,v) | S n ( u , v ) = ∣ N ( u , v ) ∣ 2 S_n(u, v) = |N(u, v)|^2 Sn(u,v)=N(u,v)2 | S f ( u , v ) = ∣ F ( u , v ) ∣ 2 S_f(u, v) = |F(u, v)|^2 Sf(u,v)=F(u,v)2 |
| --------- | -------------------------------- | ------------------- | ------------------------- | ------------------------- |
| 退化函数 | — | 是 H ( u , v ) H(u, v) H(u,v)的复共轭 | 是噪声的功率谱 | 未退化图像的功率谱 |

实际上很难在现实中求解:主要是因为 S n ( u , v ) / S f ( u , v ) S_n(u, v)/S_f(u, v) Sn(u,v)/Sf(u,v)、很难求噪声的功率谱以及未退化图像的功率谱。通常使用近似来应用: S n ( u , v ) / S f ( u , v ) = K S_n(u, v)/S_f(u, v)=K Sn(u,v)/Sf(u,v)=K
F ^ ( u , v ) = [ 1 H ( u , v ) ∣ H ( u , v ) ∣ 2 ∣ H ( u , v ) ∣ 2 + K ] G ( u , v ) \hat{F}(u, v) = \left[\frac{1}{H(u, v)} \frac{|H(u, v)|^2}{|H(u, v)|^2 + K}\right] G(u, v) F^(u,v)=[H(u,v)1H(u,v)2+KH(u,v)2]G(u,v)

image-20241223142412526

(a)(d)(g)原始图像(b)(e)(h)逆滤波©(f)(i)维纳滤波
原始的 8 位图像,受到了运动模糊和加性噪声的影响。图像的模糊有所减少,但噪声被放大了。与逆滤波相比,维纳滤波在减少模糊的同时,较好地抑制了噪声。
噪声方差降低了一个数量级。
噪声方差降低了五个数量级。通过降低噪声方差,维纳滤波能够有效地去除噪声并减少模糊。

约束最小二乘图像复原算法(Constrained Least Squares Filtering)

了解退化函数 H H H的问题 - 在本章讨论的所有方法中,都存在需要了解退化函数 H H H的问题。

维纳算法不好的是:得事先知道噪声功率谱和未退化图像谱,但这个很难知道。

接下来介绍约束最小二乘滤波方法,这个方法只需要知道噪声的均值和方差。

如果我们用矩阵来模拟退化过程,有:
g ( x , y ) = h ( x , y ) ∗ f ( x , y ) + η ( x , y ) g = H f + η g(x,y)=h(x,y)*f(x,y)+\eta(x,y) \\ g={H}{f}+{\eta} g(x,y)=h(x,y)f(x,y)+η(x,y)g=Hf+η
将其转化成矩阵形式,相当于是做 v e c ( ) vec() vec()操作拉伸。比如原先的 f ( x , y ) : M × N f(x,y): M\times N f(x,y):M×N,现在的 f f f M N × 1 MN\times 1 MN×1.

该方法的核心是 H H H对噪声的敏感性问题。一种缓解该问题的方法是基于平滑度的度量进行恢复。

拉普拉斯(图像的二阶导数: ∇ 2 f = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 \nabla^2 f=\frac{\partial^2f}{\partial x^2}+\frac{\partial^2f}{\partial y^2} 2f=x22f+y22f)似乎是一个很好的选择。

一阶导反映变化快慢、二阶导反映了平滑程度。

需要最小化的代价函数 C C C为 :
min ⁡ C = ∑ x = 0 M − 1 ∑ y = 0 N − 1 [ ∇ 2 f ( x , y ) ] 2 s . t .   ∥ g − H f ^ ∥ = ∥ η ∥ \min C=\sum_{x = 0}^{M-1}\sum_{y = 0}^{N-1}[\nabla^2 f(x,y)]^2\\ s.t.\ \|\mathbf{g}-\mathbf{H}\hat{\mathbf{f}}\|=\|\mathbf{\eta}\| minC=x=0M1y=0N1[2f(x,y)]2s.t. gHf^=η

已知: g , H , η g,H,\eta g,H,η。该问题在频域的解为 :
F ^ ( u , v ) = [ H ∗ ( u , v ) ∣ H ( u , v ) ∣ 2 + γ ∣ P ( u , v ) ∣ 2 ] G ( u , v ) \hat{F}(u,v)=\left[\frac{H^*(u,v)}{|H(u,v)|^2+\gamma|P(u,v)|^2}\right]G(u,v) F^(u,v)=[H(u,v)2+γP(u,v)2H(u,v)]G(u,v)
其中 P ( x , y ) P(x,y) P(x,y)是拉普拉斯算子在空域中的一个形式(傅里叶变换)。
P ( x , y ) = ( 0 − 1 0 − 1 4 − 1 0 − 1 0 ) P(x,y)=\begin{pmatrix} 0 & -1 & 0 \\ -1 & 4 & -1 \\ 0 & -1 & 0 \end{pmatrix} P(x,y)= 010141010

r = g − H f ^ r=g-{H}\hat{f} r=gHf^,且 φ ( γ ) = r T r = ∥ r ∥ 2 \varphi(\gamma)={r}^T{r}=\|{r}\|^2 φ(γ)=rTr=r2

可以证明 φ ( γ ) \varphi(\gamma) φ(γ) γ \gamma γ的单调递增函数。因此,我们可以调整 γ \gamma γ,使得 :
∥ r ∥ 2 = ∥ η ∥ 2 ± α \|{r}\|^2=\|\mathbf{\eta}\|^2\pm\alpha r2=η2±α

α \alpha α足够小,那么 ∥ r ∥ 2 ∼ ∥ η ∥ 2 \|r\|^2\sim\|\eta\|^2 r2η2. 回看频域的解: F ^ ( u , v ) = [ H ∗ ( u , v ) ∣ H ( u , v ) ∣ 2 + γ ∣ P ( u , v ) ∣ 2 ] G ( u , v ) \hat{F}(u,v)=\left[\frac{H^*(u,v)}{|H(u,v)|^2+\gamma|P(u,v)|^2}\right]G(u,v) F^(u,v)=[H(u,v)2+γP(u,v)2H(u,v)]G(u,v).

已知的条件有: H ( u , v ) , P ( u , v ) , G ( u , v ) H(u,v),P(u,v),G(u,v) H(u,v),P(u,v),G(u,v),那么当 γ \gamma γ确定时: γ ⇒ F ^ ⇒ f ^ ⇒ g − H f ^ = r \gamma\Rightarrow\hat F\Rightarrow \hat f\Rightarrow g-H\hat f=r γF^f^gHf^=r

然后根据 ∥ r ∥ 2 = ∥ η ∥ 2 ± α \|{r}\|^2=\|\mathbf{\eta}\|^2\pm\alpha r2=η2±α确定 ∥ r ∥ 2 \|r\|^2 r2是否落入区间,不在区间的话,可以不断地调整 γ \gamma γ,使 ∥ r ∥ 2 < ∥ η ∥ 2 ± α \|{r}\|^2<\|\mathbf{\eta}\|^2\pm\alpha r2<η2±α落入邻域。此时,所估计的 f ^ \hat f f^是问题的解。

Q: 前面假设噪声已知,那实际中如何计算 ∥ η ∥ 2 \|{\eta}\|^2 η2
∥ η ∥ 2 = M N [ σ η 2 + m η 2 ] { σ η 2 = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 [ η ( x , y ) − m η ] 2 m η = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 η ( x , y ) \|\mathbf{\eta}\|^2 = MN[\sigma_{\eta}^2+m_{\eta}^2] \\\begin{cases}\sigma_{\eta}^2=\frac{1}{MN}\sum_{x = 0}^{M-1}\sum_{y = 0}^{N-1}[\eta(x,y)-m_{\eta}]^2 \\ m_{\eta}=\frac{1}{MN}\sum_{x = 0}^{M-1}\sum_{y = 0}^{N-1}\eta(x,y) \end{cases} η2=MN[ση2+mη2]{ση2=MN1x=0M1y=0N1[η(x,y)mη]2mη=MN1x=0M1y=0N1η(x,y)
η 2 , m η 2 \eta^2, m_{\eta}^2 η2,mη2是噪声的方差和期望。

σ η 2 = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 [ η ( x , y ) − m η ] 2 = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 [ η 2 ( x , y ) − 2 m η η ( x , y ) + m η 2 ] = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 η 2 ( x , y ) − 2 m η 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 η ( x , y ) + m η 2 = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 η 2 ( x , y ) − 2 m η 2 + m η 2 = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 η 2 ( x , y ) − m η 2 ∑ x = 0 M − 1 ∑ y = 0 N − 1 η 2 ( x , y ) = M N [ σ η 2 + m η 2 ] ∥ η ∥ 2 = M N [ σ η 2 + m η 2 ] \begin{align*} \sigma_{\eta}^2&=\frac{1}{MN}\sum_{x = 0}^{M-1}\sum_{y = 0}^{N-1}[\eta(x,y)-m_{\eta}]^2\\ &=\frac{1}{MN}\sum_{x = 0}^{M-1}\sum_{y = 0}^{N-1}[\eta^2(x,y)-2m_{\eta}\eta(x,y)+m_{\eta}^2]\\ &=\frac{1}{MN}\sum_{x = 0}^{M-1}\sum_{y = 0}^{N-1}\eta^2(x,y)-2m_{\eta}\frac{1}{MN}\sum_{x = 0}^{M-1}\sum_{y = 0}^{N-1}\eta(x,y)+m_{\eta}^2\\ &=\frac{1}{MN}\sum_{x = 0}^{M-1}\sum_{y = 0}^{N-1}\eta^2(x,y)-2m_{\eta}^2+m_{\eta}^2\\ &=\frac{1}{MN}\sum_{x = 0}^{M-1}\sum_{y = 0}^{N-1}\eta^2(x,y)-m_{\eta}^2 \\ \sum_{x = 0}^{M-1}\sum_{y = 0}^{N-1}\eta^2(x,y)&=MN[\sigma_{\eta}^2 + m_{\eta}^2]\\ \|\mathbf{\eta}\|^2 &= MN[\sigma_{\eta}^2+m_{\eta}^2] \end{align*} ση2x=0M1y=0N1η2(x,y)η2=MN1x=0M1y=0N1[η(x,y)mη]2=MN1x=0M1y=0N1[η2(x,y)2mηη(x,y)+mη2]=MN1x=0M1y=0N1η2(x,y)2mηMN1x=0M1y=0N1η(x,y)+mη2=MN1x=0M1y=0N1η2(x,y)2mη2+mη2=MN1x=0M1y=0N1η2(x,y)mη2=MN[ση2+mη2]=MN[ση2+mη2]

下图都展示了经过约束最小二乘滤波处理后的图像。可以看到效果比维纳滤波好一点。

image-20241223151324230

)+m_{\eta}^2\ &=\frac{1}{MN}\sum_{x = 0}^{M-1}\sum_{y = 0}{N-1}\eta2(x,y)-2m_{\eta}2+m_{\eta}2\ &=\frac{1}{MN}\sum_{x = 0}^{M-1}\sum_{y = 0}{N-1}\eta2(x,y)-m_{\eta}^2 \

\sum_{x = 0}^{M-1}\sum_{y = 0}{N-1}\eta2(x,y)&=MN[\sigma_{\eta}^2 + m_{\eta}^2]\
|\mathbf{\eta}|^2 &= MN[\sigma_{\eta}2+m_{\eta}2]
\end{align*}
$$

下图都展示了经过约束最小二乘滤波处理后的图像。可以看到效果比维纳滤波好一点。

[外链图片转存中…(img-UnOHPG8p-1735022584536)]


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

相关文章:

  • Python数据处理——re库与pydantic的使用总结与实战,处理采集到的思科ASA防火墙设备信息
  • YOLO原理讲解
  • 每天五分钟机器学习:核函数
  • C++----------类的设计
  • 领克Z20结合AI技术,革新自动驾驶辅助系统
  • 今日总结 2024-12-24
  • 前端取Content-Disposition中的filename字段与解码(vue)
  • 「Java EE开发指南」如何用MyEclipse构建一个Web项目?(一)
  • 【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列
  • CPU架构的变化史
  • 用Python写炸金花游戏
  • CoinShares预测2025年加密市场前景看涨
  • 【k8s】在ingress-controlller中Admission Webhook 的作用
  • 批量识别工作表中二维码信息-Excel易用宝
  • 【UE5 C++课程系列笔记】11——FString、FName、FText的基本使用
  • C 语言基础运算:输入两个整数并计算和、差、积
  • Python:模拟(包含例题:饮料换购 图像模糊 螺旋矩阵)
  • CSS|15 CSS3圆角矩形透明度
  • Java反射学习(4)(“反射“机制获取成员方法及详细信息(Method类))
  • 用于航空发动机故障诊断的深度分层排序网络
  • [项目][boost搜索引擎#4] cpp-httplib使用 log.hpp 前端 测试及总结
  • 宠物行业的出路:在爱与陪伴中寻找增长新机遇
  • PDF在线预览实现:如何使用vue-pdf-embed实现前端PDF在线阅读
  • Jenkins 构建流水线
  • 实训项目-人力资源管理系统-1Company子模块
  • 云手机+YouTube:改变通信世界的划时代技术