|
图像哈希4:基于四元数SVD的奇异值的鲁棒图像哈希图像哈希4:基于四元数SVD的奇异值的鲁棒图像哈希介绍相关工作提出的图像哈希算法预处理通过QSVD进行局部特征提取特征压缩哈希相似度评价相似性度量实验结果主要代码图像哈希系列:图像哈希1:基于四元数离散傅里叶变换和对数极坐标的鲁棒图像哈希算法图像哈希2:基于环形分区和NMF的鲁棒感知图像哈希(CCFA)图像哈希3:基于四元数离散余弦变换的鲁棒感知图像哈希研究(性能优于近年一些较好的研究)图像哈希4:基于四元数SVD的奇异值的鲁棒图像哈希未完待续…欢迎交流图像哈希4:基于四元数SVD的奇异值的鲁棒图像哈希论文1:RobustImageHashingWithSingularValuesOfQuaternionSVD,论文地址doi:https://doi.org/10.1093/comjnl/bxz127摘要:图像哈希是许多多媒体系统的有效技术,如图像检索、图像认证和图像复制检测。鲁棒性和区分度之间的分类是图像哈希最重要的性能之一。该论文提出了一种使用四元奇异值分解(QSVD)奇异值的鲁棒图像哈希方法。主要贡献在于创新性地使用了QSVD,它可以从CIEL∗a∗b∗色彩空间中提取稳定且具有区分度的图像特征。此外,块的图像特征被视为直角坐标中的一个点,并通过计算其点与参考点之间的欧氏距离进行压缩。由于欧氏距离比原始图像块特征所需的存储空间更小,因此这种技术有助于制作具有辨别力且紧凑的哈希值。结果表明,该论文的图像哈希算法可以抵御多种数字运算,并达到良好的判别效果。ROC曲线比较表明,该论文的图像哈希在分类性能上优于当年一些最先进的算法。关键词:图像哈希;四元数矩阵;四元数奇异值分解(QSVD);颜色空间;图像特征介绍图像哈希是许多多媒体系统的有效技术,如图像检索、图像取证、图像认证、图像复制检测、图像水印和图像质量评估等。目前,许多图像哈希算法在鲁棒性和区分度之间难以达到良好的分级,尤其是在处理彩色图像时。四元数是一种有用的数学理论,已被广泛应用于处理彩色图像,如彩色图像去噪、彩色图像配准和彩色图像水印等。然而,如何利用四元数来提高彩色图像哈希的效率还没有得到很好的研究。该论文中,利用四元数奇异值分解(QSVD)开发了一种新型的鲁棒图像哈希算法,它能在鲁棒性和辨识度之间做出很好的权衡。与现有的图像哈希算法相比,该论文的算法主要有以下贡献:(1)提出通过QSVD从CIEL∗a∗b∗色彩空间提取鲁棒图像特征。该论文选择图像块的奇异值作为图像特征。由于奇异值包含了图像块的大部分信息,因此提取的图像特征具有很强的区分度。此外,CIEL∗a∗b∗色彩空间在感知上是统一的。因此,从感知色彩空间提取的图像特征比在其他色彩空间计算的特征更稳定。(2)将图块的图像特征视为直角坐标中的一个点,并通过计算其点与参考点之间的欧氏距离来压缩图块特征。最后,通过连接所有欧氏距离形成图像哈希值。由于欧氏距离比原始图像特征所需的存储空间更小,因此这种技术有助于生成具有辨别力且紧凑的图像哈希值。相关工作图像哈希是一种对输入图像进行紧凑表示的技术。它根据图像的视觉内容,将视觉上相同的图像映射为相同或相似的哈希值。图像哈希的第一个特性被称为鲁棒性。这一特性的要求是,图像哈希应该对正常的数字操作(如JPEG压缩和图像增强)具有鲁棒性。这是因为经过这些数字操作后,处理后的图像仍与原始版本相似,但其数字表示却大不相同。图像哈希的第二个特性被称为辨别力。它要求图像哈希对不同的图像产生不同的哈希值。这一特性至关重要,因为在实际应用中,不同图像的数量远远大于相似图像的数量。在过去几年中,研究人员在图像哈希方面取得了很大进展,并设计了许多算法来提高鲁棒性和区分度的性能。这些算法可分为以下四类。(1)基于正交变换的算法。常用的正交变换包括离散傅里叶变换(DFT)、离散余弦变换(DCT)、离散小波变换(DWT)和四元极余弦变换(QPCT)。例如,Swaminathan等人提出利用极坐标中的DFT特征计算图像哈希。这种哈希算法可抵御适度的几何变换和图像滤波。Qin等人利用DFT和非均匀采样提取图像哈希值。这种方案可以抵御小角度旋转。最近,Laradji等人提出用四元傅里叶变换(QFT)计算哈希值。QFT哈希提高了判别能力,但其鲁棒性仍然不够好。欧阳等人利用四元数傅里叶变换和对数极性变换(LPT)来构建用于身份验证的图像哈希值。这种方法具有良好的鲁棒性,尤其是大角度旋转时。在另一项研究中,Fridrich和Goljan根据DCT系数可指示视觉图像内容的特性,提出了一种用于数字水印的鲁棒哈希方法。Tang等人利用优势DCT系数构建了用于复制检测的鲁棒哈希。这两种哈希方法对图像旋转都很敏感。Wang等人利用Watson基于DCT的视觉模型开发了用于内容验证的图像散哈希。这种方法对图像模糊和图像噪声具有良好的鲁棒性。在另一项研究中,Venkatesan等人利用DWT统计来构建哈希值。这种算法对对比度调整很脆弱。Monga和Evans利用一种称为末端停止小波变换的DWT来寻找视觉点以构建哈希值。这种哈希算法可以抵御JPEG压缩和小角度旋转。Ahmed等人利用DWT和安全哈希算法设计了一种用于身份验证的哈希方案。这种哈希算法对亮度和对比度的调整很敏感。Tang等人提取了每个像素的颜色矢量角(CVA),计算了CVA的块平均值,并通过二维DWT压缩了块平均矩阵。这种哈希算法可以抵御小角度旋转。最近,Li等人通过QPCT提取旋转不变特征来构建哈希值。这种方法速度很快。(2)基于投影变换的算法。著名的投影变换有Radon变换及其称为扇形梁变换(FBT)的变体。Lefebvre等人的早期工作是基于RT投影中点的哈希算法。他们的哈希算法可以抵御几何变换,但辨别能力不强。Wu等人联合使用RT、DWT和DFT建立了一种鲁棒哈希,用于抵御打印扫描的攻击。在另一项研究中,Lei等人在RT域计算矩特征,并使用矩的DFT系数生成哈希值。这种方法可抵御大角度旋转。由于RT的计算成本较高,上述算法都比较耗时。在另一项研究中,利用名为FBT的RT变体提取哈希值。与基于RT的哈希算法相比,基于FBT的哈希算法在运行速度和分类方面都有更好的表现。(3)基于统计特征的算法:图像哈希中广泛使用的统计特征是直方图。例如,Schneider和Chang利用块直方图建立图像哈希。这种哈希算法对JPEG压缩很稳定,但对大角度旋转很敏感。Xiang等人利用直方图的不变性建立了鲁棒哈希。这种方案可以抵御几何变换。最近,Vadlamudi等人计算了块直方图,将直方图分区分布到大型容器中,并利用两个相邻容器之间像素数量的比值来形成哈希值。这种哈希算法对正常的数字操作具有鲁棒性。Tang等人从输入图像中提取CVA,并用DCT压缩CVA直方图,从而生成图像哈希值。这种方法可以抵御大角度旋转。第二个用于图像哈希的著名统计特征是矩。Tang等人利用两种颜色空间中的不变矩得出了图像哈希值。Zhao等人提出了基于Zernike矩和突出区域统计计算哈希值的方法。基于矩的哈希算法一般对几何变换具有鲁棒性,但其辨别能力有待提高。在另一项研究中,欧阳等人利用四元数Zernike矩设计了用于图像认证的哈希算法。该方案可以承受高斯噪声、椒盐噪声和图像滤波,但对亮度调整和伽玛校正比较脆弱。最近,Hosny等人利用四元极复指数变换的矩来构建哈希值。除了直方图和矩外,其他统计特征也有报道。例如,Tang等人提出从HSI和YCbCr色彩空间中提取图像块的局部统计特征。在另一项研究中,Tang等人计算了图像环的感知统计特征,并利用特征向量距离构建哈希值。Qin等人联合使用奇异值分解(SVD)、CVA和Canny算子计算基于圆的方差和基于块的方差,并对其进行量化和加扰,从而得到安全的哈希值。该算法具有良好的感知鲁棒性,但运行速度有待提高。Tang等人计算了输入图像的显著性图,将DWT应用于显著性图,并利用同心圆上DWT系数的统计特征来构建图像哈希。该方案在分类性能上优于哈希算法。(4)基于降维的算法。Kozat等人的早期降维工作是使用SVD。他们使用双SVD计算哈希值来提高旋转鲁棒性,但其代价是辨别性能下降。受和四元数理论的启发,Ghouti提出了一种与类似的图像哈希方法,即用QSVD代替SVD。与哈希方法相比,基于QSVD的哈希方法显示出更好的分类性能,但性能还不够好。在另一项研究中,Davarzani等人联合利用SVD和中心对称局部二进制模式来计算哈希值。这种算法可以抵御JPEG压缩和模糊,但其辨别能力有待提高。非负矩阵因式分解(NMF)也被用于图像哈希。例如,Tang等人在词典框架下利用NMF和DCT设计了一种新的哈希算法。这种哈希算法具有良好的安全性,但对旋转比较敏感。在另一项研究中,Tang等人构建了一个旋转不变的二次图像,并通过NMF从二次图像中学习了一个紧凑的哈希算法。其他有用的降维技术也有报道,如局部线性嵌入(LLE)和多维缩放(MDS)。例如,Sun等人首次将LLE应用于图像哈希设计,并提出利用LLE权重矩阵中的关系来形成图像哈希。这种哈希方案可以抵御JPEG压缩,但对图像旋转很敏感。Tang等人利用MDS得出了图像哈希值。在该方案中,颜色信息未被考虑,因此辨别能力的提高有限。除了上述算法,还研究了其他技术。例如,利用压缩传感提取图像哈希值。文献[54]利用虚拟水印的检测理论设计了高效的图像哈希算法。哈里斯检测器和尺度不变特征变换结合起来构建哈希值。在[56]中,Gabor滤波和晶格矢量量化被联合用于提取哈希值。文献[57]利用自适应和局部特征提取技术设计了多尺度哈希算法。文献[59]选择了块截断编码[58]来计算图像哈希值。在[60]中,利用稀疏编码得出鲁棒哈希。文献[61]选择在之字形块上随机行走来建立安全哈希算法。文献[62]利用显著结构检测和双交叉模式编码来计算哈希值。[61-62]中报告的两种算法都达到了很好的安全性,但它们的分类还不理想。鲁棒性和鉴别力的分类是图像哈希算法最重要的性能之一,但现有的大多数算法在处理彩色图像时并没有达到很好的性能。针对这一问题,该论文提出了一种基于QSVD的新型鲁棒图像哈希算法。所提出的哈希算法通过QSVD从CIEL∗a∗b∗色彩空间提取鲁棒图像特征,并通过计算欧氏距离压缩图像特征。实验结果表明,所提出的算法在鲁棒性和区分度之间的分类性能上优于当年一些最先进的算法。提出的图像哈希算法提出的图像哈希算法分为三个步骤。下图展示了提出的图像哈希算法的框图。第一步,通过一些数字运算对输入图像进行预处理,生成归一化图像。第二步,将归一化图像划分为非重叠块,并通过QSVD从感知色彩空间提取局部块特征。最后,通过计算特征之间的欧氏距离,对局部块特征进行压缩,生成简短的哈希值。这些步骤的详细说明如下。预处理在预处理过程中,该论文利用三种数字运算来减轻常用的内容保护运算对输入图像的影响。首先,利用双线性插值法将输入图像转换成标准尺寸M×M。然后,利用3×3卷积掩码对调整后的图像进行高斯低通滤波。这一操作是为了减少图像噪声的影响。然后,将滤波后的彩色图像转换为感知色彩空间,即CIEL∗a∗b∗空间,其中像素的色彩亮度用L∗表示,像素的色度坐标分别用a∗和b∗表示。一般来说,从RGB空间到CIEL∗a∗b∗空间的映射是通过CIEXYZ空间进行的。假设R是像素的红色分量,G是绿色分量,B是蓝色分量。在此,将彩色图像转换到感知统一空间,因为感知空间中的L∗颜色分量与人类感知的亮度相匹配,而且从感知空间提取的哈希值比用其他颜色空间计算的哈希值显示出更好的分类性能。下图为对预处理之后的lenna图像转化为CIEL∗a∗b∗空间。通过QSVD进行局部特征提取在这里先回顾一下四元数的基础知识。四元数是复数的泛化,有四个部分:一个实部和三个虚部,可以写成:q=a+bi+cj+dkq=a+bi+cj+dkq=a+bi+cj+dk其中a,b,c和d是实数,i,j和k是服从以下规则的虚部:i2=j2=k2=−1,ij=−ji=k,jk=−kj=i,ki=−ik=ji^2=j^2=k^2=-1,ij=-ji=k,jk=-kj=i,ki=-ik=ji2=j2=k2=−1,ij=−ji=k,jk=−kj=i,ki=−ik=j四元数的乘法规则不是交换式的。四元数q的共轭和模数分别定义如下:q‾=a−bi−cj−dk,∣q∣=a2+b2+c2+d2.\overlineq=a-bi-cj-dk,\left|q\right|=\sqrt{a^2+b^2+c^2+d^2}.q=a−bi−cj−dk,∣q∣=a2+b2+c2+d2.具有零实部的四元数q称为纯四元数。空间位置(x,y)上彩色图像f的一个像素有三个分量,可以表示为纯四元数:f(x,y)=fR(x,y)i+fG(x,y)j+fB(x,y)k,f(x,y)=f_R(x,y)i+f_G(x,y)j+f_B(x,y)k,f(x,y)=fR(x,y)i+fG(x,y)j+fB(x,y)k,fR(x,y),fG(x,y),fB(x,y)f_R(x,y),f_G(x,y),f_B(x,y)fR(x,y),fG(x,y),fB(x,y)分别是f(x,y)f(x,y)f(x,y)的RGB分量值。在本文中,利用CIEL∗a∗b∗颜色空间的颜色分量来代替RGB颜色空间的颜色分量。换句话说,使用L∗组件、a∗组件和b∗组件来替换fR(x,y),fG(x,y),fB(x,y)f_R(x,y),f_G(x,y),f_B(x,y)fR(x,y),fG(x,y),fB(x,y)。这里选择CIEL*a*b*颜色空间作为颜色空间是基于CIEL∗a∗b∗颜色空间在感知上是均匀的,从感知颜色空间中提取的图像特征比其他颜色空间中计算的图像特征更稳定。由于彩色图像可以用纯四元数矩阵表示,因此我们可以利用QSVD从纯四元数矩阵推导出鲁棒哈希值。假设A∈HM×MA\inH^{M×M}A∈HM×M是一个秩为r的四元数矩阵:A=U(∑r000)V△A=U(∑r000)(∑r000)V^\bigtriangleupA=U(∑r000)V△其中,U∈HM×MU\inH^{M×M}U∈HM×M和V∈HM×MV\inH^{M×M}V∈HM×M是四元数单元矩阵,分别包含A的左奇异向量和右奇异向量;△\bigtriangleup△是四元数转置-共轭算子;∑r\sum_r∑r是实数对角矩阵,其非零项为A的奇异值。QSVD的高效算法总结如下:(i)计算四元数矩阵的等效复数矩阵;(ii)用复数矩阵的常规SVD方法对等效复数矩阵进行SVD;(iii)由于四元数矩阵的奇异值在等效复数矩阵的SVD结果中出现两次,可通过删除重复元素提取奇异值;(iv)利用等效复数矩阵的单元矩阵计算四元数矩阵的四元数单元矩阵。有关该算法的更多详情,请参阅文献。为了通过QSVD提取局部特征,论文将预处理图像的四元数矩阵划分为m×m大小的非重叠块。为简单起见,令M为m的整数倍。因此,总共有N=(M/m)2N=(M/m)^2N=(M/m)2个块。假设Bi(q)B^{(q)}_iBi(q)(1≤i≤N)是四元数矩阵的第i个块,索引顺序为从上到下、从左到右。我们对每个块Bi(q)B^{(q)}_iBi(q)应用QSVD。Bi(q)B^{(q)}_iBi(q)的QSVD公式定义如下:Bi(q)=Ui(q)Si(Vi(q))Δ\mathbf{B}_{i}^{(q)}=\mathbf{U}_{i}^{(q)}\mathbf{S}_{i}\left(\mathbf{V}_{i}^{(q)}\right)^{\Delta}Bi(q)=Ui(q)Si(Vi(q))Δ其中Ui(q)U^{(q)}_iUi(q)和Vi(q)V^{(q)}_iVi(q)是Bi(q)B^{(q)}_iBi(q)的左右奇异向量,Si=diag(σi,1,σi,2,...,σi,m)S_i=diag(σ_{i,1},σ_{i,2},...,σ_{i,m})Si=diag(σi,1,σi,2,...,σi,m)是由奇异值组成的实数对角矩阵,其中σi,1≥σi,2≥...≥σi,mσ_{i,1}≥σ_{i,2}≥...≥σ_{i,m}σi,1≥σi,2≥...≥σi,m。本文选择Bi(q)B^{(q)}_iBi(q)的第一奇异值和第二奇异值作为块特征,分别用pi(1)=Si(1,1)=σi,1p^{(1)}_i=S_i(1,1)=σ_{i,1}pi(1)=Si(1,1)=σi,1和pi(2)=Si(2,2)=σi,2p^{(2)}_i=S_i(2,2)=σ_{i,2}pi(2)=Si(2,2)=σi,2表示。在此,我们选择第一奇异值和第二奇异值作为特征。这是考虑到幅度较大的奇异值代表了图像中最多的信息。接下来,我们分别将所有块的第一奇异值和第二奇异值连接起来,然后得到两个向量p(1)和p(2),如下所示:p(1)=[p1(1),p2(1),...,pN(1)]p(2)=[p1(2),p2(2),...,pN(2)]p^{(1)}=\left[p_1^{(1)},p_2^{(1)},...,p_N^{(1)}\right]\\p^{(2)}=\left[p_1^{(2)},p_2^{(2)},...,p_N^{(2)}\right]p(1)=[p1(1),p2(1),...,pN(1)]p(2)=[p1(2),p2(2),...,pN(2)]这两个向量就是输入图像的局部特征。显然,这些特征的总数为2N。需要注意的是,在图像哈希中使用的QSVD与[47]不同。具体来说,Ghouti[47]使用RGB色彩空间构建输入图像的四元数矩阵,而该论文的图像哈希利用CIEL∗a∗b∗色彩空间形成四元数矩阵。此外,Ghouti[47]选择奇异向量作为图像特征,而该论文的图像哈希使用奇异值来生成图像特征。实验比较表明,该论文的图像哈希算法比Ghouti[47]提出的哈希算法具有更好的分类性能。特征压缩由于每个区块都会提取两个特征,该论文将区块特征视为直角坐标中的一个点,即(pi(1),pi(2))(p^{(1)}_i,p^{(2)}_i)(pi(1),pi(2)),并通过计算其点与参考点之间的欧氏距离来压缩区块特征。为此,首先要对数据进行如下归一化处理。xi=Pi(1)−μp(1)δp(1)yi=Pi(2)−μp(2)δp(2)x_i=\frac{P_i^{(1)}-\mu_{p^{(1)}}}{\delta_{p^{(1)}}}\\y_i=\frac{P_i^{(2)}-\mu_{p^{(2)}}}{\delta_{p^{(2)}}}xi=δp(1)Pi(1)−μp(1)yi=δp(2)Pi(2)−μp(2)其中,μp(1)\mu_{p^{(1)}}μp(1)和μp(2)\mu_{p^{(2)}}μp(2)分别是p(1)p^{(1)}p(1)和p(2)p^{(2)}p(2)的均值,δp(1){\delta_{p^{(1)}}}δp(1)和δp(2){\delta_{p^{(2)}}}δp(2)分别是p(1)和p(2)的标准差。它们的定义如下μp(1)=1N∑i=1Npi(1)μp(2)=1N∑i=1Npi(2)\mu_{p^{(1)}}=\frac{1}{N}\sum_{i=1}^{N}p_i^{(1)}\\\mu_{p^{(2)}}=\frac{1}{N}\sum_{i=1}^{N}p_i^{(2)}\\μp(1)=N1i=1∑Npi(1)μp(2)=N1i=1∑Npi(2)为了计算欧氏距离,需要生成一个参考点(xμ,yμ)(x_μ,y_μ)(xμ,yμ),其中xμ和yμ是x和y的均值,定义如下:xμ=1N∑i=1Nxiyμ=1N∑i=1Nyix_{\mu}=\frac{1}{N}\sum_{i=1}^{N}x_i\\y_{\mu}=\frac{1}{N}\sum_{i=1}^{N}y_ixμ=N1i=1∑Nxiyμ=N1i=1∑Nyi接下来,第i个块(xi,yi)(x_i,y_i)(xi,yi)和参考点(xμ,yμ)(x_μ,y_μ)(xμ,yμ)点之间的欧几里得距离由下式确定。di=(xi−xμ)2+(yi−yμ)2d_i=\sqrt{(x_i-x_{\mu})^2+(y_i-y_{\mu})^2}di=(xi−xμ)2+(yi−yμ)2由于di是一个浮点数,它被进一步量化为整数,用于通过以下方程减少存储。h(i)=[di×100+0.5]h(i)=\left[d_i\times100+0.5\right]h(i)=[di×100+0.5]其中[·]是四舍五入运算。最后,我们将这些整数连接起来,就能得到图像哈希值:h=[h(1),h(2),...,h(N)]h=[h(1),h(2),...,h(N)]h=[h(1),h(2),...,h(N)]因此,算法的长度为N个整数。在实验中,发现图像哈希元素可以用10位表示,因此我们的哈希长度为10N位。哈希相似度评价由于得到的图像哈希是一个整数表示,两个图像哈希的相似性可以通过L2范数来衡量。令h1=[h1(1),h1(2),…,h1(N)]h_1=[h_1(1),h_1(2),…,h_1(N)]h1=[h1(1),h1(2),…,h1(N)]和h2=[h2(1),h2(2),…],h2(N)]h2=[h2(1),h2(2),…],h2(N)]h2=[h2(1),h2(2),…],h2(N)]表示两幅图像的哈希值。因此,它们的L2范数由下式确定:d(h1,h2)=∑i=1N[h1(l)−h2(l)]2d(h_1,h_2)=\sqrt{\sum_{i=1}^{N}\left[h_1(l)-h_2(l)\right]^2}d(h1,h2)=i=1∑N[h1(l)−h2(l)]2其中h1(l)h_1^{(l)}h1(l)和h2(l)h_2^{(l)}h2(l)分别是h1和h2的第lll个元素。通常,较小的L2范数意味着更相似的输入哈希图像。如果L2范数大于阈值T,输入哈希的图像被认为是不同的图像。否则,它们是视觉上相似的图像。值:h(i)={0,diSc.shape[1]:Sq=np.sum(Sc,axis=1)else:Sq=np.sum(Sc,axis=0)Sq=Sq[0::2]Sq=Sq.reshape(1,-1)#奇异值#对奇异值进行排序IX=np.argsort(-np.abs(Sq))Sq=Sq[0,IX]returnSqdefget_hash(img):###LocalfeatureextractionviaQSVD##1.createthequaternionrepresentationoftheimagelab_image=preprocessing(img)N,M,D=lab_image.shape#print(N,M,D)Q=np.zeros((N,M,D+1))Q[:,:,1:]=lab_image##2.Non-overlappingchunkingofpreprocessedquaternionmatricesblockSize=64;#定义块大小numBlocks=int(N//blockSize)p1=np.zeros(blockSize)p2=np.zeros(blockSize)foriinrange(numBlocks):forjinrange(numBlocks):#计算块的起始索引与结束索引rowStart=i*blockSizerowEnd=(i+1)*blockSizecolStart=j*blockSizecolEnd=(j+1)*blockSize#print(rowStart,rowEnd,colStart,colEnd)Sq=QSVD(Q[rowStart:rowEnd,colStart:colEnd,:])p1[i*numBlocks+j]=Sq[0,0]p2[i*numBlocks+j]=Sq[0,1]###归一化x=(p1-np.mean(p1))/np.std(p1)y=(p2-np.mean(p2))/np.std(p2)#计算参考点(分别为x和y的平均值)x_mean=np.mean(x)y_mean=np.mean(y)#计算欧氏距离d=np.sqrt((x-x_mean)**2+(y-y_mean)**2)#浮点数量化为浮点数h=np.fix(d*100+0.5).astype(int)returnh123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
|
|