Słabe skanowanie, strzały telefoniczne, faksy i kompresowane nagrania ekranu często pokonują OCR. Dobra wiadomość: małe przedprzetwarzanie jest długą drogą. Ten przewodnik daje praktyczne, rynkowe kroki (zharmonizowane z gąbką na końcu) do czyszczenia obrazów wcześniej i do tune silnika O CR dla znacznie lepszych wyników.
Pełny przykład
Warunki
- Źródło: .NET 8 (lub .Net 6+) SDK
- W Nowym Jorku:
Aspose.OCR
- ( opcjonalne )
Aspose.Total.lic
Jeśli planujesz przekroczyć granice oceny
Stwórz aplikację konsoli i dodaj pakiet:
dotnet new console -n OCRImprovementExample -f net8.0
cd OCRImprovementExample
dotnet add package Aspose.OCR
Krok 1 – Wstępne przetwarzanie obrazów niskiej jakości
**Celem: ** zmniejszenie hałasu, normalizacja kontrastu / jasności oraz (opcjonalnie) upscale lub uprawy przed OCR.
1.1 Pobierz obraz
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 Usuwanie hałasu (przeciętny filtr)
Użyj środkowego filtra, aby powstrzymać hałas soli i papryki oraz artefakty 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
};
- Kiedy warto się zmienić: *
- Jeśli wciąż widzisz spektrum, podnieś
MedianFilterSize
do * 5 *. - Jeśli znikają drobne znaky, wracaj do 3 lub wyłącz je.
1.3 Normalizacja kontrastu / jasności
Pozwól, aby tekst wyszedł z tła.
var contrastOptions = new ContrastOptions
{
// Positive values increase contrast/brightness; negatives decrease
ContrastAdjustment = 20, // try 10..30
BrightnessAdjustment = 10 // try -10..+15 based on exposure
};
- Przepisy dotyczące gumy: *
- Zawsze narażone (wymyte): zmniejsza jasność (np. -10) i utrzymuje kontrast umiarkowany.
- Nie eksponowane (zbyt ciemne): zwiększa jasność (np. +10) i kontrast (p.in., ** +20**).
1.4 Budowa rurociągu przetwarzania i wstępne przetwarzanie
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 (opcjonalny) Upscale mały tekst
Jeśli tekst jest bardzo mały (w wysokości <10px), upscale przed OCR za pomocą wysokiej jakości odbioru.
// 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 (opcjonalne) uprawy w regionie odsetek (ROI)
Jeśli potrzebujesz tylko jednej porcji (np. nagłówka, sumy faktury), rośliny zmniejszają pęknięcie i błąd.
// 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 (opcjonalna) szybka binaryzacja (DIY)
Jeśli kolory tła są skomplikowane, konwertuj do szary i granicy. (Użyj tego tylko jeśli Twój OCR budowa brakuje dedykowanej opcji binaryzacji; jest to prosty spadek.)
// 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;
Krok 2 – Konfiguruj ustawienia OCR (opcjonalne, jeśli dostępne w budowie)
Niektóre konstrukcje Aspose.OCR wyświetlają ustawienia na poziomie silnika.Jeśli paczka ma je, ustawić język i layout strony wskazówki, aby pomóc w segmentacji i rozpoznawaniu.
// 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;
*Kiedy należy ustawić: *
- Języki mieszane: przełącz się na odpowiedni tryb językowy lub wielojęzyczny.
- Bloki tekstowe: *
PageSegmentationMode.Auto
lub w trybie „Dokument”.
- Bloki tekstowe: *
- Formy / tabele: preferuje segmentację Dokument; roślina do regionu w miarę możliwości.
Krok 3 – Run OCR & Evaluate
To jest dokładny przepływ z żelu: preproces → rozpoznawanie → drukowanie.
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);
}
}
}
}
Teks eksportujący: Napisz do pliku do inspekcji:
File.WriteAllText("recognized.txt", recognizedText);
Symptom → Fix (Cheat-Sheet z opcjami API)
Symptom | Co spróbować | Jak ustawić kod (kod) |
---|---|---|
** Dźwięk widokowy / JPEG artefakty** | Średni filtr (3 → 5) | new FilterOptions { MedianFilter = true, MedianFilterSize = 3 } |
„Too Dark” | Zwiększ jasność (+5..+15) i kontrast (+10.. +25) | new ContrastOptions { BrightnessAdjustment = 10, ContrastAdjustment = 20 } |
* wyprostowane * | Zmniejszenie jasności (-5..-15), umiarkowany kontrast | BrightnessAdjustment = -10, ContrastAdjustment = 10..20 |
* Bardzo mały tekst * | Wskaźnik × 1.25–× 1.75, Następnie OCR | image = Upscale(image, 1.5); |
Bosy tło / kolor hałasu | DIY binaryzacja lub crop ROI | var bin = ToBinary(image, 185); lub image = image.Clone(roi, ...) |
* skanowanie skręcone * | Deskw (jeśli wystawiony) lub ponowne skanowanie | (Jeśli Twój budynek wystawia opcję Deskew, włączyć ją; inaczej zbiór i rescan) |
* Języki mieszane * | Ustaw język OCR(s) wyraźnie | (jeśli jest dostępny) ocrEngine.Settings.Language = RecognitionLanguages.English; |
* zawartość tablicy * | Roślina do regionu tabeli przed OCR | image.Clone(roi, image.PixelFormat) |
Nie wszystkie budynki narażają się na te same ** ustawienia silnika**. Jeśli nieruchomość nie jest dostępna w pakiecie, polegaj na powyższych ** technikach przedprzetworzenia obrazu** – są one API stabilne i skuteczne.
Najlepsze praktyki
- Tweak w małych krokach. Zmień jeden parametr naraz (np.
MedianFilterSize
3 → 5) i porównaj wyniki. - Prefer ROI. Przekropanie tylko do odpowiedniego obszaru często uderza w dowolny filtr.
- ** Unikaj nadmiernego przetwarzania.** Zbyt dużo blur/upcaling może zniszczyć kształty glify.
- Bazeliny automatyczne. Utrzymuj mały złote zestawy nieśmiałych obrazów i uruchom je w CI, aby wykryć regresje.
- Zachowaj pośredników. Zapisz wstępnie przetworzone obrazy do
./debug/
folder podczas tuningu.