图像的矩特征

原文转载自:http://www.cnblogs.com/ronny/p/3985810.html

1. 矩的概念

图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(图像描述量)来描述整个图像,这组数据越简单越有代表性越好。良好的特征不受光线、噪点、几何形变的干扰。图像识别发展几十年,不断有新的特征提出,而图像不变矩就是其中一个。

矩是概率与统计中的一个概念,是随机变量的一种数字特征。设 X X为随机变量, c c为常数, k k为正整数。则量 E[(xc)k] E[(x−c)k]称为 X X关于 c c点的 k k阶矩。

比较重要的有两种情况:

1.  c=0 c=0。这时 ak=E(Xk) ak=E(Xk)称为 X X k k阶原点矩

2.  c=E(X) c=E(X)。这时 μk=E[(XEX)k] μk=E[(X−EX)k]称为 X X k k阶中心矩。

一阶原点矩就是期望。一阶中心矩 μ1=0 μ1=0,二阶中心矩 μ2 μ2就是 X X的方差 Var(X) Var(X)。在统计学上,高于4阶的矩极少使用。 μ3 μ3可以去衡量分布是否有偏。 μ4 μ4可以去衡量分布(密度)在均值附近的陡峭程度如何。

针对于一幅图像,我们把像素的坐标看成是一个二维随机变量 (X,Y) (X,Y),那么一幅灰度图像可以用二维灰度密度函数来表示,因此可以用矩来描述灰度图像的特征。

不变矩(Invariant Moments)是一处高度浓缩的图像特征,具有平移、灰度、尺度、旋转不变性。M.K.Hu在1961年首先提出了不变矩的概念。1979年M.R.Teague根据正交多项式理论提出了Zernike矩。下面主要介绍这两种矩特征的算法原理与实现。

2. Hu矩

一幅 M×N M×N的数字图像 f(i,j) f(i,j),其 p+q p+q阶几何矩 mpq mpq和中心矩 μpq μpq为:

mpq=i=1Mj=1Nipjqf(i,j) mpq=∑i=1M∑j=1Nipjqf(i,j)

μpq=i=1Mj=1N(ii¯)p(jj¯)qf(i,j) μpq=∑i=1M∑j=1N(i−i¯)p(j−j¯)qf(i,j)

其中 f(i,j) f(i,j)为图像在坐标点 (i,j) (i,j)处的灰度值。 i¯=m10/m00,j¯=m01/m00 i¯=m10/m00,j¯=m01/m00

若将 m00 m00看作是图像的灰度质量,则 (i¯,j¯) (i¯,j¯)为图像的质心坐标,那么中心矩 μpa μpa反映的是图像灰度相对于其灰度质心的分布情况。可以用几何矩来表示中心矩,0~3阶中心矩与几何矩的关系如下:

μ00=Mi=1Nj=1(ii¯)0(jj¯)0f(i,j)=m00 μ00=∑i=1M∑j=1N(i−i¯)0(j−j¯)0f(i,j)=m00

μ10=Mi=1Nj=1(ii¯)1(jj¯)0f(i,j)=0 μ10=∑i=1M∑j=1N(i−i¯)1(j−j¯)0f(i,j)=0

μ01=Mi=1Nj=1(ii¯)0(jj¯)1f(i,j)=0 μ01=∑i=1M∑j=1N(i−i¯)0(j−j¯)1f(i,j)=0

μ11=Mi=1Nj=1(ii¯)1(jj¯)1f(i,j)=m11y¯m10 μ11=∑i=1M∑j=1N(i−i¯)1(j−j¯)1f(i,j)=m11−y¯m10

μ20=Mi=1Nj=1(ii¯)2(jj¯)0f(i,j)=m20y¯m01 μ20=∑i=1M∑j=1N(i−i¯)2(j−j¯)0f(i,j)=m20−y¯m01

μ02=Mi=1Nj=1(ii¯)0(jj¯)2f(i,j)=m02y¯m01 μ02=∑i=1M∑j=1N(i−i¯)0(j−j¯)2f(i,j)=m02−y¯m01

