首页 > 编程语言 >C#图像处理与OCR:从验证码识别到文本提取 Tesseract实现验证码识别:本地化

C#图像处理与OCR:从验证码识别到文本提取 Tesseract实现验证码识别:本地化

时间:2024-10-16 18:19:10浏览次数:3  
标签:OCR 示例 int image 验证码 Bitmap 图像 new 识别

以下示例代码中,涉及到的知识点主要包括图像处理、验证码识别、Base64 转换、图像预处理等。以下是详细的知识点梳理,以及相应的代码示例:

1. 图像加载与保存

  • 使用 Image.FromFile 加载本地图像,并使用 Bitmap 进行图像操作。Bitmap 是图像处理的主要类,支持各种图像操作。

代码示例:

Bitmap captchaImage = (Bitmap)Image.FromFile(imagePath);
captchaImage.Save(outputPath, System.Drawing.Imaging.ImageFormat.Jpeg);

2. Base64 编码与解码

  • Base64 编码的图像可以通过 Convert.FromBase64String 转换为字节数组,再用 MemoryStream 读取为 Bitmap

代码示例:

static Bitmap Base64ToImage(string base64)
{
    byte[] imageBytes = Convert.FromBase64String(base64);
    using (var ms = new MemoryStream(imageBytes))
    {
        return new Bitmap(ms);
    }
}

3. 图像预处理

  • 图像预处理主要包括图像的灰度化和二值化,以减少图像噪声,便于后续的验证码识别。
  • 灰度化通过 ColorMatrix 实现,二值化则基于图像亮度阈值,将图像转换为黑白。

代码示例:

static Bitmap PreprocessImage(Bitmap image)
{
    // 灰度化
    Bitmap grayImage = new Bitmap(image.Width, image.Height);
    using (Graphics g = Graphics.FromImage(grayImage))
    {
        ColorMatrix colorMatrix = new ColorMatrix(new float[][]
        {
            new float[] { 0.3f, 0.3f, 0.3f, 0, 0 },
            new float[] { 0.59f, 0.59f, 0.59f, 0, 0 },
            new float[] { 0.11f, 0.11f, 0.11f, 0, 0 },
            new float[] { 0, 0, 0, 1, 0 },
            new float[] { 0, 0, 0, 0, 1 }
        });

        using (ImageAttributes attributes = new ImageAttributes())
        {
            attributes.SetColorMatrix(colorMatrix);
            g.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes);
        }
    }

    // 二值化
    Bitmap binaryImage = new Bitmap(grayImage.Width, grayImage.Height);
    for (int y = 0; y < grayImage.Height; y++)
    {
        for (int x = 0; x < grayImage.Width; x++)
        {
            Color pixelColor = grayImage.GetPixel(x, y);
            int brightness = (int)(pixelColor.R * 0.3 + pixelColor.G * 0.59 + pixelColor.B * 0.11);
            Color newColor = brightness < 128 ? Color.Black : Color.White;
            binaryImage.SetPixel(x, y, newColor);
        }
    }

    return binaryImage;
}

4. 验证码识别(OCR)

  • 使用 TesseractEngine(Tesseract OCR 引擎)进行验证码图像的文字识别。
  • TesseractEngine 可以设置识别模式、字符集限制等参数。

代码示例:

static string RecognizeCaptcha(Bitmap captchaImage)
{
    using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default))
    {
        string tempFilePath = Path.Combine(Path.GetTempPath(), "captcha.png");
        captchaImage.Save(tempFilePath, System.Drawing.Imaging.ImageFormat.Png);

        using (var img = Pix.LoadFromFile(tempFilePath))
        {
            var result = engine.Process(img);
            return result.GetText().Trim();
        }
    }
}

5. 临时文件存储

  • 在使用 Tesseract 识别时,需要将图像存储为临时文件,以便 Tesseract 引擎读取。临时文件路径通过 Path.GetTempPath() 生成。

代码示例:

string tempFilePath = Path.Combine(Path.GetTempPath(), "captcha.png");
captchaImage.Save(tempFilePath, System.Drawing.Imaging.ImageFormat.Png);

6. 图像格式转换

  • 在保存和处理图像时,经常需要指定图像的格式,比如 PNG 或 JPEG。使用 System.Drawing.Imaging.ImageFormat 可以灵活处理各种图像格式。

代码示例:

captchaImage.Save(outputPath, System.Drawing.Imaging.ImageFormat.Jpeg);

