一种DWT域基于IFS的数字水印算法

2024-02-15 21:10

本文主要是介绍一种DWT域基于IFS的数字水印算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

随着多媒体和网络技术的迅速发展与广泛应用,数字化媒体(如数字图像、数字视频和音频等)的传输和获取变得越来越便捷,一方面促进了人类信息的共享,推动了社会的进步,而另一方面由于其极易复制且复制后的媒体质量与原版几乎没有差异,因此也带来了数字多媒体的版权问题。数字水印技术作为版权保护的重要手段而得到了广泛的研究和应用。

现有图像数字水印算法基本上可分为两类:空间域方法和变换域方法。空域法通过直接改变图像某些像素的灰度值来嵌入水印,如LSB、扩展频谱[1]等;而变换域方法先把图像做某种变换,例如DCT、DWT,然后通过改变某些变换系数嵌入水印[2,3]。随着JPEG2000和MPEG-4标准的建立,目前大量的数字水印技术研究集中在DWT域,因为在DWT域嵌入水印可以提高水印对最新图像压缩处理的攻击。但是在DWT域嵌入水印也有其弱点,例如抵抗缩放等几何形变攻击能力较弱。文献[4]介绍了一种基于IFS (Iterated Function System)的可以抵抗几何形变的空域数字水印方法。此方法的缺点是嵌入的水印信息只能是英文字母,而且对部分字母识别能力较差,水印抵抗JPEG压缩攻击的能力较弱。本文采用具有实际意义的汉字和二值图像作为水印,利用IFS生成可抵抗几何形变的双重数字水印信息,并且嵌入DWT域低频区域系数矩阵,以提高其抵抗常见图像处理攻击的能力。经实验证明,该方法对常见的攻击有较好的鲁棒性,同时满足了水印信息的不可见性。

1 水印的嵌入原理

1.1 自相似水印分形图的生成

二维IFS是研究二维图像分形压缩和编码的基础,通过对图像的旋转、缩放和扭曲、反演等变成另一自相似图像。将汉字水印信息转化为自相似分形图,也就是将汉字水印信息转化为自相似水印分形图的IFS变换参数。IFS的基本形式为:

其中θ、α、ι1、ι2、e、f分别为旋转角度、扭曲角度、坐标轴伸缩比例和平移参数。

汉字存储编码有区位码和机内码。这里将区位码转化为IFS参数。常用汉字的区码M范围为16~55,定义映射F:M→θ

θ=F(M) =8×(M—15)+4     (2)

(2)式是先将M转化为1~40整数,编为6位二进制编码(000001)~(101000),再在其后面添加(100),则M对应编码为(000001100)~(101000100)。通过上述变换将汉字信息区码转化为仿射变换的旋转角度,变换后θ的范围是[12,324]。

又由于常用汉字的位码N为1~94。定义映射G:N→[aa,bb]→[a,b]

[aa,bb]=G(N)=[((N+5)div(10))+6,((N+5)mod(10)+6)];    (3)

[a,b]=[(aa×16+8)/250,(bbx16+8)/250]     (4)

