新用户注册入口 老用户登录入口

[转载]每个字符旋转随机角度的图象验证码 V2.0

文章作者:转载 更新时间:2023-05-27 09:38:56 阅读数量:248
文章标签:验证码旋转式类神经网络文字辨识图像处理字符分割
本文摘要:本文讨论了jeff377改进的旋转式验证码生成技术,该技术利用类神经网络进行文字辨识处理,即使文字旋转任意角度也能有效识别。在设计过程中,强调通过增加字符分割难度以提升验证码安全性。代码实现上,针对.NET环境创建了一个名为RotatedVlidationCode的类,包含生成随机字符串和显示验证码的方法。然而,在实现中遇到一个具体问题,即Graphics未填充底色导致ClearType效果消失,影响验证码的视觉质量。尽管代码相对基础且只针对特定字号进行了测试,但整体仍能生成具有一定安全性的随机旋转验证码。
转载文章

本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_30600197/article/details/96672619。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

根据jeff377 的话,竹子将这验证码改进了一下,请大家讨论看看。
-------jeff377--------------------------------------------
我研究所的论文就是在做类神经网络处理文字辨识,以你的例子而言,旋转随意角度对辨识来说并不会有太大影响,只要抓字的重心,360度旋转抓取特微值,还是可以辨识的出来。
通常文字辨识的有一个重要的动作,就是要把个别文字分割,你只要把文字弄的难分割就有不错的安全性。
---------------------------------------------------

代码比较粗糙,而且比较菜,其中遇到一个问题,未对 Graphics 填充底色,那么文字的 ClearType 效果没有了,文字毛边比较明显,不知道为什么,谁能告诉竹子?

代码相对粗糙,没有考虑更多的情况,在测试过程中,以20px 字体呈现,效果感觉还不错,只是 ClearType 效果没有了。

帖几张看看

------------

------------

------------

------------
有一些随机的不好,象下面这张


相关链接:
查看 V1.0

.NET 2.0 代码如下:
using System;
using System.Drawing;
using System.Web;