μ30=Mi=1Nj=1(ii¯)3(jj¯)0f(i,j)=m302x¯m20+2x¯2m10 μ30=∑i=1M∑j=1N(i−i¯)3(j−j¯)0f(i,j)=m30−2x¯m20+2x¯2m10

μ12=Mi=1Nj=1(ii¯)1(jj¯)2f(i,j)=m122y¯m11x¯m02+2y¯2m10 μ12=∑i=1M∑j=1N(i−i¯)1(j−j¯)2f(i,j)=m12−2y¯m11−x¯m02+2y¯2m10

μ21=Mi=1Nj=1(ii¯)2(jj¯)1f(i,j)=m212x¯m11y¯m20+2x¯2m01 μ21=∑i=1M∑j=1N(i−i¯)2(j−j¯)1f(i,j)=m21−2x¯m11−y¯m20+2x¯2m01

μ03=Mi=1Nj=1(ii¯)0(jj¯)3f(i,j)=m032y¯m02+2y¯2m01 μ03=∑i=1M∑j=1N(i−i¯)0(j−j¯)3f(i,j)=m03−2y¯m02+2y¯2m01

为了消除图像比例变化带来的影响,定义规格化中心矩如下:

ηpq=μpaμγ00,(γ=p+q2,p+q=2,3,) ηpq=μpaμ00γ,(γ=p+q2,p+q=2,3,…)

利用二阶和三阶规格中心矩可以导出下面7个不变矩组 (Φ1 Φ7) (Φ1 Φ7),它们在图像平移、旋转和比例变化时保持不变。

Φ1=η20+η02 Φ1=η20+η02

Φ2=(η20η02)2+4η211 Φ2=(η20−η02)2+4η112

Φ3=(η203η12)2+3(η21η03)2 Φ3=(η20−3η12)2+3(η21−η03)2

Φ4=(η30+η12)2+(η21+η03)2 Φ4=(η30+η12)2+(η21+η03)2

Φ5=(η30+3η12)(η30+η12)[(η30+η12)23(η21+η03)2]+(3η21η03)(η21+η03)[3(η30+η12)2(η21+η03)2] Φ5=(η30+3η12)(η30+η12)[(η30+η12)2−3(η21+η03)2]+(3η21−η03)(η21+η03)[3(η30+η12)2−(η21+η03)2]

Φ6=(η20η02)[(η30+η12)2(η21+η03)2]+4η11(η30+η12)(η21+η03) Φ6=(η20−η02)[(η30+η12)2−(η21+η03)2]+4η11(η30+η12)(η21+η03)

Φ7=(3η21η03)(η30+η12)[(η30+η12)23(η21+η03)2]+]+(3η12η30)(η21+η03)[3(η30+η12)2(η21+η03)2] Φ7=(3η21−η03)(η30+η12)[(η30+η12)2−3(η21+η03)2]+]+(3η12−η30)(η21+η03)[3(η30+η12)2−(η21+η03)2]

3. 利用OpenCV计算Hu矩

opencv里对Hu矩的计算有直接的API,它分为了两个函数:moments()函数用于计算中心矩,HuMoments函数用于由中心矩计算Hu矩。

Moments moments(InputArray array, bool binaryImage=false )

参数说明

  • 输入参数:array是一幅单通道,8-bits的图像,或一个二维浮点数组(Point of Point2f)。binaryImage用来指示输出图像是否为一幅二值图像,如果是二值图像,则图像中所有非0像素看作为1进行计算。
  • 输出参数:moments是一个类:
class Moments
{
public:
    Moments();
    Moments(double m00, double m10, double m01, double m20, double m11,
            double m02, double m30, double m21, double m12, double m03 );
    Moments( const CvMoments& moments );
    operator CvMoments() const;
}

里面保存了图像的2阶与3阶中心矩的值。

void HuMoments(const Moments& moments, double* hu)

参数说明:

  • 输入参数:moments即为上面一个函数计算得到的moments类型。
  • 输出参数:hu是一个含有7个数的数组。
int main(int argc, char** argv) 
{ 
    Mat image = imread(argv[1]);  
    cvtColor(image, image, CV_BGR2GRAY); 
    Moments mts = moments(image); 
    double hu[7]; 
    HuMoments(mts, hu); 
    for (int i=0; i<7; i++) 
    { 
        cout << log(abs(hu[i])) <<endl; 
    } 
   return 0; 
}