7. 图像处理的常用库

  • 在 C# 中,常用的图像处理库包括 System.DrawingImageSharpEmgu CV 等。选择适合项目需求的库可以提高开发效率和图像处理效果。

示例(使用 ImageSharp):

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;

var image = Image.Load(imagePath);
image.Mutate(x => x.Grayscale());
image.Save(outputPath);

8. 多线程处理图像

  • 对于大型图像处理任务,可以考虑使用多线程来加速处理。TaskParallel 类可以有效地提高处理性能。

代码示例:

Parallel.For(0, binaryImage.Height, y =>
{
    for (int x = 0; x < binaryImage.Width; x++)
    {
        // 处理每个像素
        Color pixelColor = binaryImage.GetPixel(x, y);
        // 进行图像处理
    }
});

9. 图像增强

  • 图像增强技术包括对比度调整、锐化等,可以提高图像质量,从而提高识别率。

代码示例(对比度调整):

static Bitmap AdjustContrast(Bitmap image, float value)
{
    // 调整对比度
    var adjustedImage = new Bitmap(image.Width, image.Height);
    float contrast = value * 255;
    float t = 0.5f * (255 - contrast);
    for (int y = 0; y < image.Height; y++)
    {
        for (int x = 0; x < image.Width; x++)
        {
            Color pixel = image.GetPixel(x, y);
            int r = (int)(contrast * pixel.R + t);
            int g = (int)(contrast * pixel.G + t);
            int b = (int)(contrast * pixel.B + t);
            adjustedImage.SetPixel(x, y, Color.FromArgb(
                Clamp(r, 0, 255),
                Clamp(g, 0, 255),
                Clamp(b, 0, 255)));
        }
    }
    return adjustedImage;
}

static int Clamp(int value, int min, int max)
{
    return Math.Max(min, Math.Min(max, value));
}

10. 验证码识别精度提升

  • 通过训练自定义的 Tesseract 模型,可以显著提升特定类型验证码的识别准确率。可以根据特定验证码的特点,提供自定义字符集。

示例代码:

// 自定义字符集
engine.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");

11. 错误处理与调试

  • 在图像处理过程中,处理异常是很重要的,可以通过 try-catch 块捕获可能出现的异常,保证程序的健壮性。

代码示例:

try
{
    Bitmap captchaImage = (Bitmap)Image.FromFile(imagePath);
}
catch (Exception ex)
{
    Console.WriteLine("图像加载失败: " + ex.Message);
}

12. 图像显示与用户交互

  • 在桌面应用中,可以使用 WinForms 或 WPF 显示处理后的图像,并提供用户交互功能(如按钮点击等)。

示例(WinForms):

PictureBox pictureBox = new PictureBox();
pictureBox.Image = processedImage;
pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
this.Controls.Add(pictureBox);

13. 图像保存的格式选择

  • 根据后续用途选择适当的图像格式进行保存,例如 PNG 适合保存带透明度的图像,而 JPEG 更适合保存照片等具有丰富色彩的图像。

代码示例:

// 保存为 PNG 格式
captchaImage.Save(outputPath, System.Drawing.Imaging.ImageFormat.Png);

14. 图像旋转与翻转

  • 对于一些扭曲或倾斜的验证码图像,可以进行旋转和翻转操作,以提升识别率。

代码示例:

static Bitmap RotateImage(Bitmap image, float angle)
{
    Bitmap rotatedImage = new Bitmap(image.Width, image.Height);
    using (Graphics g = Graphics.FromImage(rotatedImage))
    {
        g.TranslateTransform((float)image.Width / 2, (float)image.Height / 2);
        g.RotateTransform(angle);
        g.TranslateTransform(-(float)image.Width / 2, -(float)image.Height / 2);
        g.DrawImage(image, new Point(0, 0));
    }
    return rotatedImage;
}

14. 完整代码

  • 提供完整的代码示例,帮助读者快速实现验证码文字识别,查看附件(OCR_Demo)即可。
  • git 外链地址
    运行结果
    运行此程序后,将会在控制台显示识别出的验证码内容。确保在运行程序之前,已正确安装并配置好Tesseract引擎和相应的语言数据文件。

15. 总结

本文展示了如何使用C#进行验证码识别,包括图像的加载、预处理和文本提取。这些技术在处理需要自动化数据输入的任务时尤为重要。希望这篇技术文章能为大家提供有用的参考。

友情链接 OCR API 外部API地址