namespace Oran.Image
{
    
/// <summary>
    
/// 旋转的可视验证码图象
    
/// </summary>
    public class RotatedVlidationCode
    {
        
public enum RandomStringMode
        {
            
/// <summary>
            
/// 小写字母
            
/// </summary>
            LowerLetter,
            
/// <summary>
            
/// 大写字母
            
/// </summary>
            UpperLetter,
            
/// <summary>
            
/// 混合大小写字母
            
/// </summary>
            Letter,
            
/// <summary>
            
/// 数字
            
/// </summary>
            Digital,
            
/// <summary>
            
/// 混合数字与大小字母
            
/// </summary>
            Mix
        }

        
public static string GenerateRandomString(int length, RandomStringMode mode)
        {
            
string rndStr = string.Empty;
            
if (length == 0)
                
return rndStr;

            
//以数组方式候选字符,可以更方便的剔除不要的字符,如数字 0 与字母 o
            char[] digitals = new char[10] { '0''1''2''3''4''5''6''7''8''9' };
            
char[] lowerLetters = new char[26] {
                
'a''b''c''d''e''f''g'
                
'h''i''j''k''l''m''n'
                
'o''p''q''r''s''t'
                
'u''v''w''x''y''z' };
            
char[] upperLetters = new char[26] {
                
'A''B''C''D''E''F''G'
                
'H''I''J''K''L''M''N'
                
'O''P''Q''R''S''T'
                
'U''V''W''X''Y''Z' };
            
char[] letters = new char[52]{
                
'a''b''c''d''e''f''g'
                
'h''i''j''k''l''m''n'
                
'o''p''q''r''s''t'
                
'u''v''w''x''y''z',
                
'A''B''C''D''E''F''G'
                
'H''I''J''K''L''M''N'
                
'O''P''Q''R''S''T'
                
'U''V''W''X''Y''Z' };
            
char[] mix = new char[62]{
                
'0''1''2''3''4''5''6''7''8''9',
                
'a''b''c''d''e''f''g'
                
'h''i''j''k''l''m''n'
                
'o''p''q''r''s''t'
                
'u''v''w''x''y''z',
                
'A''B''C''D''E''F''G'
                
'H''I''J''K''L''M''N'
                
'O''P''Q''R''S''T'
                
'U''V''W''X''Y''Z' };

            
int[] range = new int[2] { 00 };
            Random random 
= new Random();

            
switch (mode)
            {
                
case RandomStringMode.Digital:
                    
for (int i = 0; i < length; ++i)
                        rndStr 
+= digitals[random.Next(0, digitals.Length)];
                    
break;

                
case RandomStringMode.LowerLetter:
                    
for (int i = 0; i < length; ++i)
                        rndStr 
+= lowerLetters[random.Next(0, lowerLetters.Length)];
                    
break;

                
case RandomStringMode.UpperLetter:
                    
for (int i = 0; i < length; ++i)
                        rndStr 
+= upperLetters[random.Next(0, upperLetters.Length)];
                    
break;

                
case RandomStringMode.Letter:
                    
for (int i = 0; i < length; ++i)
                        rndStr 
+= letters[random.Next(0, letters.Length)];
                    
break;

                
default:
                    
for (int i = 0; i < length; ++i)
                        rndStr 
+= mix[random.Next(0, mix.Length)];
                    
break;
            }

            
return rndStr;
        }

        
/// <summary>
        
/// 显示验证码
        
/// </summary>
        
/// <param name="seed">随机数辅助种子</param>
        
/// <param name="strLen">验证码字符长度</param>
        
/// <param name="fontSize">字体大小</param>
        
/// <param name="mode">随机字符模式</param>
        
/// <param name="clrFont">字体颜色</param>
        
/// <param name="clrBg">背景颜色</param>
        public static void ShowValidationCode(ref int seed, int strLen, int fontSize, RandomStringMode mode, Color clrFont, Color clrBg)
        {
            
int tmpSeed;
            
unchecked
            {
                tmpSeed 
= (int)(seed * DateTime.Now.Ticks);
                
++seed;
            }
            Random rnd 
= new Random(tmpSeed);

            
string text = GenerateRandomString(strLen, mode);
            
int height = fontSize * 2;
            
// 因为字体旋转后每个字体所占宽度会所有加大,所以要加一点补偿宽度
            int width = fontSize * text.Length + fontSize / (text.Length - 2);
            Bitmap bmp 
= new Bitmap(width, height);

            Graphics graphics 
= Graphics.FromImage(bmp);
            Font font 
= new Font("Courier New", fontSize, FontStyle.Bold);
            Brush brush 
= new SolidBrush(clrFont);
            Brush brushBg 
= new SolidBrush(clrBg);
            graphics.FillRectangle(brushBg, 
00, width, height);
            Bitmap tmpBmp 
= new Bitmap(height, height);
            Graphics tmpGph 
= null;
            
int degree = 40;
            Point tmpPoint 
= new Point();
            
for (int i = 0; i < text.Length; i++)
            {
                tmpBmp 
= new Bitmap(height, height);
                tmpGph 
= Graphics.FromImage(tmpBmp);
               
// tmpGph.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
               
// 不填充底色,文字 ClearType 效果不见了,why?!
               
// tmpGph.FillRectangle(brushBg, 0, 0, tmpBmp.Width, tmpBmp.Height);
                degree = rnd.Next(2051); // [20, 50]随机角度
                if (rnd.Next(02== 0)
                {
                    tmpPoint.X 
= 12// 调整文本坐标以适应旋转后的图象
                    tmpPoint.Y = -6;
                }
                
else
                {
                    degree 
= ~degree + 1// 逆时针旋转
                    tmpPoint.X = -10;
                    tmpPoint.Y 
= 6;
                }

                tmpGph.RotateTransform(degree);
                tmpGph.DrawString(text[i].ToString(), font, brush, tmpPoint);
                graphics.DrawImage(tmpBmp, i 
* fontSize, 0); // 拼接图象
            }
            
            
//输出图象
            System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
            bmp.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Gif);
            HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            HttpContext.Current.Response.ClearContent();
            HttpContext.Current.Response.ContentType 
= "image/gif";
            HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray());
            HttpContext.Current.Response.End();

            
//释放资源
            font.Dispose();
            brush.Dispose();
            brushBg.Dispose();
            tmpGph.Dispose();
            tmpBmp.Dispose();
            graphics.Dispose();
            bmp.Dispose();
            memoryStream.Dispose();
        }
    }
}


转载于:https://www.cnblogs.com/iRed/archive/2008/06/22/1227687.html

本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_30600197/article/details/96672619。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

相关阅读
文章标题:[转载][洛谷P1082]同余方程

更新时间:2023-02-18
[转载][洛谷P1082]同余方程
文章标题:[转载]webpack优化之HappyPack实战