其中(3)式是将N变换为6~15之间的一个整数对;(4)式是将变换所得整数对分别进行二进制编码,再在各个编码后添加(1000),为保证仿射变换的压缩性,全部除以250。通过上述变换后,a,b范围是[0.416,0.992],其中[a,b)是一个实数对。

    将θ、a、b值代人上述仿射变换公式中,令α=0,e、f的值根据具体情况而定。假设水印信息W1为{S1,S2,S3:其中Si是常用汉字},根据上面定义的影射转化为迭代函数系{R2;ω0,ω1,ω2,ω3}。其中ωi(对应Si,ω0对应(θ0=0,a0=b0=1),作为第一水印检测的参考图。由于上述两个变换都是一对一映射,可以很容易求得其反变换过程。

取第二水印W2为一幅KxK的二值图像,分别通过上述变换ωi将第二水印信息影射为一个大小为2K×2K的自相似水印分形图W.映射方式如图1所示。

1.2 水印嵌入方法

数字水印的嵌入步骤如下:

(1)将原始图像进行L层小波分解得到3L+1个子带。选择L使其低频子带A系数为与自相似水印分形图W大小相同的矩阵。

(2)引入一个与自相似水印分形大小一致的二值图像B。此图像的单数行为101010…,而其偶数行为010101…,或互换。

(3)从自相似水印分形图W中取像素W(i,j)。

(4)如果W(i,j)值为0,则令A ,(i,j)=A(i,j),转入第(6)步。

(5)如果W( i,j)值为1,从参考图像B中取对应像素B(i,j);如果B(i,j)=1,则令A (i,j)=A(i,j)+d;否则,令A (i,j)=A(i,j)-d。其中d>0,取值视载体图像而定。

(6)重复(3)、(4)、(5)直到取完自相似水印分形图W中的所有像素点。

(7)利用修改后的系数矩阵进行小波反变换,重构带有水印信息的原始图像。

图2

    1.3 水印检测方法

在自相似水印的提取算法中,用到了拉普拉斯(Laplace)算子与两个矩阵像素块E、F,其中E=[1 0 1;01 0;1 0 1]3×3,F=[0 1 0;1 0 1;0 1 0]3×3。

(1)将带有水印信息的图像进行L层小波分解,提取出低频子带系数矩阵。

(2)利用拉氏算子的图像边缘检测功能由待检测的系数矩阵A’生成与其大小一致的三值(0,1,2)图像G。具体生成算法如下:

①拉氏算子计算G(i,j)=A (i-1,j)+A (i+1,j)+A (i,j-1)+A (i,j+1)-4A (i,j)。

②如果G(i,j)> ε,则令G(i,j)=0;否则如果G(i,j)<-ε,则令G(ij)=1,否则G(i,j)=2。其中ε>0,其大小与d取值有关(下面ξ同ε)。

③重复上述两步,直到生成三值图像G。计算G的第1行列和最后1行列时用第2行列和倒数第2行列替代。

(3)用W 表示提取出的自相似水印分形图。由三值图像G生成W 的算法如下:

① 从G中取以G(i,j)为中心的3x3像素块,记为G33。

② 统计G33与E、F块对应位置上像素值相同的像素点个数,分别记为SE和SF。

③ 如果SE>ξ或者SF>ξ,则令W (i,j)=1;否则令W (i,j)=0;ξ>0。

③ 重复前三步,直到取完上面所有的点。求第1行列和最后1行列的补救方法与上面求三值图像的方法

(4)从W’中提取汉字水印信息。在二值图像W 中对各部分任意取三个对应点,根据变换公式确定对应变换系数,将系数变换为汉字的区位码即可得对应汉字信息。

2 实验结果

2.1 双重水印信息的鲁棒性测试

实验中载体图像采用512x512的标准LENA灰度测试图像,第1水印信息使用“王小林”三个汉字,第2水印信息采用128x128的带有“理工科技”四个字的二值图章图像,原始载体图像小波分解时采用紧支双正交的db3小波(使用该小波函数可以减少提取自相似水印分形图时采用的替代措施),分解层级L为1。实验中d取16,ε取4,ξ取8。水印信息为二值图像,用肉眼可观察各种攻击后的检测效果,所以将检测出的双重水印图像与嵌入前的双重水印图像并放在一起,以便对照水印嵌入前后的差别(检测结果中左半部分为嵌入前双重水印图像,右半部分为检测出的双重水印图像)。常见的攻击测试,包括JPEG图像压缩(压缩因子40~90)、均值和高斯滤波、图像在不同灰度级上的量化、A/D及D/A转换、缩放、旋转、部分剪切、噪声叠加等。其测试结果如图2所示。

2.2第1汉字水印信息的提取

如果需要提取第1水印,则将提取出的双重水印图像置于一坐标系中,对应每一部分图形块取出对应的三个点坐标,根据对应三个点的坐标数值代人仿射变换公式,求出对应部分图形的对应变换ωi的参数,再根据水印转化公式的反变换确定出对应汉字的区位码信息,进而确定出对应的汉字。如图3和表1所示。

表1 由自相似水印分形图像取出的对应点确定对应汉字信息

     项
 点
第1个点第二个点第三个点旋转角度横轴缩放a纵轴缩放b对应区码对应位码水印汉字
参考点43,1632,3249,54011   
第一个字183,90196,96194,792440.9920.4164585
第二个字25,20238,20456,1992580.9280.8004801
第三个字229,224229,206207,1951480.7360.9923354

2.3 峰峰信噪比

本文采用峰峰信噪比(PSNR)作为嵌入水印后重构图像质量的客观评价指标,其计算公式为:

其中,f(i,j)与f'(i,j)为嵌入水印前后图像的灰度值,MSE为均方误差。

按式(5)、(6)来计算,本算法嵌入水印后的峰峰信噪比PSNR=30.1550dB;由文献[5]可知,当PSNR超过30dB时,人的视觉很难分辨出原始图像和重构图像的差异。因此本算法完全满足水印信息的不可见性。

2.4 水印检测的相关性

由于本算法所采用的水印为二值数字图像,为了客观表示检测出的水印信息与原水印信息的相近程度,定义相关系数为:

ρ:WEQU/WALL     (7)

其中,WEQU=[相同位置W=W 的个数];[正确检测的水印像素数目],WALL=[W像素总数]。本实验中WALL=256x256。

由以上定义可知,ρ不但表示了水印信息前后的相关程度,而且也表示出了水印信息检测的正确率,即水印信息被正确检测出的百分比率。ρ越大意味着水印信息的鲁棒性越强。本实验结果如表2所示。

由表2可以看出,对带有水印信息的图像进行各种常见的攻击后,水印信息检测的正确率都大于57%,说明该算法对常见攻击具有较强的鲁棒性。

表2 各种功击后自相似水印检测相关关系数表

攻击名无攻击时A/D、D/AJPEG(40)JPEG(50)JPEG(60)JPEG(70)JPEG(80)JPEG(90)
ρ0.88550.88550.82240.85980.86330.85260.86840.8783
攻击名放大到1.25缩小到0.75反转15℃部分剪切均值滤波高斯滤波纳盐噪声高斯噪声
ρ0.88550.75870.78790.61420.59610.86100.57070.8497

本文提出了利用IFS将一组汉字水印和一图像水印映射为双重水印信息,再将双重水印信息利用LAPLACE算子的图像边缘检测功能嵌入小波域低频逼近系数矩阵的鲁棒数字水印改进算法。仿真结果表明,小波域的低频逼近系数矩阵不是水印信息的禁区,将水印信息嵌入低频系数矩阵,可以更好地抵抗图像压缩;而仿射变换的利用提高了水印信息抵抗几何形变的性能。两者的结合,不但能保证水印信息的鲁棒性,同时保证了水印信息的不可见性。同时也表明,本文所提出的方法有很强的抗常见图像处理攻击的能力。对彩色图像,如果先进行分量变换,对变换分量后的某一通道或者多个通道进行小波分解,选取其低频区域嵌入水印信息,同样可得到很好的效果。

取第二水印W2为一幅KxK的二值图像,分别通过上述变换ωi将第二水印信息影射为一个大小为2K×2K的自相似水印分形图W.映射方式如图1所示。

1.2 水印嵌入方法

数字水印的嵌入步骤如下:

(1)将原始图像进行L层小波分解得到3L+1个子带。选择L使其低频子带A系数为与自相似水印分形图W大小相同的矩阵。

(2)引入一个与自相似水印分形大小一致的二值图像B。此图像的单数行为101010…,而其偶数行为010101…,或互换。

(3)从自相似水印分形图W中取像素W(i,j)。

(4)如果W(i,j)值为0,则令A ,(i,j)=A(i,j),转入第(6)步。

(5)如果W( i,j)值为1,从参考图像B中取对应像素B(i,j);如果B(i,j)=1,则令A (i,j)=A(i,j)+d;否则,令A (i,j)=A(i,j)-d。其中d>0,取值视载体图像而定。

(6)重复(3)、(4)、(5)直到取完自相似水印分形图W中的所有像素点。

(7)利用修改后的系数矩阵进行小波反变换,重构带有水印信息的原始图像。

图2

    1.3 水印检测方法

在自相似水印的提取算法中,用到了拉普拉斯(Laplace)算子与两个矩阵像素块E、F,其中E=[1 0 1;01 0;1 0 1]3×3,F=[0 1 0;1 0 1;0 1 0]3×3。

(1)将带有水印信息的图像进行L层小波分解,提取出低频子带系数矩阵。

(2)利用拉氏算子的图像边缘检测功能由待检测的系数矩阵A’生成与其大小一致的三值(0,1,2)图像G。具体生成算法如下:

①拉氏算子计算G(i,j)=A (i-1,j)+A (i+1,j)+A (i,j-1)+A (i,j+1)-4A (i,j)。

②如果G(i,j)> ε,则令G(i,j)=0;否则如果G(i,j)<-ε,则令G(ij)=1,否则G(i,j)=2。其中ε>0,其大小与d取值有关(下面ξ同ε)。

③重复上述两步,直到生成三值图像G。计算G的第1行列和最后1行列时用第2行列和倒数第2行列替代。

(3)用W 表示提取出的自相似水印分形图。由三值图像G生成W 的算法如下:

① 从G中取以G(i,j)为中心的3x3像素块,记为G33。

② 统计G33与E、F块对应位置上像素值相同的像素点个数,分别记为SE和SF。

③ 如果SE>ξ或者SF>ξ,则令W (i,j)=1;否则令W (i,j)=0;ξ>0。

③ 重复前三步,直到取完上面所有的点。求第1行列和最后1行列的补救方法与上面求三值图像的方法

(4)从W’中提取汉字水印信息。在二值图像W 中对各部分任意取三个对应点,根据变换公式确定对应变换系数,将系数变换为汉字的区位码即可得对应汉字信息。

2 实验结果

2.1 双重水印信息的鲁棒性测试

实验中载体图像采用512x512的标准LENA灰度测试图像,第1水印信息使用“王小林”三个汉字,第2水印信息采用128x128的带有“理工科技”四个字的二值图章图像,原始载体图像小波分解时采用紧支双正交的db3小波(使用该小波函数可以减少提取自相似水印分形图时采用的替代措施),分解层级L为1。实验中d取16,ε取4,ξ取8。水印信息为二值图像,用肉眼可观察各种攻击后的检测效果,所以将检测出的双重水印图像与嵌入前的双重水印图像并放在一起,以便对照水印嵌入前后的差别(检测结果中左半部分为嵌入前双重水印图像,右半部分为检测出的双重水印图像)。常见的攻击测试,包括JPEG图像压缩(压缩因子40~90)、均值和高斯滤波、图像在不同灰度级上的量化、A/D及D/A转换、缩放、旋转、部分剪切、噪声叠加等。其测试结果如图2所示。

2.2第1汉字水印信息的提取

如果需要提取第1水印,则将提取出的双重水印图像置于一坐标系中,对应每一部分图形块取出对应的三个点坐标,根据对应三个点的坐标数值代人仿射变换公式,求出对应部分图形的对应变换ωi的参数,再根据水印转化公式的反变换确定出对应汉字的区位码信息,进而确定出对应的汉字。如图3和表1所示。

表1 由自相似水印分形图像取出的对应点确定对应汉字信息

     项
 点
第1个点第二个点第三个点旋转角度横轴缩放a纵轴缩放b对应区码对应位码水印汉字
参考点43,1632,3249,54011   
第一个字183,90196,96194,792440.9920.4164585
第二个字25,20238,20456,1992580.9280.8004801
第三个字229,224229,206207,1951480.7360.9923354

2.3 峰峰信噪比

本文采用峰峰信噪比(PSNR)作为嵌入水印后重构图像质量的客观评价指标,其计算公式为:

其中,f(i,j)与f'(i,j)为嵌入水印前后图像的灰度值,MSE为均方误差。

按式(5)、(6)来计算,本算法嵌入水印后的峰峰信噪比PSNR=30.1550dB;由文献[5]可知,当PSNR超过30dB时,人的视觉很难分辨出原始图像和重构图像的差异。因此本算法完全满足水印信息的不可见性。

2.4 水印检测的相关性

由于本算法所采用的水印为二值数字图像,为了客观表示检测出的水印信息与原水印信息的相近程度,定义相关系数为:

ρ:WEQU/WALL     (7)

其中,WEQU=[相同位置W=W 的个数];[正确检测的水印像素数目],WALL=[W像素总数]。本实验中WALL=256x256。

由以上定义可知,ρ不但表示了水印信息前后的相关程度,而且也表示出了水印信息检测的正确率,即水印信息被正确检测出的百分比率。ρ越大意味着水印信息的鲁棒性越强。本实验结果如表2所示。

由表2可以看出,对带有水印信息的图像进行各种常见的攻击后,水印信息检测的正确率都大于57%,说明该算法对常见攻击具有较强的鲁棒性。

表2 各种功击后自相似水印检测相关关系数表

攻击名无攻击时A/D、D/AJPEG(40)JPEG(50)JPEG(60)JPEG(70)JPEG(80)JPEG(90)
ρ0.88550.88550.82240.85980.86330.85260.86840.8783
攻击名放大到1.25缩小到0.75反转15℃部分剪切均值滤波高斯滤波纳盐噪声高斯噪声
ρ0.88550.75870.78790.61420.59610.86100.57070.8497

本文提出了利用IFS将一组汉字水印和一图像水印映射为双重水印信息,再将双重水印信息利用LAPLACE算子的图像边缘检测功能嵌入小波域低频逼近系数矩阵的鲁棒数字水印改进算法。仿真结果表明,小波域的低频逼近系数矩阵不是水印信息的禁区,将水印信息嵌入低频系数矩阵,可以更好地抵抗图像压缩;而仿射变换的利用提高了水印信息抵抗几何形变的性能。两者的结合,不但能保证水印信息的鲁棒性,同时保证了水印信息的不可见性。同时也表明,本文所提出的方法有很强的抗常见图像处理攻击的能力。对彩色图像,如果先进行分量变换,对变换分量后的某一通道或者多个通道进行小波分解,选取其低频区域嵌入水印信息,同样可得到很好的效果。

在自相似水印的提取算法中,用到了拉普拉斯(Laplace)算子与两个矩阵像素块E、F,其中E=[1 0 1;01 0;1 0 1]3×3,F=[0 1 0;1 0 1;0 1 0]3×3。

(1)将带有水印信息的图像进行L层小波分解,提取出低频子带系数矩阵。

(2)利用拉氏算子的图像边缘检测功能由待检测的系数矩阵A’生成与其大小一致的三值(0,1,2)图像G。具体生成算法如下:

①拉氏算子计算G(i,j)=A (i-1,j)+A (i+1,j)+A (i,j-1)+A (i,j+1)-4A (i,j)。

②如果G(i,j)> ε,则令G(i,j)=0;否则如果G(i,j)<-ε,则令G(ij)=1,否则G(i,j)=2。其中ε>0,其大小与d取值有关(下面ξ同ε)。

③重复上述两步,直到生成三值图像G。计算G的第1行列和最后1行列时用第2行列和倒数第2行列替代。

(3)用W 表示提取出的自相似水印分形图。由三值图像G生成W 的算法如下:

① 从G中取以G(i,j)为中心的3x3像素块,记为G33。

② 统计G33与E、F块对应位置上像素值相同的像素点个数,分别记为SE和SF。

③ 如果SE>ξ或者SF>ξ,则令W (i,j)=1;否则令W (i,j)=0;ξ>0。

③ 重复前三步,直到取完上面所有的点。求第1行列和最后1行列的补救方法与上面求三值图像的方法

(4)从W’中提取汉字水印信息。在二值图像W 中对各部分任意取三个对应点,根据变换公式确定对应变换系数,将系数变换为汉字的区位码即可得对应汉字信息。

2 实验结果

2.1 双重水印信息的鲁棒性测试

实验中载体图像采用512x512的标准LENA灰度测试图像,第1水印信息使用“王小林”三个汉字,第2水印信息采用128x128的带有“理工科技”四个字的二值图章图像,原始载体图像小波分解时采用紧支双正交的db3小波(使用该小波函数可以减少提取自相似水印分形图时采用的替代措施),分解层级L为1。实验中d取16,ε取4,ξ取8。水印信息为二值图像,用肉眼可观察各种攻击后的检测效果,所以将检测出的双重水印图像与嵌入前的双重水印图像并放在一起,以便对照水印嵌入前后的差别(检测结果中左半部分为嵌入前双重水印图像,右半部分为检测出的双重水印图像)。常见的攻击测试,包括JPEG图像压缩(压缩因子40~90)、均值和高斯滤波、图像在不同灰度级上的量化、A/D及D/A转换、缩放、旋转、部分剪切、噪声叠加等。其测试结果如图2所示。

2.2第1汉字水印信息的提取

如果需要提取第1水印,则将提取出的双重水印图像置于一坐标系中,对应每一部分图形块取出对应的三个点坐标,根据对应三个点的坐标数值代人仿射变换公式,求出对应部分图形的对应变换ωi的参数,再根据水印转化公式的反变换确定出对应汉字的区位码信息,进而确定出对应的汉字。如图3和表1所示。

表1 由自相似水印分形图像取出的对应点确定对应汉字信息

     项
 点
第1个点第二个点第三个点旋转角度横轴缩放a纵轴缩放b对应区码对应位码水印汉字
参考点43,1632,3249,54011   
第一个字183,90196,96194,792440.9920.4164585
第二个字25,20238,20456,1992580.9280.8004801
第三个字229,224229,206207,1951480.7360.9923354

2.3 峰峰信噪比

本文采用峰峰信噪比(PSNR)作为嵌入水印后重构图像质量的客观评价指标,其计算公式为:

其中,f(i,j)与f'(i,j)为嵌入水印前后图像的灰度值,MSE为均方误差。

按式(5)、(6)来计算,本算法嵌入水印后的峰峰信噪比PSNR=30.1550dB;由文献[5]可知,当PSNR超过30dB时,人的视觉很难分辨出原始图像和重构图像的差异。因此本算法完全满足水印信息的不可见性。

2.4 水印检测的相关性

由于本算法所采用的水印为二值数字图像,为了客观表示检测出的水印信息与原水印信息的相近程度,定义相关系数为:

ρ:WEQU/WALL     (7)

其中,WEQU=[相同位置W=W 的个数];[正确检测的水印像素数目],WALL=[W像素总数]。本实验中WALL=256x256。

由以上定义可知,ρ不但表示了水印信息前后的相关程度,而且也表示出了水印信息检测的正确率,即水印信息被正确检测出的百分比率。ρ越大意味着水印信息的鲁棒性越强。本实验结果如表2所示。

由表2可以看出,对带有水印信息的图像进行各种常见的攻击后,水印信息检测的正确率都大于57%,说明该算法对常见攻击具有较强的鲁棒性。

表2 各种功击后自相似水印检测相关关系数表

攻击名无攻击时A/D、D/AJPEG(40)JPEG(50)JPEG(60)JPEG(70)JPEG(80)JPEG(90)
ρ0.88550.88550.82240.85980.86330.85260.86840.8783
攻击名放大到1.25缩小到0.75反转15℃部分剪切均值滤波高斯滤波纳盐噪声高斯噪声
ρ0.88550.75870.78790.61420.59610.86100.57070.8497

本文提出了利用IFS将一组汉字水印和一图像水印映射为双重水印信息,再将双重水印信息利用LAPLACE算子的图像边缘检测功能嵌入小波域低频逼近系数矩阵的鲁棒数字水印改进算法。仿真结果表明,小波域的低频逼近系数矩阵不是水印信息的禁区,将水印信息嵌入低频系数矩阵,可以更好地抵抗图像压缩;而仿射变换的利用提高了水印信息抵抗几何形变的性能。两者的结合,不但能保证水印信息的鲁棒性,同时保证了水印信息的不可见性。同时也表明,本文所提出的方法有很强的抗常见图像处理攻击的能力。对彩色图像,如果先进行分量变换,对变换分量后的某一通道或者多个通道进行小波分解,选取其低频区域嵌入水印信息,同样可得到很好的效果。

这篇关于一种DWT域基于IFS的数字水印算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/712550

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

最大公因数:欧几里得算法

简述         求两个数字 m和n 的最大公因数,假设r是m%n的余数,只要n不等于0,就一直执行 m=n,n=r 举例 以18和12为例 m n r18 % 12 = 612 % 6 = 06 0所以最大公因数为:6 代码实现 #include<iostream>using namespace std;/