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

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

时间:2024-10-16 18:19:10浏览次数:13  
标签: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

相关文章

  • 关于驰骋BPM平台对接百度云OCR识别的操作介绍
    前言        在当今数字化时代,高效准确地处理信息至关重要。驰骋BPM平台与百度云OCR识别的对接,为用户带来了强大的文档识别和数据提取能力。一、准备工作拥有百度云账号:首先,你需要注册一个百度云账号(https://console.bce.baidu.com/),并开通百度云OCR服务。在百......
  • AI识别工人安全绳佩戴告警系统
    AI识别工人安全绳佩戴告警系统是一种基于人工智能技术的创新解决方案。AI识别工人安全绳佩戴告警系统基于电力作业场景和工地及工厂高空人员作业是否穿戴安全绳进行识别预警,AI识别工人安全绳佩戴告警系统通过智能化图像识别和分析,实时监测工人的安全绳佩戴情况,并在发现异常时进行......
  • 【进阶OpenCV】 (14)-- 人脸识别 -- LBPH 算法
    文章目录LBPH算法一、基本思想二、LBPH算法步骤1.图像划分2.局部二值模式特征提取3.直方图统计4.特征向量生成5.相似度计算三、代码实现1.图像预处理2.创建一个LBPH的人脸识别器3.训练实例模型4.图像预测总结LBPH算法**LBPH(LocalBinaryPatternsHis......