图像处理与分析

基本概念

图像的采样和量化

光照本身是连续的、但是转换成数字形式必然是不连续的
在坐标值(空间)上的数字化即为采样,对幅值的数字化即为量化
量化——每一像素值只能用有限位比特表示,故只能表现有限的精度
可以看作是笛卡儿积 Z 2 Z^2 Z2中的一对元素,映射到灰度值集合上的一个映射。
空间分辨率:如dpi每英寸点数;灰度分辨率直接用比特表示

图像插值

最简单的是最近邻方法,其次是双线性,最后是双三次
双线性:可以看作是在一个方格内拟合 f ( x , y ) = a + b x + c y + d x y f(x,y)=a+bx+cy+dxy f(x,y)=a+bx+cy+dxy,比较好的特点是无论固定x还是固定y,关于另一个变量都是线性的。

像素间关系

4领域、8领域、m邻接(m邻接可以消除8邻接的二义性
连通性、区域、边界
距离的度量:非负、自反、交换、三角

常用计算
  • 矩阵与阵列计算
  • 灰度算术
  • 集合和逻辑操作
  • 空间操作(几何空间变换与图像配准
    l图像变换
    一般来说反向映射比前向映射要好,可以配合插值算法决定每个像素的输出值
  • 把图像当作一个向量,然后乘以矩阵
  • 图像变到某个变换域去(通常通过某个正交变换核
彩色图像
  • 光的三原色为RGB
  • 颜料的三原色为CMYK(青、品红、黄、黑
  • HSI 色调、饱和度、强度

图像增强

灰度变换

直方图处理

直方图:反应每一个灰度的像素出现频度

直方图均衡

变换函数即为原图像的累计直方图
s = T ( r ) = ( L − 1 ) ∫ 0 r p r ( w ) d w s=T(r)=(L-1)\int_0^rp_r(w)dw s=T(r)=(L1)0rpr(w)dw

直方图匹配(规定化)

找到当前直方图和目标直方图均衡化的变换函数,然后利用当前的均衡化变换和目标的反变换即可

图像的空间域滤波

空间域滤波:一个领域,并对领域包围的图像像素执行预定义的操作
相关、卷积 ∑ s = − a a ∑ t = − b b w ( s , t ) f ( x − s , y − t ) \sum_{s=-a}^a\sum_{t=-b}^{b}w(s,t)f(x-s,y-t) s=aat=bbw(s,t)f(xs,yt)

平滑
  • 线性滤波
  • 例:均值平均(一些改进
    – 超限像素平滑法:只有与领域平均差了一定值以上是才采用均值
    – 灰度K近邻:领域窗口内灰度与中心值最接近的k个像素的平均
    – 最大均匀性平滑:找到哪个区域的像素值最均匀,这这个区域的均值
    – 有选择保边缘平滑法:定义了一些五边形、六连形区域
  • 统计排序(非线性)滤波
锐化滤波器

一般用一阶微分或是二阶微分
最简单的各向同性微分算子是拉普拉斯算子 ∇ 2 f = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 \nabla^2f=\frac{\partial^2f}{\partial x^2}+\frac{\partial^2f}{\partial y^2} 2f=x22f+y22f
离散到3x3的卷积核则是以90度为增量进行旋转各向同性
Laplacian增强算子: g = f − ∇ 2 f g=f-\nabla^2f g=f2f
对于梯度算子而言的话,有robert\sobel等等

频域的一些要点

频域特点
  • 混淆:过低的采样频率会使人分不清某些信息到底是高频的还是低频的,从频谱上来看就是叠加在了一起
  • 考虑到离散傅立叶变换对应的其实是周期延拓信号,因此应用卷积定理的时候需要注意边缘产生的缠绕现象。解决方案是进行Padding,长为 N , M N,M N,M的两个序列应该扩充到 N + M − 1 N+M-1 N+M1的长度才行。
  • 频域振铃:在255点DFT频域上呈现完美矩形的卷积核,一旦padding之后频域上就不完美了。
  • 理想低通滤波器在空间域是一个sinc函数,因此会带来振铃现象
  • 除此之外还有巴特沃斯滤波器、高斯滤波器
    H ( u , v ) = 1 / [ 1 + ( D ( u , v ) / D 0 ) 2 n ] H(u,v)=1/[1+(D(u,v)/D_0)^{2n}] H(u,v)=1/[1+(D(u,v)/D0)2n]
  • 高斯滤波器在时域和频域都是高斯函数
实现细节
  • 傅立叶反变换可以通过傅立叶变换实现
    M N f ∗ ( x , y ) = F { F ∗ ( u , v ) } MNf^*(x,y)=\mathbb F \{F^*(u,v)\} MNf(x,y)=F{F(u,v)}
  • 二维DFT是可分的,可以先按行做,再按列做
  • FFT: O ( M log ⁡ 2 M ) O(M\log_2M) O(Mlog2M)

小波变换

傅立叶只能提供频域的信息,而从频域完全看不出信号的时域特征。小波具有变化的频率和有限的持续时间,允许我们同时看出图像的频率和时域信息。

小波的特点:

  • 能量聚集性
  • 局部性和边缘检测性
  • 解相关性
  • 多分辨率性
  • 聚类性(边缘具有连续性
  • 保持性:尺度间数据分布的规律相似
  • 尺度间呈指数退化
  • 方向性:水平图只显示水平方向边缘

图像金字塔

图像的不同局部往往有着不同大小的物体特征。
用一系列以金字塔形状排列、分辨率逐步降低的图像集合。

  • 高斯金字塔:若直接下采样会产生频域的混叠,故在下采样之前先进行高斯滤波
  • 拉普拉斯金字塔:金字塔的顶端用降低分辨率的近似,而其他层则用这一层与上一层上采样的差。用迭代的方式预测残差金字塔
    – 残差值往往能通过更少的比特数进行高压缩
  • 小波的两种理解方式
    – 多尺度分析的角度(先略)
    – 一组滤波器,把原信号分解为两个信号低通+高通,然后又可以通过另外两个滤波器将原始信号完美地复原出来
    在这里插入图片描述

小波域去噪

MAP模型

我们假设图像上要去除的加性高斯噪声,不妨设原图像的像素是 X X X,而被噪声污染过的图像是 Y = N + X Y=N+X Y=N+X。其中高斯噪声在每个像素上相互独立、且方差相等。因此,有 Y − X ∼ N ( 0 , σ 2 I ) Y-X\sim N(0,\sigma^2I) YXN(0,σ2I)
在已知 Y Y Y的情况下我们要求 P ( X ∣ Y ) P(X|Y) P(XY)
P ( X ∣ Y ) ∝ P ( X ) P ( Y ∣ X ) P(X|Y)\propto P(X)P(Y|X) P(XY)P(X)P(YX)
其中 P Y ( Y ∣ X ) = P N ( Y − X ∣ X ) P_Y(Y|X)=P_N(Y-X|X) PY(YX)=PN(YXX)
在原始图像域我们没有任何的关于 P ( X ) P(X) P(X)的信息,但是在小波域,我们可以假设高频分量服从的是高斯分布即 P ( X i ) ∝ exp ⁡ ( − X i 2 / 2 σ 2 ) P(X_i)\propto \exp(-X_i^2/2\sigma^2) P(Xi)exp(Xi2/2σ2)
加上每个像素噪声的独立性(到小波域依然独立),我们可以求解出每个像素点的原始像素值。
X i ^ = arg ⁡ min ⁡ { ( Y i − X i ) 2 / σ n 2 + X i 2 / σ 2 } \hat{X_i}=\arg\min\{(Y_i-X_i)^2/\sigma_n^2+X_i^2/\sigma^2\} Xi^=argmin{(YiXi)2/σn2+Xi2/σ2}
X i = σ 2 σ 2 + σ n 2 Y i X_i=\frac{\sigma^2}{\sigma^2+\sigma_n^2}Y_i Xi=σ2+σn2σ2Yi

怎么估计方差参数

假设双高频分量均为噪声信息,那么可以通过统计小波变换后HH子图的方差来估计噪声方差。
为了加快计算速度,我们可以统计HH中绝对值的中位数,并除以0.6745当作噪声标准差。
由于图像信息与噪声独立,故图像的方差加上噪声的方差即为每一个子图分量的方差。我们统计每个高频子图的二阶矩,并减去噪声方差。
整张图片在不断迭代的小波过程中只需要一个噪声值,但每一个高频区域需要自己的信息方差。

扩展

若假设高频分量服从的是广义高斯分布,则根据参数不同可以得到硬阈值法、软阈值法和维纳滤波法。
P ( X i ) ∼ exp ⁡ { − ( ∣ X i ∣ / s ) p } P(X_i)\sim \exp\{-(|X_i|/s)^p\} P(Xi)exp{(Xi/s)p}
由于从像素值上看均是减小了,统称收缩算法。
如果考虑不同点上小波系数的方差 σ 2 \sigma^2 σ2是变化的,则可以得到空间自适应收缩算法。

图像复原

图像的退化模型

一个线性、位置不变的退化函数(卷积核),加上一个加性噪声。
g ( x , y ) = h ( x , y ) ∗ f ( x , y ) + η ( x , y ) g(x,y)=h(x,y)\ast f(x,y)+\eta(x,y) g(x,y)=h(x,y)f(x,y)+η(x,y)
若噪声的傅立叶频谱为常数,则称为白噪声。我们关注于得到噪声的PDF。
还有一种是周期噪声,就很好从频谱上分辨出来。

只去除噪声-空间滤波

均值滤波

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)=[\prod_{(s,t)\in S_{xy}}g(s,t)]^{\frac{1}{mn}} f^(x,y)=[(s,t)Sxyg(s,t)]mn1
  • 谐波均值滤波器——对盐粒噪声处理效果较好
  • 逆谐波均值滤波器 f ^ ( x , y ) = ∑ g ( s , t ) Q + 1 / ∑ g ( s , t ) Q \hat f(x,y)=\sum g(s,t)^{Q+1}/\sum g(s,t)^Q f^(x,y)=g(s,t)Q+1/g(s,t)Q
    – Q为正时消除胡椒,Q为负消除盐粒
    如果用高斯滤波器,核大小由标准差决定 r o u n d _ u p ( 3 σ ) ∗ 2 + 1 round\_up(3\sigma)*2+1 round_up(3σ)2+1
统计排序滤波器

(非线性滤波器

  • 中值滤波器 f ^ ( x , y ) = m e d i a n ( s , t ) ∈ S x y { g ( s , t ) } \hat f(x,y)=median_{(s,t)\in S_{xy}}\{g(s,t)\} f^(x,y)=median(s,t)Sxy{g(s,t)}
  • 最大、最小值滤波器
  • 修正的阿尔法滤波器:在领域内去掉最高、最低灰度的若干个点,再将剩下 m n − d mn-d mnd个点进行平均
自适应滤波器
  • 自适应局部降低噪声滤波器
  • 估计局部方差、局部均值,并利用噪声方差进行计算
    f ^ ( x , y ) = g ( x , y ) − σ η 2 σ L 2 [ g ( x , y ) − m L ] \hat f(x,y)=g(x,y)-\frac{\sigma_\eta^2}{\sigma_L^2}[g(x,y)-m_L] f^(x,y)=g(x,y)σL2ση2[g(x,y)mL]
  • 自适应中值滤波器:
    – 动态调节窗口大小,直到找到一个不是冲激噪声的中值
    – 检查当前像素点是不是冲激,若是则输出中值

频率域滤波

周期性噪声

对于书籍频率结构的周期性噪声,我们可以用带阻滤波器消除,或者用带通提取噪声模式。
陷波滤波器阻止事先定义的中心频率的领域内的频率。
陷波滤波器

  • 最佳陷波滤波器
    我们观察频谱图之后,可以在每个周期噪声的尖峰处放置一个陷波带通滤波器,则噪声模式可以通过下式得到
    η ( x , y ) = F − 1 { H N P ( u , v ) G ( u , v ) } \eta(x,y)=\mathbb{F}^{-1}\{H_{NP}(u,v)G(u,v)\} η(x,y)=F1{HNP(u,v)G(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)
    然后可以计算恢复后图像的方差,我们希望恢复后的图像在每一个像素点的领域内方差尽可能小。不妨再假设在计算方差时,每个像素领域内的噪声权重 w ( x , y ) w(x,y) w(x,y)约等于常数,则令方差对权重求导,可以得到噪声的具体权重,从而恢复出图像。

线性、位置不变的退化

线性系统的定义(满足齐次性和加性):
H [ a f 1 ( x , y ) + b f 2 ( x , y ) ] = a H [ f 1 ( x , y ) ] + b H [ f 2 ( x , y ) ] H[af_1(x,y)+bf_2(x,y)]=aH[f_1(x,y)]+bH[f_2(x,y)] H[af1(x,y)+bf2(x,y)]=aH[f1(x,y)]+bH[f2(x,y)]
位置不变系统:
H [ f ( x − a , y − b ) ] = g ( x − a , y − b ) H[f(x-a,y-b)]=g(x-a,y-b) H[f(xa,yb)]=g(xa,yb)
线性、位置不变系统可以用一个冲激响应来表示(点扩散函数PSF
线性、位置不变系统的输出可以用卷积来表示

如何估计退化核H(u,v)

暂略

已知退化函数,如何恢复图像
  • 逆滤波
    这是一种无视噪声的滤波手段,直接用退化图像的频谱除以退化函数的频谱,但是,由于噪声的存在,这种方式一定得不到最真实的图像。
    F ^ ( u , , v ) = F ( u , v ) + N ( u , v ) / H ( u , v ) \hat F(u,,v)=F(u,v)+N(u,v)/H(u,v) F^(u,,v)=F(u,v)+N(u,v)/H(u,v)
    甚至,由于有的地方 H ( u , v ) H(u,v) H(u,v)很小,噪声会在这个频率分量上起支配性的作用。(比如像我们常见的高斯模糊核在高频的分量就比较小)
    因此我们往往要选择截止频率,但是这个选择的过程也太小心了。
  • 最小均方误差(维纳)滤波
    误差函数 L = E { ∥ F − M G ∥ 2 } L=E\{\|F-MG\|^2\} L=E{FMG2},用它来估计出最优的滤波器 M M M
    M ^ ( u , v ) = H ∗ ( u , v ) ∣ H ( u , v ) ∣ 2 + S n ( u , v ) / S f ( u , v ) \hat M(u,v)=\frac{H^*(u,v)}{|H(u,v)|^2+S_n(u,v)/S_f(u,v)} M^(u,v)=H(u,v)2+Sn(u,v)/Sf(u,v)H(u,v)
    F ^ ( u , v ) = [ 1 H ( u , v ) ∣ H ( u , v ) ∣ 2 ∣ H ( u , v ) ∣ 2 + K ] G ( u , v ) \hat F(u,v)=[\frac{1}{H(u,v)}\frac{|H(u,v)|^2}{|H(u,v)|^2+K}]G(u,v) F^(u,v)=[H(u,v)1H(u,v)2+KH(u,v)2]G(u,v)
    这个算法不会存在退化函数为0的问题
  • 约束最小二乘滤波
    维纳滤波的问题:未退化图像和噪声的功率谱必须已知。
    我们用后验概率最大的MAP思想来求解原图像。复原图像的后验概率可以分为图像的先验概率和噪声模型两个问题组成。
    L ( f ; β , θ ) = 1 2 σ 2 ∥ g − H f ∥ 2 2 + β Φ ( f , θ ) L(f;\beta,\theta)=\frac{1}{2\sigma^2}\|g-Hf\|_2^2+\beta\Phi(f,\theta) L(f;β,θ)=2σ21gHf22+βΦ(f,θ)
    其中 Φ ( f , θ ) = ∥ P ∗ f ∥ \Phi(f,\theta)=\|P*f\| Φ(f,θ)=Pf P P P为Laplace算子,即要求图像的一阶差分应尽可能平滑。
    F ^ ( u , v ) = [ H ∗ ( u , v ) ∣ H ( u , v ) ∣ 2 + γ ∣ P ( u , v ) ∣ 2 ] G ( u , v ) \hat F(u,v)=[\frac{H^*(u,v)}{|H(u,v)|^2+\gamma|P(u,v)|^2}]G(u,v) F^(u,v)=[H(u,v)2+γP(u,v)2H(u,v)]G(u,v)
    如何寻找一个合适的 γ \gamma γ值是一个问题,因此有许多的迭代解法更新 γ \gamma γ值。

图像分割

分割目的:将所有像素分割成若干个不相交的连通子集,且所有相邻子集不具有相似性。

点、线、边缘的检测
  • 点检测用Laplace算子实现
  • 由于线检测对于二阶导数也会有较强的响应,所以也可以用Laplace算子
  • 然而Laplace算子各向同性,没有办法检测特定方向的线,因此有专门的线检测模板
  • 一阶导可以确定某点处是否存在边缘,包括Roberts\Prewitt\Sobel三种算子
  • 二阶导的零交叉点可定位粗边缘的中心
  • 二阶导对噪声很敏感,所以可以选对原图像作高斯平滑。利用卷积的性质,高斯平滑后二阶导等价于用高斯的二阶导处理。
  • Canny算子(暂略
边缘连接

考虑到用算子算出来的边界往往具有不连续性的特点,我们要用某种方式将他们连成一条连续的边界。
一种简单的方法是对检测到的每一个边缘点,看看有没有相邻的边缘点,如果有的话就把它们连起来。
Hough变换:我们构建出 ( a , b ) (a,b) (a,b)空间,代表空间里的每一条 a x + b = 0 ax+b=0 ax+b=0的线,我们检测到的每一个点,如果把所有通过它的线用 ( a , b ) (a,b) (a,b)空间里的点表示的话,就对应一条线,那么我们将检测到的所有点对应的线都在 ( a , b ) (a,b) (a,b)空间里面画出来,然后检测哪里的交点最密集就行了(比如用交点统计直方图)
广义Hough变换不光可以确定直线的参数,还可以确定圆的参数。

阈值法
  • 简单的全局阈值法:初始阈值分类、算新阈值、迭代
  • 最佳全局阈值:如果能提前知道每一类像素的类条件概率和先验概率,可以用类似于贝叶斯决策的方法,先出最小错误率决策面当作分割的阈值
  • 通过边界特性选择阈值——比如只画出梯度前10%的像素点的直方图,并根据谷底决定阈值(避免了两类数据量差异的问题,使两个峰尽可能一样高

图像形态学处理

  • 膨胀 A ⊕ B = { x ∣ ( B ^ ) x ∩ A ≠ ϕ } = ∪ b ∈ B ( A ) b A\oplus B=\{x|(\hat B)_x\cap A\neq \phi\}=\cup_{b\in B}(A)_b AB={x(B^)xA=ϕ}=bB(A)b
  • 腐蚀 A ⊖ B = { x ∣ ( B ) x ⊆ A } = ∩ b ∈ B ( A ) − b A\ominus B=\{x|(B)_x\subseteq A\}=\cap_{b\in B}(A)_{-b} AB={x(B)xA}=bB(A)b
  • 开运算 A ∘ B = ( A ⊖ B ) ⊕ B A\circ B=(A\ominus B)\oplus B AB=(AB)B
  • 闭运算 A ∙ B = ( A ⊕ B ) ⊖ B A\bullet B=(A\oplus B)\ominus B AB=(AB)B
    – 开闭运算执行多次和执行一次没有区别
    – 优势:不改变面积的同时平滑边缘
  • 击中击不中 A ∗ B = ( A ⊖ B ) ∩ ( A c ⊖ ( W − B ) ) A\ast B=(A\ominus B)\cap(A^c \ominus(W-B)) AB=(AB)(Ac(WB))
    – 用于形状检测
  • 边界提取 β ( A ) = A − ( A ⊖ B ) \beta(A)=A-(A\ominus B) β(A)=A(AB)
    – B为全1的3x3的核
  • 区域填充 X k = ( X k − 1 ⊕ B ) ∩ A c X_k=(X_{k-1}\oplus B)\cap A^c Xk=(Xk1B)Ac
    – A是边界图,B为十字核
    –等于是扩充到边界就会被迫停下来,只有非边界的地方才允许被填充
  • 连通分量提取 X k = ( X k − 1 ⊕ B ) ∩ A X_k=(X_{k-1}\oplus B)\cap A Xk=(Xk1B)A
    – 八邻域全1核,四领域十字核
  • 凸包 X k = ( X k − 1 ∗ B ) ∪ A X_k=(X_{k-1}\ast B)\cup A Xk=(Xk1B)A
    – 如结构元,每次都会往斜方向去填充,所以做完之后应该是一个类似菱形的形状
    – 然后我们再根据原图像的最左、最右像素点确定最小的凸包
    关于凸包
  • 细化 A ⊗ B = A − ( A ∗ B ) = A ∩ ( A ∗ B ) c A\otimes B =A-(A\ast B)=A\cap(A\ast B)^c AB=A(AB)=A(AB)c
    – 可以看作是将满足边界条件的点去除
    细化
  • 粗化 A ⊙ B = A ∪ ( A ∗ B ) A\odot B =A\cup(A\ast B) AB=A(AB)
    – 与细化是相对应的
  • 骨架
    – 可以用腐蚀-开运算的方法,骨架为腐蚀后开运算的差集
    骨架算法1
    – 也可以用距离变换的方法
  • 裁剪
    – 用检测终点的算子进行若干次细化,相当于把每个端点往里缩几像素
    – 然后在结果图中检测存在的端点,并在现存端点算进行等次数的膨胀,并与原图取交、与细化之后图像取并

图像压缩

概念

如果 b b b, b ′ b' b分别代表相同信息的两种不同表示的比特数,则压缩率定义为 C = b / b ′ C=b/b' C=b/b,相对信息冗余定义为 R = 1 − 1 / C R=1-1/C R=11/C
信息冗余主要有三类:编码冗余、空间和时间冗余(像素间冗余)、不相关的信息(心理视觉冗余)
图像压缩的一般框架:
图像压缩的一般框架
每像素的平均比特数的下界为:
L a v g ≥ − ∑ P r ( r k ) log ⁡ 2 P r ( r k ) L_{avg}\geq -\sum P_r(r_k)\log_2P_r(r_k) LavgPr(rk)log2Pr(rk)

常见的无损编码方法

Huffman编码

按符号出现的概率,使出现概率最高的符号获得最长的码字。
操作过程:一开始有n个类,每个类有一个出现概率,然后每次把概率最小的两个类合并,直到最后合并成两个类为止。两个类分别编码为0,1。如果1对应的类是由两个类合并而来,则将两个类分别编码为10和11。

算术编码

从整个符号序列出发,采用递推连续编码。
信源符号与码字无一一对应,而是为整个序列分配了一个单一的算术码字,随着实数间隔变小,信息量增大。
[ 0 , 1 ) [0,1) [0,1)开始,信源序列中每一个符号把当前区间分为几个子区间,并按当前符号选择一个更小的空间。
算法编码图解
关于区间的选择,可以采用自适应上下文相关的概率估计,让概率高的编码符号有更大的子区间,可以使表示方法更佳。

LZW编码

将原始数据中的重复字符串建立一个字串表,并用该重复字串表的索引编码替代原数据。
编码流程如下:
在这里插入图片描述

表示和描述(部分

用适合计算机进一步处理的形式来表达分割后的像素集。分为依据外部特征(边界)和依据内部特征(组成的像素)。表示侧重于数据结构,而描述侧重于区域特性。
描述时应尽可能对大小、平衡、旋转不敏感。

链码

边界看作顺序连接的具有指定长度和方向的直线段组成,每一段用数字编号编码其方向(4连接or8连接)。从起点开始编码,直到回到起点。
由于不同的起点会导致不同的编码:

  • 从固定位置开始(如左上角
  • 用差分代替码字本身
  • 边界描述子:形状数:把循环首差中最小的一项放到最前面(一般是把0放最前面)
其他表示与描述方法(以后再看
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值