C# における WORD および文字の OCR データ(座標、信頼度、バウンディングボックス)

This article was translated from English: Does it need improvement?
Translated
View the article in English

文書に対してOCRを実行した後、抽出されたテキストだけでは不十分な場合がよくあります。 ページ上の特定の値を特定したり、精度の低い検出結果を除外したり、複数列レイアウトで自然な読み順を再構築したりするには、WORDごとの座標、ページ番号、領域インデックス、および信頼度スコアが必要です。

Words および Characters コレクションは、AdvancedOcrResultBase 上でこのデータを公開しています。 レイアウトを意識したドキュメント用の ReadDocumentAdvanced() およびカメラ入力用の ReadPhoto() は、標準の OcrResult.Words コレクションを通じて利用可能なものと同じ粒度でデータを返します。

このガイドでは、WORDデータの反復処理、読み順の再構築、信頼度によるフィルタリング、文字レベルでの処理、バウンディングボックスからのソース画像の切り抜きという、5つの一般的なパターンについて解説します。

30日間トライアルを開始して、これらのコレクションをパイプラインで試してみてください。

NuGet NuGetでインストール

PM >  Install-Package IronOcr

IronOCRNuGet でチェックしてください。1000万回以上のダウンロードで、C#によるPDF開発を変革しています。 DLL または Windowsインストーラー をダウンロードすることもできます。

クイックスタート: OCR結果からWORDおよび文字データを読み取る

