Text in Bildern erkennen (OCR) in Rust
Optical Character Recognition (OCR) ist eine leistungsfähige Technologie, mit der Computer Text aus Bildern extrahieren können. In diesem DevTip zeigen wir, wie Sie OCR in Rust mithilfe der Tesseract-Bibliothek und wirksamer Bildverarbeitungstechniken für eine genaue Textextraktion umsetzen.
Einführung
Die Performance und die Sicherheitsgarantien von Rust machen die Sprache zu einer ausgezeichneten Wahl für OCR-Lösungen. Ob Sie ein System zur Dokumentenverarbeitung aufbauen oder Ihre Anwendung um Funktionen zur Textextraktion erweitern: Rust bietet ein robustes Ökosystem, um diese Aufgaben effizient zu erledigen.
Voraussetzungen
- Aktuelles stabiles Rust (
image0.25.10 erfordert Rust 1.88 oder neuer) - Tesseract 5.0 oder neuer
- pkg-config, einen C-Compiler und libclang (Xcode Command Line Tools unter macOS)
- Englische Tesseract-Sprachdaten (
eng.traineddata) - Grundkenntnisse in Rust und Cargo
Das Projekt einrichten
Erstellen Sie zunächst ein neues Rust-Projekt und fügen Sie die erforderlichen Abhängigkeiten in Ihre Cargo.toml ein:
[dependencies]
tesseract = "0.15.2"
image = "0.25.10"
anyhow = "1.0"
tempfile = "3"
Behalten Sie Cargo.lock im Repository Ihrer Anwendung, um die aufgelösten Abhängigkeitsversionen zu reproduzieren.
Tesseract installieren
Bevor Sie die Rust-Bindings verwenden, installieren Sie Tesseract auf Ihrem System.
Unter Ubuntu/Debian
sudo apt-get install tesseract-ocr tesseract-ocr-eng tesseract-ocr-osd libtesseract-dev libleptonica-dev pkg-config libclang-dev build-essential
Unter macOS
brew install tesseract pkgconf
Grundlegende OCR-Umsetzung
Dieses Beispiel zeigt, wie Sie mit Tesseract in Rust Text aus einem Bild extrahieren.
use anyhow::Result;
use tesseract::Tesseract;
fn main() -> Result<()> {
// Initialize Tesseract for English language
let mut ocr = Tesseract::new(None, Some("eng"))?
.set_image("input.png")?;
// Retrieve the extracted text
let text = ocr.get_text()?;
println!("{}", text);
Ok(())
}
Verschiedene Bildformate verarbeiten
Die Vorverarbeitung von Bildern kann die OCR-Genauigkeit verbessern. Die folgende Funktion wandelt ein Bild in Graustufen um, speichert es temporär und führt die OCR aus. Jeder Aufruf besitzt ein eigenes temporäres Verzeichnis, das entfernt wird, sobald es den Gültigkeitsbereich verlässt, auch dann, wenn ein Vorgang einen Fehler zurückgibt.
use anyhow::{Context, Result};
use tesseract::Tesseract;
fn prepare_image_for_ocr(image_path: &str) -> Result<String> {
// Load the image and convert it to grayscale
let img = image::open(image_path)?.grayscale();
// Save the preprocessed image to a temporary file
let temp_dir = tempfile::tempdir()?;
let temp_path = temp_dir.path().join("processed.png");
img.save(&temp_path)?;
// Leptonica rewrites /tmp paths on macOS; resolve symlinks before passing the filename.
let temp_path = temp_path.canonicalize()?;
// Perform OCR on the processed image
let mut ocr = Tesseract::new(None, Some("eng"))?
.set_image(temp_path.to_str().context("Temporary path is not valid UTF-8")?)?;
let text = ocr.get_text()?;
Ok(text)
}
Erweiterte OCR-Konfiguration
Tesseract lässt sich über Konfigurationsoptionen wie Zeichen-Whitelists oder Seitensegmentierungsmodi feinjustieren.
use anyhow::Result;
use tesseract::Tesseract;
fn configure_ocr() -> Result<String> {
let mut ocr = Tesseract::new(None, Some("eng"))?
.set_variable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")?
.set_variable("tessedit_pageseg_mode", "1")?
.set_image("input.png")?;
let text = ocr.get_text()?;
Ok(text)
}
- Die Einstellung
tessedit_char_whitelistbeschränkt die Erkennung auf die angegebenen Zeichen und reduziert so mögliche Fehler. - Durch Anpassen von
tessedit_pageseg_modelässt sich optimieren, wie Tesseract das Bild für unterschiedliche Layouts segmentiert.
Bewährte Verfahren für OCR in Rust
-
Bildvorverarbeitung
- Wandeln Sie Bilder in Graustufen um, um die Sichtbarkeit des Textes zu verbessern.
- Sorgen Sie für eine Auflösung von mindestens 300 DPI, damit der Text klar lesbar ist.
- Entfernen Sie Bildrauschen, indem Sie Bildfilter anwenden.
-
Performance-Optimierung
- Verwenden Sie für jedes gleichzeitig verarbeitete Bild eine eigene Tesseract-Instanz.
- Setzen Sie Caching für häufig verarbeitete Dokumente ein.
- Ziehen Sie Batch-Verarbeitung in Betracht, wenn Sie große Bildmengen verarbeiten.
-
Fehlerbehandlung
Eine saubere Fehlerbehandlung sorgt dafür, dass Ihre Anwendung Probleme während der OCR-Vorgänge elegant abfängt.
use anyhow::{Context, Result};
use tesseract::Tesseract;
fn robust_ocr(image_path: &str) -> Result<String> {
let image_path = std::fs::canonicalize(image_path)
.context("Failed to load image")?;
let mut ocr = Tesseract::new(None, Some("eng"))
.context("Failed to initialize Tesseract")?
.set_image(image_path.to_str().context("Image path is not valid UTF-8")?)
.context("Failed to load image")?;
let text = ocr.get_text()
.context("Failed to perform OCR")?;
Ok(text)
}
Mehrere Sprachen verarbeiten
Tesseract unterstützt mehrere Sprachen. Dieses Beispiel zeigt die Texterkennung auf Englisch,
Französisch und Deutsch. Installieren Sie zuerst alle drei Sprachmodelle: Unter Ubuntu/Debian fügen
Sie tesseract-ocr-fra und tesseract-ocr-deu hinzu; unter macOS liefert brew install tesseract-lang
zusätzliche Sprachen. Prüfen Sie sie anschließend mit tesseract --list-langs. Für ein eigenes Modellverzeichnis setzen Sie
TESSDATA_PREFIX auf das Verzeichnis, in dem die Dateien mit der Endung .traineddata liegen.
use anyhow::{Context, Result};
use tesseract::Tesseract;
fn multilingual_ocr(image_path: &str) -> Result<String> {
// Initialize Tesseract with multiple languages: English, French, and German
let image_path = std::fs::canonicalize(image_path)?;
let mut ocr = Tesseract::new(None, Some("eng+fra+deu"))?
.set_image(image_path.to_str().context("Image path is not valid UTF-8")?)?;
let text = ocr.get_text()?;
Ok(text)
}
Fazit
Die Umsetzung von OCR in Rust mit Tesseract ist eine robuste Lösung, um Text aus Bildern zu extrahieren. Die Sicherheit und Performance von Rust ermöglichen Ihnen in Kombination mit den ausgereiften OCR-Fähigkeiten von Tesseract, effiziente Systeme zur Textextraktion zu bauen.
Für zusätzliche Funktionen können Sie Ihre OCR-Lösung mit dem Dienst zur Dokumentenverarbeitung von Transloadit ergänzen.
