悪いスキャン、電話ショット、ファックス、および圧縮されたスクリーンショートはしばしぶOCRを打ち負かします 良いニュース: 小さなプレプロセッサは長い道を進んでいます このガイドはあなたに 実用的で実行可能なステップ(最後にヘッドと調和)を提供し、画像を清掃するために 前 OCRと トゥーンのOKRエンジンをより良い結果を得るために。
完全例
原則
- ・NET 8(または .NET 6+) SDK
- ニュージーランド:
Aspose.OCR
- (オプション)
Aspose.Total.lic
評価制限を超えることを計画している場合
コンソールアプリを作成し、パッケージを追加します。
dotnet new console -n OCRImprovementExample -f net8.0
cd OCRImprovementExample
dotnet add package Aspose.OCR
ステップ 1 - プロセス 低品質の画像
**目標:**騒音を減らし、コントロール/明るさを正常化し、OCRの前に(オプション的に)上昇または栽培します。
1.1 画像をアップロード
using System;
using System.Drawing;
using System.IO;
// Step 1: Load the low-quality image
string imagePath = "low_quality_image.png";
if (!File.Exists(imagePath))
throw new FileNotFoundException(imagePath);
Bitmap image = (Bitmap)Image.FromFile(imagePath);
// Optional: quick sanity check
Console.WriteLine($"Loaded {imagePath} ({image.Width}x{image.Height}px)");
1.2 騒音削除(中間フィルター)
中間フィルターを使用して、塩とペーパーの騒音やJPEGアーティファクトを抑制します。
using Aspose.Ocr.ImageProcessing;
// Median filter: try odd sizes 3, 5 (larger = stronger, but may blur small text)
var filterOptions = new FilterOptions
{
MedianFilter = true,
MedianFilterSize = 3
};
「いつ変わるか・・・」
- 鏡を見ているなら、上昇する。
MedianFilterSize
「5」へ。 - 小さなキャラクターが消える場合は、 3 に戻るか、それをオフにします。
1.3 対照/明るさを正常化する
テキストを背景から抜け出します。
var contrastOptions = new ContrastOptions
{
// Positive values increase contrast/brightness; negatives decrease
ContrastAdjustment = 20, // try 10..30
BrightnessAdjustment = 10 // try -10..+15 based on exposure
};
タンパク質のルール:**
- **過剰(洗浄):**は明るさを低下させる(例えば、 -10)と対比を適度に保つ。
- 未暴露(あまりにも暗い): 明るさを増加させる(例えば、 +10)と対比(例: ** +20**)。
1.4 プロセッサ・パイプラインの構築と事前処理
var processingOptions = new ImageProcessingOptions();
processingOptions.Filters.Add(filterOptions);
processingOptions.Contrast = contrastOptions;
// (Optional) more options can be added here if your build exposes them
// e.g., processingOptions.Sharpen = new SharpenOptions { Strength = 1 };
using (var ocrEngine = new Aspose.Ocr.Api.OcrEngine())
{
Bitmap preprocessed = ocrEngine.PreprocessImage(image, processingOptions);
// Keep this for OCR below
image.Dispose();
image = preprocessed;
}
1.5 (オプション) Upscale 小型テキスト
テキストが 非常に小さい (<10px 高さ) なら、高品質の再サンプルを使用して 前 OCR をアップスケールします。
// 1.5 Optional: upscale 1.5x to help recognition of tiny text
Bitmap Upscale(Bitmap src, double scale)
{
int w = (int)(src.Width * scale);
int h = (int)(src.Height * scale);
var dest = new Bitmap(w, h);
using (var g = Graphics.FromImage(dest))
{
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.DrawImage(src, 0, 0, w, h);
}
return dest;
}
// Example usage
// image = Upscale(image, 1.5);
1.6 (オプション) Crop a Region of Interest (ROI)
単一の割合(たとえば、タイトル、請求書総額)が必要な場合は、収穫を減らし、エラーが発生します。
// Crop a rectangle (x,y,width,height)
Rectangle roi = new Rectangle(0, 0, image.Width, Math.Min(400, image.Height)); // top band
Bitmap cropped = image.Clone(roi, image.PixelFormat);
image.Dispose();
image = cropped;
1.7 (オプション) スピードバイナリズム(DIY)
背景色が複雑である場合は、グレースケールと範囲に変換します(OCR構造が専用のバイナリ化オプションが欠けている場合にのみ使用してください。
// Simple grayscale + global threshold (0..255); try 170..200
Bitmap ToBinary(Bitmap src, byte threshold = 185)
{
var bw = new Bitmap(src.Width, src.Height);
for (int y = 0; y < src.Height; y++)
for (int x = 0; x < src.Width; x++)
{
var c = src.GetPixel(x, y);
byte gray = (byte)(0.299 * c.R + 0.587 * c.G + 0.114 * c.B);
byte v = gray >= threshold ? (byte)255 : (byte)0;
bw.SetPixel(x, y, Color.FromArgb(v, v, v));
}
return bw;
}
// Example usage
// var bin = ToBinary(image, 190);
// image.Dispose();
// image = bin;
ステップ2 - OCR Settings を設定する(構築で利用可能な場合、オプション)
いくつかの Aspose.OCR 構築は、エンジンレベルの設定を表示します. パッケージがそれらを持っている場合は、セグメントと認識を助けるために 言語 と ページの配置 ヒントを設定します。
// Only if your build exposes these settings:
using Aspose.Ocr;
var settingsAvailable = false; // flip true if your API supports it
// Example (may vary by package version):
// ocrEngine.Settings.Language = RecognitionLanguages.English;
// ocrEngine.Settings.PageSegmentationMode = PageSegmentationMode.Auto;
いつ設定するか:
- ** 混合言語:** 適切な単語または複数語のモードに切り替えます。
- テキストブロック:**
PageSegmentationMode.Auto
・「ドキュメンタリーモード」
- テキストブロック:**
- **フォーム/テーブル:**は ドキュメントセグメントを好み、可能な限り地域に収穫します。
ステップ 3 - 実行 OCR & 評価
これは、ヘッドからの 正確な流れ です: 事前処理 → 認識 → の印刷。
using System;
using System.Drawing;
using Aspose.Ocr;
using Aspose.Ocr.ImageProcessing;
namespace OCRImprovementExample
{
class Program
{
static void Main(string[] args)
{
string imagePath = "low_quality_image.png";
Bitmap image = (Bitmap)Image.FromFile(imagePath);
// Preprocess (median + contrast/brightness)
var filterOptions = new FilterOptions { MedianFilter = true, MedianFilterSize = 3 };
var contrastOptions = new ContrastOptions { ContrastAdjustment = 20, BrightnessAdjustment = 10 };
var processingOptions = new ImageProcessingOptions();
processingOptions.Filters.Add(filterOptions);
processingOptions.Contrast = contrastOptions;
using (Aspose.Ocr.Api.OcrEngine ocrEngine = new Aspose.Ocr.Api.OcrEngine())
{
// Preprocess
Bitmap preprocessedImage = ocrEngine.PreprocessImage(image, processingOptions);
// OCR
string recognizedText = ocrEngine.RecognizeImage(preprocessedImage);
Console.WriteLine("Recognized Text:");
Console.WriteLine(recognizedText);
}
}
}
}
エクスポートテキスト: 検査のためのファイルに書く:
File.WriteAllText("recognized.txt", recognizedText);
症状 → 修正(API オプションを含むチェック シート)
Symptom | 何を試すか | どのように設定するか(コード) |
---|---|---|
スペックル騒音 / JPEG アーティファクト** | 中間フィルター(3→5) | new FilterOptions { MedianFilter = true, MedianFilterSize = 3 } |
「暗いもの」 | 明るさを増やす (+5..+15) と対比 (+10.. +25) | new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 } |
「洗い出した」 | 明るさを減らす(5~15)、対比度が低い。 | BrightnessAdjustment = -10, ContrastAdjustment = 10..20 |
小さいテキスト | スケール ×1.25×1.75 その後 OCR | image = Upscale(image, 1.5); |
** バースバック / 色の騒音** | DIY バイナリ化またはCrop ROI | var bin = ToBinary(image, 185); または image = image.Clone(roi, ...) |
スケジュールスキャン | Deskew(暴露された場合)または再スキャンストレイヤー | (あなたの構造がDeskwオプションを表示している場合は、それを有効にします; 別に収穫&リスカン) |
●「混合言語」 | OCR言語(s)を明確に設定する | (利用可能な場合) ocrEngine.Settings.Language = RecognitionLanguages.English; |
●タブレットコンテンツ* | OCR前のテーブル地域への収穫 | image.Clone(roi, image.PixelFormat) |
すべての構造が同じ エンジン設定 を示すわけではありません. パッケージに属性がない場合は、上記の **画像プレプロセッサ ** テクニックに依存してください - 彼らは API 安定し、効果的です。
ベストプラクティス
- 小さなステップで振り回します。 1 つのパラメーターを同時に変更します(例えば、
MedianFilterSize
3→5、結果を比較する。 - ** ROI を好みます。** 関連する領域だけに横たわることは、よくフィルターを打ち負かします。
- 過剰な処理を避けましょう. あまりにも多くのブルー/アップスカリングはグリフ形状を破壊することができます。
- 自動バゼリン. トリックな画像の小さなゴールデンセットを保持し、リグレーションを検出するためにCIで実行します。
- Save intermediates. 事前に処理された画像を保存する
./debug/
トゥーニング中にフォルダー。