ReadDocumentAdvanced(または result.Words を反復処理することで、認識されたすべてのWORDとその座標、ページ番号、信頼度スコアを数行で取得できます。

  1. IronOCR をNuGetパッケージマネージャでインストール

    PM > Install-Package IronOcr
  2. このコード スニペットをコピーして実行します。

    var result = new IronTesseract().ReadDocumentAdvanced(new OcrInput("scan.png"));
    foreach (var word in result.Words)
        Console.WriteLine($"{word.Text} @ ({word.X},{word.Y}) conf:{word.RegionConfidence:P0}");
  3. 実際の環境でテストするためにデプロイする

    今日プロジェクトで IronOCR を使い始めましょう無料トライアル

    arrow pointer


座標と信頼度を含むWORDの反復処理はどのように行いますか?

Words コレクションは、すべてのページで検出された WORD をすべて返します。 各エントリ(AdvancedWord または AdvancedCharacter、いずれも AdvancedOcrElement を継承)には、テキスト、ピクセル座標、寸法、所属するページ、どの検出済みテキストブロックに含まれるかを特定する領域インデックス、およびその領域の信頼度スコアが記載されています。

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-iterate-words.cs
using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("receipt.png");

var result = ocr.ReadDocumentAdvanced(input);

foreach (var word in result.Words)
{
    Console.WriteLine(
        $"Page {word.PageNumber} | " +
        $"Region {word.RegionIndex} | " +
        $"'{word.Text}' | " +
        $"Position: ({word.X}, {word.Y}) | " +
        $"Size: {word.Width}x{word.Height} | " +
        $"Confidence: {word.RegionConfidence:P1}"
    );
}

// ToString() override for diagnostic logging
Console.WriteLine(result.Words.First().ToString());
Imports IronOcr

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("receipt.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    For Each word In result.Words
        Console.WriteLine(
            $"Page {word.PageNumber} | " &
            $"Region {word.RegionIndex} | " &
            $"'{word.Text}' | " &
            $"Position: ({word.X}, {word.Y}) | " &
            $"Size: {word.Width}x{word.Height} | " &
            $"Confidence: {word.RegionConfidence:P1}"
        )
    Next
End Using

' ToString() override for diagnostic logging
Console.WriteLine(result.Words.First().ToString())
$vbLabelText   $csharpLabel

ヒントPageNumber は 1 から始まる番号付けです。1 ページ目は 1 であり、0 ではありません。 これは、0 ベースのインデックスを使用するほとんどの .NET コレクションとは異なります。 RegionIndex は、0 ベースの標準的な表記規則に従っています。

描画またはトリミングAPIに座標を渡すには、BoundingBox プロパティを使用します。 位置とサイズを単一の IronSoftware.Drawing.Rectangle にまとめます。

読み順をどのように再構築しますか?

複数列のレイアウトでは、Words コレクションの反復順序が、ページ上の視覚的な読み順と一致していません。 WORDは検出された領域ごとにグループ化されるため、列や表のセルが順序通りに返されない場合があります。

自然な上から下、左から右の順序を再現するには、まずY座標でコレクションをソートし、各行内でX座標でソートしてください。Y座標にわずかな許容誤差を設けることで、同じベースライン上に位置するWORDをグループ化します。

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-reading-order.cs
using IronOcr;
using System.Linq;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("multi-column-doc.png");

var result = ocr.ReadDocumentAdvanced(input);

int targetPage = 1;
int lineThreshold = 10; // pixel tolerance for grouping same-line words

// Sort by line (Y), then left-to-right (X)
var pageWords = result.Words
    .Where(w => w.PageNumber == targetPage)
    .OrderBy(w => w.Y / lineThreshold)
    .ThenBy(w => w.X)
    .ToList();

foreach (var word in pageWords)
{
    Console.Write($"{word.Text} ");
}
Console.WriteLine();
Imports IronOcr
Imports System.Linq

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("multi-column-doc.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    Dim targetPage As Integer = 1
    Dim lineThreshold As Integer = 10 ' pixel tolerance for grouping same-line words

    ' Sort by line (Y), then left-to-right (X)
    Dim pageWords = result.Words _
        .Where(Function(w) w.PageNumber = targetPage) _
        .OrderBy(Function(w) w.Y \ lineThreshold) _
        .ThenBy(Function(w) w.X) _
        .ToList()

    For Each word In pageWords
        Console.Write($"{word.Text} ")
    Next
    Console.WriteLine()
End Using
$vbLabelText   $csharpLabel

lineThreshold をドキュメントに合わせて調整してください。300 DPI の標準的な 12pt テキストの場合、10~15 ピクセルが適しています。 大きな見出しや手書きの入力については、多少の許容範囲を設けてください。 このパターンは、エンジンが各列やセルを個別の領域として認識する、複数列のページや表のセル内において特に有用です。

信頼度の低い単語はどのようにフィルタリングしますか?

低品質な検出結果がデータベース、検索インデックス、または下流の抽出処理に到達するのを防ぐには、RegionConfidence でコレクションをフィルタリングしてください。 スコアは0.0から1.0の範囲で、数値が高いほど検出されたテキストに対する信頼度が高いことを示します。

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-confidence-filter.cs
using IronOcr;
using System.Linq;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("noisy-scan.png");

var result = ocr.ReadDocumentAdvanced(input);

double threshold = 0.75;

var highConfidenceWords = result.Words
    .Where(w => w.RegionConfidence >= threshold)
    .ToList();

var lowConfidenceWords = result.Words
    .Where(w => w.RegionConfidence < threshold)
    .ToList();

Console.WriteLine($"Accepted: {highConfidenceWords.Count} words");
Console.WriteLine($"Rejected: {lowConfidenceWords.Count} words");

// Log rejected words for manual review
foreach (var word in lowConfidenceWords)
{
    Console.WriteLine(
        $"  LOW CONF: '{word.Text}' at ({word.X},{word.Y}) — {word.RegionConfidence:P1}"
    );
}
Imports IronOcr
Imports System.Linq

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("noisy-scan.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    Dim threshold As Double = 0.75

    Dim highConfidenceWords = result.Words _
        .Where(Function(w) w.RegionConfidence >= threshold) _
        .ToList()

    Dim lowConfidenceWords = result.Words _
        .Where(Function(w) w.RegionConfidence < threshold) _
        .ToList()

    Console.WriteLine($"Accepted: {highConfidenceWords.Count} words")
    Console.WriteLine($"Rejected: {lowConfidenceWords.Count} words")

    ' Log rejected words for manual review
    For Each word In lowConfidenceWords
        Console.WriteLine(
            $"  LOW CONF: '{word.Text}' at ({word.X},{word.Y}) — {word.RegionConfidence:P1}"
        )
    Next
End Using
$vbLabelText   $csharpLabel

スキャン品質にばらつきがある場合(一部の領域は鮮明だが、他の部分は画質が劣化しているなど)、これにより信頼性の低い出力が下流のシステムに到達するのを防ぎます。 ソース側の信頼度スコアを高めるため、画像前処理フィルター(Deskew、DeNoise、Binarize)がしきい値の適用前に画質を向上させます。

文字単位での反復処理はどのように行いますか?

OCR検証オーバーレイ、グラウンドトゥルースとの文字単位の比較、またはフォームフィールドの精密な空間分析には、Charactersコレクションをご利用ください。 これは Words を反映していますが、個々の文字単位で解決されます。

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-characters.cs
using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("form-field.png");

var result = ocr.ReadDocumentAdvanced(input);

foreach (var ch in result.Characters)
{
    Console.WriteLine(
        $"'{ch.Text}' | " +
        $"Box: ({ch.X}, {ch.Y}, {ch.Width}, {ch.Height}) | " +
        $"Page {ch.PageNumber}"
    );
}

// ToString() override provides diagnostic-friendly output
Console.WriteLine(result.Characters.First().ToString());
Imports IronOcr

Dim ocr = New IronTesseract()
Using input = New OcrInput()
    input.LoadImage("form-field.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    For Each ch In result.Characters
        Console.WriteLine($"'{ch.Text}' | Box: ({ch.X}, {ch.Y}, {ch.Width}, {ch.Height}) | Page {ch.PageNumber}")
    Next

    ' ToString() override provides diagnostic-friendly output
    Console.WriteLine(result.Characters.First().ToString())
End Using
$vbLabelText   $csharpLabel

ご注意WordsCharacters の両方は遅延評価され、キャッシュされます。 最初のアクセスによって計算が開始されます; (以降のアクセスではキャッシュされた結果が返されるため、2回目以降の反復処理にはコストがかかりません。)}]

バウンディングボックスを使用して元の画像をトリミングするにはどうすればよいですか?

検証、アノテーション、またはラベル付きトレーニングデータの構築のためにWORDの視覚領域を抽出するには、BoundingBox プロパティを AnyBitmap.CropRegion() に渡します。 バウンディングボックスは、ソース画像内のWORDの位置と直接対応しています。

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-crop-boundingbox.cs
using IronOcr;
using IronSoftware.Drawing;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("invoice.png");

var result = ocr.ReadDocumentAdvanced(input);

// Load the original image for cropping
var originalImage = AnyBitmap.FromFile("invoice.png");

// Find a specific word and crop its region
var targetWord = result.Words.FirstOrDefault(w => w.Text == "Total");
if (targetWord != null)
{
    Rectangle cropRect = targetWord.BoundingBox;
    AnyBitmap croppedRegion = originalImage.CropRegion(cropRect);
    croppedRegion.SaveAs("total-region.png");

    Console.WriteLine(
        $"Cropped '{targetWord.Text}' from " +
        $"({cropRect.X}, {cropRect.Y}, {cropRect.Width}, {cropRect.Height})"
    );
}
Imports IronOcr
Imports IronSoftware.Drawing

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("invoice.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    ' Load the original image for cropping
    Dim originalImage = AnyBitmap.FromFile("invoice.png")

    ' Find a specific word and crop its region
    Dim targetWord = result.Words.FirstOrDefault(Function(w) w.Text = "Total")
    If targetWord IsNot Nothing Then
        Dim cropRect As Rectangle = targetWord.BoundingBox
        Dim croppedRegion As AnyBitmap = originalImage.CropRegion(cropRect)
        croppedRegion.SaveAs("total-region.png")

        Console.WriteLine(
            $"Cropped '{targetWord.Text}' from " &
            $"({cropRect.X}, {cropRect.Y}, {cropRect.Width}, {cropRect.Height})"
        )
    End If
End Using
$vbLabelText   $csharpLabel

このパターンはバッチ処理にも拡張可能です。すべてのWORDを反復処理し、各ボックスを切り出し、カスタムフォントのトレーニングや下流の機械学習パイプライン用にラベル付きデータセットをエクスポートします。 座標は前処理後の画像を反映しています; EnhanceResolution のようなフィルターによって寸法が変更された場合、バウンディングボックスはディスク上の元の画像ではなく、処理後の画像に一致します。

次のステップ

高度なパイプラインは、IronTesseract.Read()と同様の空間的詳細を提供し、さらにレイアウトに関する高度な処理機能を備えています。関連トピック:

30日間トライアルを開始するか、ライセンスオプションをご覧ください

よくある質問

OCRとは何であり、なぜ重要ですか?

OCR(Optical Character Recognition, 光学文字認識)は、スキャンした紙の文書、PDF、デジタルカメラで撮影した画像など様々な種類の文書を編集可能で検索可能なデータに変換する技術です。OCRはデータ抽出を自動化し、手動によるデータ入力を削減し、情報へのアクセスを簡素化し編集可能にするため重要です。

IronOCRはOCRプロセスをどのように強化しますか?

IronOCRは正確で高速なテキスト認識機能を提供することによりOCRプロセスを強化します。複数の言語をサポートし、テキスト認識精度を向上させる画像前処理のような機能を含んでいます。

IronOCRは複数ページの文書を処理できますか?

はい、IronOCRは複数ページの文書を効率的に処理し、各ページからテキストを抜き出し、ユーザーがドキュメント全体を一体として扱えるようにします。

IronOCRは、画像、PDF、スキャンされたドキュメントなどの幅広いファイル形式をサポートし、異なるメディアでのテキスト認識タスクに柔軟性を提供します。

IronOCRは、PDF、TIFF、JPEG、PNG、BMPを含む幅広いファイル形式をサポートしており、処理可能な文書タイプの柔軟性を提供します。

IronOCRは低品質の画像のテキスト認識に適していますか?

はい、IronOCRには高解像度または低品質の画像の品質を向上させ、テキスト認識の精度を高める高度な画像前処理機能が含まれています。

IronOCRは複数の言語をサポートしていますか?

IronOCRは複数言語をサポートしており、異なる言語でのテキスト認識を必要とするグローバルアプリケーションに対する多用途ツールです。

IronOCRは既存のアプリケーションに統合できますか?

IronOCRはC#を使用して既存のアプリケーションに簡単に統合できるよう設計されており、開発者がソフトウェアにOCR機能を少ない手間で追加できるようにします。

ドキュメント管理でIronOCRを使用する利点は何ですか?

IronOCRを使用することで、スキャンされた文書を検索可能かつ編集可能なテキストに変換し、手作業によるデータ入力を減らし、文書のアクセス性を向上させることでワークフローを効率化します。

IronOCRはデータ精度をどのように向上させますか?

IronOCRはその高度な認識アルゴリズムと画像補正機能により、信頼性が高く正確なテキスト抽出プロセスを保証します。

IronOCRの無料トライアルを利用できますか?

はい、Iron SoftwareはIronOCRの無料トライアルを提供しており、ユーザーが購入決定をする前にその機能と能力をテストできます。

Darrius Serrant
フルスタックソフトウェアエンジニア(WebOps)

Darrius Serrantは、マイアミ大学でコンピュータサイエンスの学士号を取得し、Iron SoftwareでフルスタックWebOpsマーケティングエンジニアとして働いています。若い頃からコーディングに惹かれ、コンピューティングを神秘的かつアクセス可能なものとし、創造性と問題解決のための完璧な媒体と考えていました。

Iron Softwareでは、新しいものを創造することと、複雑なコンセプトをより理解しやすくすることを楽しんでいます。Resident Developerの一人として、次世代に専門知識を共有するために、学生を教えることにも志願しました。

Darriusにとって、その仕事は価値があり、実際の影響があるため、満足感があります。

準備はできましたか?
Nuget ダウンロード 5,887,215 | バージョン: 2026.5 just released
Still Scrolling Icon

まだスクロールしていますか?

すぐに証拠が欲しいですか? PM > Install-Package IronOcr
サンプルを実行 あなたの画像が検索可能なテキストになるのをご覧ください。