上面代码中,最终输出的值为 log|Φi| log|Φi|

我们分别计算一幅图像在,旋转,噪声与模糊时的Hu矩。

qi qi qi qi

类别 log|Φ1| log|Φ1| log|Φ2| log|Φ2| log|Φ3| log|Φ3| log|Φ4| log|Φ4| log|Φ5| log|Φ5| log|Φ6| log|Φ6| log|Φ7| log|Φ7|
原图 -6.76181 -19.1286 -23.7441 -26.776 -51.7618 -35.8491 -51.534
旋转 -6.72102 -19.0844 -23.5756 -25.9122 -51.4619 -35.4595 -50.7674
加放噪点 -6.76086 -19.1255 -23.7611 -26.3228 -51.5056 -35.895 -51.6321
模糊 -6.76183 -19.1295 -23.7451 -26.2767 -51.765 -35.8484 -51.5307

4. Zernike矩

Hu矩在图像描述上有广泛的应用,但是其低阶几何矩与图像整体特征有关,不包含太多的图像细节信息,而高阶几何矩易受噪声影响,因此很难利用几何矩恢复图像。

Zernike矩能够很容易地构造图像的任意高阶矩,并能够使用较少的矩来重建图像。Zernike矩是基于Zernike多项式的正交化函数,虽然其计算比较复杂,但是Zernide矩在图像旋转和低噪声敏感度方面具有较大的优越性。由于Zernike矩具有图像旋转不变性,而且可以构造任意高阶矩,所以被广泛应用对目标进行识别中。

4.1 Zernike矩多项式

首先要弄清楚什么是正交多项式。若函数 W(x) W(x)在区间 (a,b) (a,b)可积,且 W(x)0 W(x)≥0,则可作为权函数。

对于一个多项式的序列 fi fi和权函数 W(x) W(x),定义内积: <fm,fn>=bafm(x)fn(x)W(x)dx <fm,fn>=∫abfm(x)fn(x)W(x)dx

nm,<fm,fn>=0 n≠m,<fm,fn>=0,这些多项式则称为正交多项式。若 fi fi除了正交之外,更有 <fm,fn>=1 <fm,fn>=1的话,则称为规范正交多项式。

那么正交多项式有什么作用呢?答案是:逼近!正交多项式相当于基,任何一个n维多项式函数 f(x) f(x)都可以用一组正交多项式加权求和来逼近。

 

Zernike在1934年提出了在单位圆上定义的一组正交多项式,即Zernike正交多项式,其定义形式为:

Rnm(ρ)=s=0(n|m|)/2(1)s[(ns)!]ρn2ss!(n+|m|2s)!(n+|m|2+s)! Rnm(ρ)=∑s=0(n−|m|)/2(−1)s[(n−s)!]ρn−2ss!(n+|m|2−s)!(n+|m|2+s)!

Vnm(x,y)=Vnm(ρ,θ)=Rnm(ρ)ejmθ Vnm(x,y)=Vnm(ρ,θ)=Rnm(ρ)ejmθ

其中 Rnm(ρ) Rnm(ρ)表示点 (x,y) (x,y)的径向多项式, Vnm(x,y) Vnm(x,y)为Zernike正交多项式, n,m n,m为正交多项式的阶数, n n是非负整数, n|m| n−|m|是偶数,并且 n|m| n≥|m|

Zernike多项式 Vnm(x,y)=Vnm(ρ,θ) Vnm(x,y)=Vnm(ρ,θ)是定义在单位圆 x2+y21 x2+y2≤1上的正交复函数的集合,具有重要的递推性质,即 Rnm Rnm可由 R(n2)m R(n−2)m R(n4)m R(n−4)m得到,公式如下:

Rnm(ρ)=[(K22ρ2+K3)R(n2)m(ρ)+K4R(n4)m(ρ)]K1 Rnm(ρ)=[(K22ρ2+K3)R(n−2)m(ρ)+K4R(n−4)m(ρ)]K1

Rmm(ρ)=ρm Rmm(ρ)=ρm

