发明名称 一种基于不可逆矩阵的图片验证码生成方法
摘要 本发明实施例公开了一种基于不可逆矩阵的图片验证码生成方法,包括:变换类型的选定及不可逆矩阵的生成;图片的不可逆变换;图片随机噪声的添加及多幅变换图片的组合。通过实施本发明实施例,提高图片的反破解性,又不会降低人对图像理解的准确率。
申请公布号 CN101882298B 申请公布日期 2013.01.02
申请号 CN201010215007.7 申请日期 2010.06.30
申请人 中山大学 发明人 李春景;罗笑南;曾巨泉
分类号 G06T1/00(2006.01)I;G06T5/00(2006.01)I 主分类号 G06T1/00(2006.01)I
代理机构 代理人
主权项 一种基于不可逆变换矩阵的图片验证码生成方法,其特征在于,包括:S101:变换类型的选定及不可逆变换矩阵的生成;S102:图片的不可逆变换;S103:图片随机噪声的添加及多幅变换图片的组合;其中,图片变换包括平移、缩放和旋转;对于图片上某点(x,y)通过实施以下的矩阵相乘达到(Δx,Δy)平移变换; <mrow> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mi>&Delta;x</mi> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mi>&Delta;y</mi> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>x</mi> </mtd> </mtr> <mtr> <mtd> <mi>y</mi> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mo>=</mo> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>x</mi> <mo>+</mo> <mi>&Delta;x</mi> </mtd> </mtr> <mtr> <mtd> <mi>y</mi> <mo>+</mo> <mi>&Delta;y</mi> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> </mrow>对于图片上某点(x,y)通过实施以下的矩阵相乘达到(s,h)的缩放变换; <mrow> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>s</mi> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>0</mn> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> <mtd> <mi>h</mi> </mtd> <mtd> <mn>0</mn> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>x</mi> </mtd> </mtr> <mtr> <mtd> <mi>y</mi> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mo>=</mo> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>sx</mi> </mtd> </mtr> <mtr> <mtd> <mi>hy</mi> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> </mrow>对于图片上某点(x,y)通过实施以下的矩阵相乘达到逆时针θ的旋转变换; <mrow> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <msup> <mi>x</mi> <mo>&prime;</mo> </msup> </mtd> </mtr> <mtr> <mtd> <msup> <mi>y</mi> <mo>&prime;</mo> </msup> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mo>=</mo> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>cos</mi> <mi>&theta;</mi> </mtd> <mtd> <mo>-</mo> <mi>sin</mi> <mi>&theta;</mi> </mtd> <mtd> <mn>0</mn> </mtd> </mtr> <mtr> <mtd> <mi>sin</mi> <mi>&theta;</mi> </mtd> <mtd> <mi>cos</mi> <mi>&theta;</mi> </mtd> <mtd> <mn>0</mn> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>x</mi> </mtd> </mtr> <mtr> <mtd> <mi>y</mi> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mo>=</mo> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>x</mi> <mi>cos</mi> <mi>&theta;</mi> <mo>-</mo> <mi>y</mi> <mi>sin</mi> <mi>&theta;</mi> </mtd> </mtr> <mtr> <mtd> <mi>x</mi> <mi>sin</mi> <mi>&theta;</mi> <mo>+</mo> <mi>y</mi> <mi>cos</mi> <mi>&theta;</mi> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> </mrow>上述的三种变换是基本的图片变换,而且变换矩阵均可逆,对变换矩阵做改动使得其为不可逆变换矩阵;首先是对平移矩阵的修改使之变为不可逆,对平移矩阵做以下修改: <mrow> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mi>&Delta;x</mi> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mi>&Delta;y</mi> </mtd> </mtr> <mtr> <mtd> <mi>f</mi> </mtd> <mtd> <mi>g</mi> </mtd> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>x</mi> </mtd> </mtr> <mtr> <mtd> <mi>y</mi> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mo>=</mo> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>x</mi> <mo>+</mo> <mi>&Delta;x</mi> </mtd> </mtr> <mtr> <mtd> <mi>y</mi> <mo>+</mo> <mi>&Delta;y</mi> </mtd> </mtr> <mtr> <mtd> <mi>fx</mi> <mo>+</mo> <mi>gy</mi> <mo>+</mo> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> </mrow>变换矩阵的行列式的值为1‑gΔy‑fΔx,根据设定的Δx,Δy取相应的g,f使得行列式的值为0,即变换矩阵不可逆,并通过线性规划求得g,f,使得fx+gy的值接近0,尔后对矩阵实施整体缩放,使得: <mrow> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mn>1</mn> <mo>/</mo> <mrow> <mo>(</mo> <mi>fx</mi> <mo>+</mo> <mi>gy</mi> <mo>+</mo> <mn>1</mn> <mo>)</mo> </mrow> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>0</mn> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> <mo>/</mo> <mrow> <mo>(</mo> <mi>fx</mi> <mo>+</mo> <mi>gy</mi> <mo>+</mo> <mn>1</mn> <mo>)</mo> </mrow> </mtd> <mtd> <mn>0</mn> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> <mo>/</mo> <mrow> <mo>(</mo> <mi>fx</mi> <mo>+</mo> <mi>gy</mi> <mo>+</mo> <mn>1</mn> <mo>)</mo> </mrow> </mtd> </mtr> </mtable> </mfenced> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mi>&Delta;x</mi> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mi>&Delta;y</mi> </mtd> </mtr> <mtr> <mtd> <mi>f</mi> </mtd> <mtd> <mi>g</mi> </mtd> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>x</mi> </mtd> </mtr> <mtr> <mtd> <mi>y</mi> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mtable> <mtr> <mtd> </mtd> </mtr> </mtable> <mo>=</mo> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mrow> <mo>(</mo> <mi>x</mi> <mo>+</mo> <mi>&Delta;x</mi> <mo>)</mo> </mrow> <mo>/</mo> <mrow> <mo>(</mo> <mi>fx</mi> <mo>+</mo> <mi>gy</mi> <mo>+</mo> <mn>1</mn> <mo>)</mo> </mrow> </mtd> </mtr> <mtr> <mtd> <mrow> <mo>(</mo> <mi>y</mi> <mo>+</mo> <mi>&Delta;y</mi> <mo>)</mo> </mrow> <mo>/</mo> <mrow> <mo>(</mo> <mi>fx</mi> <mo>+</mo> <mi>gy</mi> <mo>+</mo> <mn>1</mn> <mo>)</mo> </mrow> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> </mrow>1/(fx+gy+1)接近于1,因而变换后的平移接近原有平移,但此时使用不可逆变换矩阵实施变换;对旋转矩阵作出以下修改: <mrow> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <msup> <mi>x</mi> <mo>&prime;</mo> </msup> </mtd> </mtr> <mtr> <mtd> <msup> <mi>y</mi> <mo>&prime;</mo> </msup> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mo>=</mo> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>cos</mi> <mi>&theta;</mi> </mtd> <mtd> <mo>-</mo> <mi>sin</mi> <mi>&theta;</mi> </mtd> <mtd> <mi>e</mi> </mtd> </mtr> <mtr> <mtd> <mi>sin</mi> <mi>&theta;</mi> </mtd> <mtd> <mi>cos</mi> <mi>&theta;</mi> </mtd> <mtd> <mi>l</mi> </mtd> </mtr> <mtr> <mtd> <mi>m</mi> </mtd> <mtd> <mi>n</mi> </mtd> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>x</mi> </mtd> </mtr> <mtr> <mtd> <mi>y</mi> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mo>=</mo> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>x</mi> <mi>cos</mi> <mi>&theta;</mi> <mo>-</mo> <mi>y</mi> <mi>sin</mi> <mi>&theta;</mi> <mo>+</mo> <mi>e</mi> </mtd> </mtr> <mtr> <mtd> <mi>y</mi> <mi>cos</mi> <mi>&theta;</mi> <mo>+</mo> <mi>x</mi> <mi>sin</mi> <mi>&theta;</mi> <mo>+</mo> <mi>l</mi> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> <mo>+</mo> <mi>mx</mi> <mo>+</mo> <mi>ny</mi> </mtd> </mtr> </mtable> </mfenced> </mrow>行列式的值为1‑lncosθ+ensinθ‑mlsinθ‑mecosθ,变换后的矩阵取适当的值,使得1‑lncosθ+ensinθ‑mlsinθ‑mecosθ为0,即矩阵不可逆,使得1+mx+ny接近1,e,l在1到3个像素内变换,再做缩放变换可得: <mrow> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <msup> <mi>x</mi> <mo>&prime;</mo> </msup> </mtd> </mtr> <mtr> <mtd> <msup> <mi>y</mi> <mo>&prime;</mo> </msup> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mo>=</mo> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mn>1</mn> <mo>/</mo> <mn>1</mn> <mo>+</mo> <mi>mx</mi> <mo>+</mo> <mi>ny</mi> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>0</mn> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> <mo>/</mo> <mn>1</mn> <mo>+</mo> <mi>mx</mi> <mo>+</mo> <mi>ny</mi> </mtd> <mtd> <mn>0</mn> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> <mo>/</mo> <mn>1</mn> <mo>+</mo> <mi>mx</mi> <mo>+</mo> <mi>ny</mi> </mtd> </mtr> </mtable> </mfenced> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>cos</mi> <mi>&theta;</mi> </mtd> <mtd> <mo>-</mo> <mi>sin</mi> <mi>&theta;</mi> </mtd> <mtd> <mi>e</mi> </mtd> </mtr> <mtr> <mtd> <mi>sin</mi> <mi>&theta;</mi> </mtd> <mtd> <mi>cos</mi> <mi>&theta;</mi> </mtd> <mtd> <mi>l</mi> </mtd> </mtr> <mtr> <mtd> <mi>m</mi> </mtd> <mtd> <mi>n</mi> </mtd> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mi>x</mi> </mtd> </mtr> <mtr> <mtd> <mi>y</mi> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mrow> <mo>(</mo> <mi>x</mi> <mi>cos</mi> <mi>&theta;</mi> <mo>-</mo> <mi>y</mi> <mi>sin</mi> <mi>&theta;</mi> <mo>+</mo> <mi>e</mi> <mo>)</mo> </mrow> <mo>/</mo> <mrow> <mo>(</mo> <mn>1</mn> <mo>+</mo> <mi>mx</mi> <mo>+</mo> <mi>ny</mi> <mo>)</mo> </mrow> </mtd> </mtr> <mtr> <mtd> <mrow> <mo>(</mo> <mi>y</mi> <mi>cos</mi> <mi>&theta;</mi> <mo>+</mo> <mi>x</mi> <mi>sin</mi> <mi>&theta;</mi> <mo>+</mo> <mi>l</mi> <mo>)</mo> </mrow> <mo>/</mo> <mrow> <mo>(</mo> <mn>1</mn> <mo>+</mo> <mi>mx</mi> <mo>+</mo> <mi>ny</mi> <mo>)</mo> </mrow> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> </mrow>当选定变换方式后,生成不可逆变换矩阵,具体的流程步骤如下:S201:变换类型选定;S202:判断是否进行旋转变换,如果是则进行S203,否则进行S206;S203:输入旋转参数及点坐标;S204:设定4个参数;S205:由输入参数确定4个设定参数值;S206:输入平移参数及点坐标;S207:设定2个参数;S208:由输入参数确定2个设定参数值;S209:矩阵相乘计算变换后的坐标。
地址 510006 广东省广州市番禺区大学城中山大学东校区教学实验中心C401