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

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

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

このデータを公開するAdvancedOcrResultBaseにあります。 レイアウト認識ドキュメントのためのReadDocumentAdvanced()と、カメラインプットのためのOcrResult.Wordsコレクションと同じ粒度を返します。

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

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

NuGet NuGetでインストール

PM >  Install-Package IronOcr

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

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

数行で、認識されたすべての単語をその座標、ページ番号、信頼スコアとともに取得するには、result.Wordsを反復します。

  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コレクションは、すべてのページで検出されたすべての単語を返します。 それぞれのエントリー(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} | " +
        $"'{word.Text}' | " +
        $"Position: ({word.X}, {word.Y}) | " +
        $"Size: {word.Width}x{word.Height} | " +
        $"Confidence: {word.Confidence: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} | " &
            $"'{word.Text}' | " &
            $"Position: ({word.X}, {word.Y}) | " &
            $"Size: {word.Width}x{word.Height} | " &
            $"Confidence: {word.Confidence:P1}"
        )
    Next

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

ヒント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を調整します: 10–15ピクセルは標準の12ptテキストで300 DPIで機能します。 大きな見出しや手書きの入力については、多少の許容範囲を設けてください。 このパターンは、エンジンが各列やセルを個別の領域として認識する、複数列のページや表のセル内において特に有用です。

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

データベース、検索インデックス、 または下流の抽出に到達する前に低品質の検出を除外するには、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.Confidence >= threshold)
    .ToList();

var lowConfidenceWords = result.Words
    .Where(w => w.Confidence < 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.Confidence:P1}"
    );
}
Imports IronOcr
Imports System.Linq

Dim ocr = New IronTesseract()
Using input = 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.Confidence >= threshold) _
        .ToList()

    Dim lowConfidenceWords = result.Words _
        .Where(Function(w) w.Confidence < 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.Confidence: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

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

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

検証、注釈付け、またはラベル付きトレーニングデータの作成のために単語の視覚領域を抽出するには、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.Clone(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.Clone(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日間トライアルを開始するか、ライセンスオプションをご覧ください

よくある質問

C#での高度なOCRとは?

C#での高度なOCRとは、IronOCRの高度なパイプラインを使用して、詳細な単語や文字データ、座標、信頼レベル、バウンディングボックスを含む、光学式文字認識を行うプロセスを指します。

IronOCRを使用して単語データにアクセスするにはどうすればよいですか?

IronOCRでは、AdvancedWordコレクションを反復することで単語データにアクセスでき、スキャンされた文書内の各単語の位置と信頼度スコアの詳細な情報を提供します。

OCRでのバウンディングボックスの意義は何ですか?

バウンディングボックスはOCRにおいて非常に重要であり、スキャン画像上の認識されたテキスト要素の場所と寸法を正確に定義し、正確なテキスト抽出と画像操作を可能にします。

信頼度スコアでOCR結果をフィルタリングできますか?

はい、IronOCRを使用すれば信頼度スコアでOCR結果をフィルタリングし、高精度で認識されたテキストのみをさらに処理するために考慮することができます。

OCR結果で読み順を再構築する方法は?

IronOCRが提供するAdvancedWordおよびAdvancedCharacterオブジェクトのシーケンスを分析することで、OCR結果での読み順を再構築できます。これにより文書の自然な読み流れが反映されます。

IronOCRを使用してソース画像をトリミングすることは可能ですか?

IronOCRは、認識された単語や文字のバウンディングボックスと座標を含むテキストデータの分析に基づいて、ソース画像をトリミングすることを可能にします。

AdvancedWordとAdvancedCharacterコレクションとは何ですか?

IronOCRのAdvancedWordとAdvancedCharacterコレクションは、認識された各単語および文字の詳細な情報を格納するデータ構造で、座標、信頼度レベル、およびバウンディングボックスを含みます。

IronOCRは文字認識をどのように処理しますか?

IronOCRは、高度なパイプラインを利用して各文字の特徴を分析し、その位置、サイズ、認識信頼度などの詳細データを提供することで文字認識を処理します。

IronOCRでどのような種類のドキュメントを処理できますか?

IronOCRはPDF、スキャン画像、写真など幅広い種類の文書を処理し、高精度と詳細なテキストデータを抽出できます。

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

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

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

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

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

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

準備はできましたか?
Nuget ダウンロード 6,136,090 | バージョン: 2026.7 リリースされたばかり
Still Scrolling Icon

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

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