更新时间:2023-08-07
[转载]webpack优化之HappyPack实战
文章标题:[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法

更新时间:2023-09-10
[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法
文章标题:[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo

更新时间:2024-03-11
[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo
文章标题:[转载]程序员也分三六九等?等级差异,一个看不起一个!

更新时间:2024-05-10
[转载]程序员也分三六九等?等级差异,一个看不起一个!
文章标题:[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集

更新时间:2024-01-12
[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集
名词解释
作为当前文章的名词解释,仅对当前文章有效。
类神经网络类神经网络是一种模仿人脑神经元工作原理的计算模型,由大量处理单元(称为节点或神经元)通过多层连接构成。在本文中,jeff377提到使用类神经网络处理文字辨识问题,即使验证码中的字符旋转任意角度,也能通过抓取字的重心和提取360度旋转特征值实现准确的识别。
ClearType 效果ClearType 是一种微软开发的字体平滑技术,旨在提高液晶显示器上文本的显示质量。它通过次像素渲染技术改善了屏幕上的文本边缘,使其看起来更清晰、更易于阅读。文中指出,竹子在生成验证码时遇到了未对 Graphics 填充底色的问题,导致原本应具有的 ClearType 效果消失,使得验证码中的文字边缘出现毛边,视觉效果受到影响。
验证码(CAPTCHA)验证码全称“Completely Automated Public Turing test to tell Computers and Humans Apart”,是一种区分计算机程序与人类用户的安全测试手段。在本文情境下,竹子改进了一种旋转式验证码生成方法,该方法利用随机字符串、图像处理技术和类神经网络进行文字辨识,从而增强验证码的安全性,防止自动化脚本进行恶意攻击或滥用网站服务。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
验证码技术作为网络安全的重要防线,近年来在不断提升其复杂性和安全性。随着深度学习和人工智能的发展,类神经网络被广泛应用于图像识别、文字辨识等领域,使得机器能够更准确地识别经过扭曲、旋转等复杂处理的验证码图片。例如,在最新的研究中,科研人员尝试将生成对抗网络(GANs)应用于验证码破解与生成,通过训练模型模拟真实用户行为,有效提升了验证码的安全阈值。
近期,一项发表在《计算机安全》期刊的研究揭示了新型动态变形验证码的设计方案,它不仅结合了随机旋转角度的方法,还引入了像素扰动、局部变形等手段,极大地增加了自动破解工具的识别难度。同时,研究人员强调了验证码设计时兼顾用户体验的重要性,提倡使用无障碍设计以方便视障人士及其他特殊群体进行验证。
此外,对于ClearType字体渲染优化问题,微软等公司也在不断探索改进方案,力求在保证验证码安全性的前提下提升显示效果,减少毛边现象,提供更为平滑清晰的文字显示。而在实际应用中,如银行、社交平台等高安全需求场景,则纷纷开始采用多模态验证码,结合图形、语音等多种方式,构建更为立体全面的安全防护体系。
总之,验证码技术的演进充分体现了AI与安全领域的交叉融合,未来将进一步发展为智能、高效且人性化的身份验证机制,持续抵御自动化攻击,保障用户的网络安全。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
grep pattern file.txt - 在文件中搜索模式。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
可自定义logo的jQuery生成二维码插件 01-03 jquery每日签到日历插件 10-10 高度可定制的jQuery瀑布流网格布局插件 03-15 Consul中服务实例自动注销问题解析:健康检查、稳定性与Agent配置的影响及解决策略 01-22 怎么看mysql 的安装路径 12-31 jquery横向手风琴效果 12-23 蓝色数码电子产品销售HTML5网站模板 12-14 jQuery和CSS3汉堡包导航菜单打开动画特效 10-19 python模拟生存游戏 10-08 本次刷新还10个文章未展示,点击 更多查看。
jQuery.eraser-实现橡皮擦擦除功能的jquery插件 05-26 Netty中ChannelNotRegisteredException异常处理:理解原因与确保Channel注册状态的方法示例 05-16 响应式游戏开发类企业前端cms模板下载 05-02 精美的花甲美食网站HTML模板下载 03-09 soulmate粉色干净浪漫唯美婚礼单页响应式网站模板 03-07 Vue.js项目中proxyTable数据转发遭遇504错误:服务器响应时间与网络连接问题排查及解决方案 03-05 SpringCloud服务路由配置错误与失效:识别问题、排查步骤及组件解析这个涵盖了的核心内容,包括SpringCloud框架下的服务路由配置错误失效问题的识别,以及涉及到的服务注册中心、Gateway、Zuul等组件的功能解析和故障排查的具体步骤。同时,字数控制在了50个字以内,满足了要求。 03-01 css水平线长度设置 02-11 [转载]Proxy 、Relect、响应式 01-11 蓝色响应式软件营销代理公司网站静态模板 01-06 python正太分布校验 01-05
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"