式中: K1=(n+1)(n1)(n2)/2,K2=2n(n1)(n2),K3=(n1)3,K4=n(n1)(n3)/2 K1=(n+1)(n−1)(n−2)/2,K2=2n(n−1)(n−2),K3=−(n−1)3,K4=−n(n−1)(n−3)/2

4.2 Zernike矩的定义

由于Zernike多项式的正交完备性,所以在单位圆内的任何图像 f(x,y) f(x,y)都可以唯一的用下面式子展开:

f(x,y)=n=0m=0ZnmVn,m(ρ,θ) f(x,y)=∑n=0∞∑m=0∞ZnmVn,m(ρ,θ)

上式中的 Znm Znm就是Zernike矩。

对二维函数 f(x,y) f(x,y)的Zernike矩的定义如下:

Znm=n+1π102π0[Vnm(ρ,θ)]f(ρ,θ)ρdydxdρdθ Znm=n+1π∫01∫02π[Vnm(ρ,θ)]f(ρ,θ)ρdydxdρdθ

=n+1πRnm(ρ)ejmθf(ρ,θ)dρdθ =n+1π∬Rnm(ρ)ejmθf(ρ,θ)dρdθ

式中 ρ=x2+y2(1<x,y<1) ρ=x2+y2(−1<x,y<1) θ θ为轴 x x ρ ρ矢量在逆时针方向的夹角; Rnm(ρ) Rnm(ρ)表示点 (x,y) (x,y)的径向多项式。

4.3 Zernike矩的计算

从Zernike矩的计算公式上来看,对于二维图像,其Zernike矩 Znm Znm为复数,将其实部和虚部分别记为 Cnm Cnm Snm Snm,则有:

Cnm=2n+2π102π0[Rnm(ρ)cos(mθ)f(ρ,θ)ρdρdθ Cnm=2n+2π∫01∫02π[Rnm(ρ)cos(mθ)f(ρ,θ)ρdρdθ

Cnm=2n+2π102π0[Rnm(ρ)sin(mθ)f(ρ,θ)ρdρdθ Cnm=2n+2π∫01∫02π[Rnm(ρ)sin(mθ)f(ρ,θ)ρdρdθ

因为数字图像是离散形式的点,所以需要将上式离散化,把积分号换为求和号,但是需要作一些坐标变换。

对于 N×N N×N的图像 f(x,y) f(x,y),令坐标原点位于图像的中心,则 N/2x,yN/2 −N/2≤x,y≤N/2,对于像素 (x,y) (x,y),引入2个参数 (r,σ) (r,σ),唯一对应于像素,其定义为:

r=max(|x|,|y|) r=max(|x|,|y|)

如果 |x|=r |x|=r,则:

σ=2(rx)y|y|+xyr σ=2(r−x)y|y|+xyr

如果 |y|=r |y|=r,则:

σ=2yxyr σ=2y−xyr

我们容易计算出, r r的取值范围为 1N/2 1∼N/2 σ σ的取值范围是 18r 1∼8r,再根据参数 (r,σ) (r,σ)定义相应的极坐标:

ρ=2r/N,θ=πσ(4r) ρ=2r/N,θ=πσ(4r)

所以,最终我们得到离散化的Zernike矩的计算公式:

Cnm=2n+2N2r=1N/2Rnm(2r/N)σ=18rcosπmσ4rf(r,σ) Cnm=2n+2N2∑r=1N/2Rnm(2r/N)∑σ=18rcosπmσ4rf(r,σ)

Snm=2n+2N2r=1N/2Rnm(2r/N)σ=18rsinπmσ4rf(r,σ) Snm=2n+2N2∑r=1N/2Rnm(2r/N)∑σ=18rsinπmσ4rf(r,σ)

1. 确定图像的大小 N×N N×N,即公式中的 N N

2. 确定 r,σ r,σ的范围;

3. 利用Zernike多项式的递推性质计算各阶 Rnm(ρ) Rnm(ρ),并结合上面Zernike矩计算公式,算出 Cnm,Snm Cnm,Snm

4. 对 Cnm,Snm Cnm,Snm求模,进而计算得到 |Znm| |Znm|

现在我们用Zernike矩来计算美女图像在4种状态下的值:

类别 log|Z11| log|Z11| log|Z20| log|Z20| log|Z22| log|Z22| log|Z31| log|Z31| log|Z40| log|Z40| log|Z42| log|Z42| log|Z44| log|Z44|
原图 11.1732 13.8469 12.3515 12.4391 14.2782 12.6137 11.5745
旋转 12.3036 13.8309 13.5861 12.0467 13.1320 13.8396 12.7862
加放噪点 11.1538 13.8490 12.3315 12.4316 14.2730 12.5925 11.5591
模糊 11.1636 13.8465 12.3480 12.4367 14.2799 12.6130 11.5752

通过表中,可以看出,Zernike在总体上效果比Hu矩更好(PS:感觉在旋转上好像差强人意!)

下面是Zernike矩的matlab实现[来自《现代数字图像-处理技术提高及应用案例详解》],这里偷懒了,有机会的话会把C++版的实现补上。

function        [A_nm,zmlist,cidx,V_nm]        = zernike(img,n,m) 
% 功能:计算输入图像的Zernike矩 
% 输入:img-灰度图像 
%       n-阶数 
% 输出:V_nm-n阶的Zernike多项式,定义为在极坐标系中p,theta的函数 
%       cidx-表示虚部值 
%       A_nm-Zernike矩 

if nargin>0 
if nargin==1 
        n=0; 
end 
d=size(img);                        
img=double(img); 
% 取步长 
xstep=2/(d(1)-1); 
ystep=2/(d(2)-1); 
% 画方格 
[x,y]=meshgrid(-1:xstep:1,-1:ystep:1); 
circle1= x.^2 + y.^2; 
% 提取符合circle1<=1的数 
inside=find(circle1<=1); 
% 构造size(d)*size(d)的矩阵 
mask=zeros(d); 
% 构造size(inside)*size(inside)的全为1的矩阵赋值给mask(inside) 
mask(inside)=ones(size(inside)); 
% 计算图像的复数表示 
[cimg,cidx]=clipimg(img,mask); 
% 计算Z的实部和虚部 
z=clipimg(x+i*y,mask); 
% 计算复数的模,sqrt(x,y),z=x+iy 
p=0.9*abs(z);   ; 
% 计算复数z的辐角值(tanz) 
theta=angle(z); 
c=1; 
for order=1:length(n) 
        n1=n(order); 
           if nargin<3 
                m=zpossible(n1);                
        end 
        for r=1:length(m) 
  V_nmt=zpoly(n1,m(r),p,theta); 
% conj是求复数的共轭 
zprod=cimg.*conj(V_nmt); 
% (n1+1)/π*∑∑(zprod); 对于图像而言求和代替了求积分 
A_nm(c)=(n1+1)*sum(sum(zprod))/pi; 
                zmlist(c,1:2)=[n1 m(r)]; 
                if nargout==4 
                        V_nm(:,c)=V_nmt; 
                end 
                c=c+1; 
        end 
end 
else 
end 

%%%%%子函数%%%%% 
function [cimg,cindex,dim]=clipimg(img,mask) 
%功能:计算复数的实部和虚部 
dim=size(img);  
cindex=find(mask~=0); 
cimg=img(cindex); 
return; 

%%%%%子函数%%%%% 
function  [m]=zpossible(n) 
% 功能:判断n是偶数还是奇数,是偶数时,m取0,2,4,6等,否则取奇数赋值m 
if iseven(n) 
        m=0:2:n; 
else 
        m=1:2:n; 
end 
return; 

%%%%%子函数%%%%% 
function        [V_nm,mag,phase]=zpoly(n,m,p,theta) 
%功能:计算Zernike矩多项式 
R_nm=zeros(size(p)); % 产生size(p)*size(p)的零矩阵赋给R_nm 
a=(n+abs(m))/2; 
b=(n-abs(m))/2; 
total=b; 
for s=0:total 
        num=((-1)^s)*fac(n-s)*(p.^(n-2*s)); % (-1).-1*(n-s)!r.^(n-2*s) 
        den=fac(s)*fac(a-s)*fac(b-s); % s!*(a-s)!*(b-s)! 
        R_nm=R_nm + num/den; % R_nm是一个实数值的径向多项式 
end 
mag=R_nm; % 赋值 
phase=m*theta; 
V_nm=mag.*exp(i*phase); % V_nm为n阶的Zernike多项式,定义为在极坐标系中p,theta的函数 
return; 

%%%%%子函数%%%%% 
function [factorial]=fac(n) 
%功能:求n的阶乘 
maxno=max(max(n)); 
zerosi=find(n<=0); %取n小于等于0的数 
n(zerosi)=ones(size(zerosi)); 
factorial=n; 
findex=n; 
for i=maxno:-1:2 
        cand=find(findex>2); 
        candidates=findex(cand); 
        findex(cand)=candidates-1; 
        factorial(cand)=factorial(cand).*findex(cand); 
end 
return; 

function [verdict]=iseven(candy) 
verdict=zeros(size(candy)); 
isint=find(isint(candy)==1); 
divided2=candy(isint)/2; 
evens=(divided2==floor(divided2)); 
verdict(isint)=evens; 
return; 

function [verdict]=isint(candy) 
verdict        = double(round(candy))==candy; 
return;

5. 总结

不变矩的应用过程一般包括:

  1. 选择合适的不变矩类型;
  2. 选择分类器(如神经网络、最短距离等);
  3. 如果是神经网络分类器,则需要计算学习样例的不变矩去训练神经网络;
  4. 计算待识别对象的不变矩,输入神经网络就可得到待识别对象的类型,或者计算待识别对象不变矩与类别对象不变矩之间的距离,选择最短距离的类别作为待识别对象的类别。

可以看出,不变矩作用主要目的是描述事物(图像)的特征。人眼识别图像的特征往往又表现为“求和”的形式,因此不变矩是对图像元素进行了积分操作。

不变矩能够描述图像整体特征就是因为它具有平移不变形、比例不变性和旋转不变性等性质。

然而,另一方面图像的各阶不变矩究竟代表的什么特征很难进行直观的物理解释。

6. 参考资料

[1] 《现代数字图像处理》(matlab版)

[2] 正交多项式WIKI

[3] opencv形态描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 提取图像特征 图像(Image Moment)是图像处理中一种基本的形状描述方法,它可以用来描述图像的几何特征和灰度特征图像特征包括中心、标准化中心、Hu等。 下面是使用OpenCV库提取图像特征的代码示例: ```python import cv2 # 读取图像 img = cv2.imread('test.jpg') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 计算图像 m = cv2.moments(gray) # 计算中心 cx = int(m['m10'] / m['m00']) cy = int(m['m01'] / m['m00']) # 计算标准化中心 nu20 = m['mu20'] / m['m00'] nu02 = m['mu02'] / m['m00'] nu11 = m['mu11'] / m['m00'] # 计算Hu hu = cv2.HuMoments(m) ``` 2. 提取HOG特征 HOG(Histogram of Oriented Gradients)特征是一种用于图像识别和检测的特征描述子,它可以通过计算图像中每个像素点的梯度方向和大小,进而得到图像特征向量。 下面是使用OpenCV库提取HOG特征的代码示例: ```python import cv2 # 读取图像 img = cv2.imread('test.jpg') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 计算HOG特征 winSize = (64, 64) blockSize = (16, 16) blockStride = (8, 8) cellSize = (8, 8) nbins = 9 hog = cv2.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nbins) feat = hog.compute(gray) ``` 3. 提取LBP特征 LBP(Local Binary Pattern)特征是一种用于图像分类和识别的局部纹理特征描述子,它可以通过对图像中每个像素点的局部区域进行二值化处理,得到一个二进制序列,并将该序列转换为十进制数作为该像素点的LBP特征值。 下面是使用OpenCV库提取LBP特征的代码示例: ```python import cv2 # 读取图像 img = cv2.imread('test.jpg') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 计算LBP特征 radius = 1 n_points = 8 * radius lbp = cv2.ORB_create(n_features=1000, scaleFactor=1.2, nlevels=8, edgeThreshold=15, firstLevel=0, WTA_K=2, patchSize=31, fastThreshold=20) feat = lbp.detectAndCompute(gray, None) ``` 以上是三种常用的图像特征提取方法的Python实现,可以根据需要选择并应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值