# C# .NET如何實現掃描識別圖片中的文字
## 一、OCR技術概述
OCR(Optical Character Recognition,光學字符識別)是指通過計算機視覺技術將圖片、掃描件等載體上的文字轉換為可編輯文本的過程。在.NET生態中,我們可以通過多種方式實現這一功能。
### 1.1 OCR技術原理
典型的OCR處理流程包含以下步驟:
- 圖像預處理(去噪、二值化、傾斜校正)
- 文字區域檢測(版面分析)
- 字符分割與識別
- 后處理(語法校正)
### 1.2 .NET中的OCR解決方案
- **Tesseract**:開源OCR引擎(支持C#封裝)
- **Azure Cognitive Services**:微軟云OCR服務
- **MODI**(已棄用):舊版Office組件
- **第三方SDK**:如ABBYY、Aspose等
## 二、使用Tesseract實現本地OCR
### 2.1 環境準備
首先通過NuGet安裝Tesseract包:
```bash
Install-Package Tesseract
需要同時下載語言數據文件(.traineddata),推薦從官方GitHub獲?。?/p>
// 示例目錄結構
string tessDataPath = @"C:\tessdata\";
string language = "eng+chi_sim"; // 英文+簡體中文
using Tesseract;
public string RecognizeText(string imagePath)
{
using (var engine = new TesseractEngine(tessDataPath, language, EngineMode.Default))
{
using (var img = Pix.LoadFromFile(imagePath))
{
using (var page = engine.Process(img))
{
return page.GetText();
}
}
}
}
// 設置白名單(僅識別數字)
engine.SetVariable("tessedit_char_whitelist", "0123456789");
// 提高識別精度的方法
var pageIter = page.GetIterator();
pageIter.Begin();
do {
if (pageIter.TryGetBoundingBox(PageIteratorLevel.Word, out Rect bounds))
{
// 獲取每個單詞的邊界框
}
} while (pageIter.Next(PageIteratorLevel.TextLine));
using System.Net.Http;
using System.Net.Http.Headers;
async Task<string> AzureOCRAsync(byte[] imageBytes)
{
string endpoint = "https://your-region.api.cognitive.microsoft.com";
string subscriptionKey = "your-key";
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
using (var content = new ByteArrayContent(imageBytes))
{
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
var response = await client.PostAsync($"{endpoint}/vision/v3.2/ocr", content);
var json = await response.Content.ReadAsStringAsync();
// 解析返回的JSON數據
return JObject.Parse(json)["regions"]
.SelectMany(r => r["lines"]
.SelectMany(l => l["words"]
.Select(w => (string)w["text"])))
.Aggregate((a, b) => a + " " + b);
}
}
}
using System.Drawing;
using System.Drawing.Imaging;
byte[] PreprocessImage(string path)
{
using (var bmp = new Bitmap(path))
{
// 轉換為灰度圖
var gray = new Bitmap(bmp.Width, bmp.Height);
using (var g = Graphics.FromImage(gray))
{
var cm = new ColorMatrix(new float[][] {
new float[] {0.299f, 0.299f, 0.299f, 0, 0},
new float[] {0.587f, 0.587f, 0.587f, 0, 0},
new float[] {0.114f, 0.114f, 0.114f, 0, 0},
new float[] {0, 0, 0, 1, 0},
new float[] {0, 0, 0, 0, 1}
});
using (var ia = new ImageAttributes())
{
ia.SetColorMatrix(cm);
g.DrawImage(bmp,
new Rectangle(0, 0, gray.Width, gray.Height),
0, 0, bmp.Width, bmp.Height,
GraphicsUnit.Pixel, ia);
}
}
// 保存為高質量JPEG
using (var ms = new MemoryStream())
{
gray.Save(ms, ImageFormat.Jpeg);
return ms.ToArray();
}
}
}
Parallel.ForEach(imageFiles, file => {
var text = RecognizeText(file);
File.WriteAllText(Path.ChangeExtension(file, ".txt"), text);
});
public class InvoiceInfo
{
public string InvoiceNo { get; set; }
public DateTime Date { get; set; }
public decimal TotalAmount { get; set; }
}
public InvoiceInfo ParseInvoice(string imagePath)
{
var rawText = RecognizeText(imagePath);
// 使用正則表達式提取關鍵信息
var invoiceNo = Regex.Match(rawText, @"發票號碼[::]\s*(\w+)").Groups[1].Value;
var dateStr = Regex.Match(rawText, @"日期[::]\s*(\d{4}-\d{2}-\d{2})").Groups[1].Value;
var amountStr = Regex.Match(rawText, @"金額[::]\s*(\d+\.\d{2})").Groups[1].Value;
return new InvoiceInfo {
InvoiceNo = invoiceNo,
Date = DateTime.Parse(dateStr),
TotalAmount = decimal.Parse(amountStr)
};
}
<!-- XAML部分 -->
<StackPanel>
<Image x:Name="scannedImage" Width="600"/>
<Button Content="選擇圖片" Click="Browse_Click"/>
<TextBox x:Name="resultText" Height="200" AcceptsReturn="True"/>
</StackPanel>
// 后臺代碼
private void Browse_Click(object sender, RoutedEventArgs e)
{
var dialog = new OpenFileDialog {
Filter = "圖片文件|*.jpg;*.png;*.bmp"
};
if (dialog.ShowDialog() == true)
{
scannedImage.Source = new BitmapImage(new Uri(dialog.FileName));
resultText.Text = new OCRService().RecognizeText(dialog.FileName);
}
}
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| Tesseract | 免費、可離線使用 | 需要訓練數據、精度中等 | 本地化部署應用 |
| Azure OCR | 識別精度高、支持多語言 | 需要網絡連接、按量付費 | 云端應用、高精度需求 |
| ABBYY SDK | 專業級識別效果 | 商業授權費用高 | 企業級文檔處理 |
選型建議: - 預算有限且需要離線使用 → Tesseract - 需要最高識別精度 → Azure認知服務 - 處理復雜版式文檔 → ABBYY等商業SDK
chi_sim或chi_tra語言包Tesseract對象必須正確釋放:
// 錯誤示例 - 可能導致內存泄漏
var engine = new TesseractEngine(...);
// 正確用法
using (var engine = new TesseractEngine(...)) { ... }
通過本文介紹的多種方案,開發者可以根據項目需求選擇最適合的OCR實現方式。對于大多數C#應用場景,推薦采用Tesseract作為基礎解決方案,結合適當的圖像預處理和后處理邏輯,可以滿足80%以上的文字識別需求。對于更復雜的場景,Azure認知服務提供了強大的云端支持。建議讀者在實際項目中先進行小規模測試,再逐步優化識別效果。 “`
這篇文章包含了約2150字,采用Markdown格式編寫,覆蓋了以下關鍵內容: 1. OCR技術原理和.NET解決方案概述 2. Tesseract的詳細實現指南 3. Azure認知服務的集成方法 4. 性能優化技巧和實際案例 5. 不同方案的對比分析 6. 常見問題解決方案
文章結構清晰,包含代碼示例和技術建議,適合中高級開發者參考使用。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。