标签:OCR,示例,int,image,验证码,Bitmap,图像,new,识别
From: https://blog.csdn.net/Hellc007/article/details/142920905

相关文章

  • 拥抱AI-海关机场护照查验-护照查验接口-护照识别真伪核验
    在全球化日益加深的今天,国际旅行已成为人们生活中不可或缺的一部分。无论是商务出行还是休闲旅游,护照作为国际通行的身份证明文件,其真实性和有效性至关重要。为了确保国家安全和旅客的顺利通关,海关机场在护照查验过程中采用了先进的护照识别真伪核验技术。什么是护照查验......
  • 基于yolov8的交通标志识别检测数据集包含9类别 训练集:3530验证:801
    pyqt5界面演示摘要随着城市化进程的加速和交通运输业的蓬勃发展,道路交通的安全问题日益凸显其重要性。交通标志作为道路语言的重要组成部分,对于引导交通流、规范驾驶行为、保障道路使用者的安全具有不可替代的作用。然而,在实际交通环境中,由于天气变化、标志老化、驾驶员注......
  • yolov5,v8船舰识别检测(包含训练代码Pyqt源码超详细)
    前言:随着海上活动的增加,对船舰进行实时、准确的检测与识别成为了海上安全、海洋监测、海事管理等领域的迫切需求。传统的船舶识别方法主要依赖于船舶自动识别系统(AIS)和雷达等通信导航设备,但这些方法存在一定的局限性,例如目标误识别、目标丢失和易受环境噪声为海上船只的自动......
  • 关于驰骋BPM平台对接百度云OCR识别的操作介绍
    前言        在当今数字化时代,高效准确地处理信息至关重要。驰骋BPM平台与百度云OCR识别的对接,为用户带来了强大的文档识别和数据提取能力。一、准备工作拥有百度云账号:首先,你需要注册一个百度云账号(https://console.bce.baidu.com/),并开通百度云OCR服务。在百......
  • 打架斗殴监测识别系统
    打架斗殴监测识别系统具有以下优势:打架斗殴监测识别系统通过高清摄像头等监测设备对校园和工地作业场所进行智能监测,实时捕捉到打架斗殴行为。打架斗殴监测识别系统采用先进的图像处理和机器学习算法,能够自动识别和分析出打架斗殴的行为特征。一旦系统检测到打架斗殴行为,将自动触......
  • AI识别工人安全绳佩戴告警系统
    AI识别工人安全绳佩戴告警系统是一种基于人工智能技术的创新解决方案。AI识别工人安全绳佩戴告警系统基于电力作业场景和工地及工厂高空人员作业是否穿戴安全绳进行识别预警,AI识别工人安全绳佩戴告警系统通过智能化图像识别和分析,实时监测工人的安全绳佩戴情况,并在发现异常时进行......
  • 识别图形验证码 (Elixir 示例)
    安装所需依赖在你的mix.exs文件中添加以下依赖:elixirdefpdepsdo[{:httpoison,"~>1.8"},{:mogrify,"~>0.7"},{:tesseract,"~>0.1"}]更多内容联系1436423940end然后运行mixdeps.get来安装这些库。下载并保存验证码图片使用HTTPoison下载验证码图片并保存......
  • 识别图形验证码 (Scala 示例)
    安装所需依赖在你的build.sbt文件中添加以下依赖:scalalibraryDependencies+="org.scalaj"%%"scalaj-http"%"2.4.2"下载并保存验证码图片使用scalaj-http下载验证码图片并保存到本地:scalaimportscalaj.http._importjava.nio.file.{Files,Paths}objectCaptch......
  • 识别图形验证码 (Julia 示例)
    安装所需依赖在JuliaREPL中使用以下命令安装所需的包:juliausingPkgPkg.add("HTTP")Pkg.add("Images")Pkg.add("Tesseract")下载并保存验证码图片使用HTTP下载验证码图片并保存到本地:juliausingHTTPusingFileIOfunctiondownload_captcha(url::String,save_pa......
  • 【进阶OpenCV】 (14)-- 人脸识别 -- LBPH 算法
    文章目录LBPH算法一、基本思想二、LBPH算法步骤1.图像划分2.局部二值模式特征提取3.直方图统计4.特征向量生成5.相似度计算三、代码实现1.图像预处理2.创建一个LBPH的人脸识别器3.训练实例模型4.图像预测总结LBPH算法**LBPH(LocalBinaryPatternsHis......