# C# における WORD および文字の OCR データ(座標、信頼度、バウンディングボックス)
文書に対してOCRを実行した後、抽出されたテキストだけでは不十分な場合がよくあります。 ページ上の特定の値を特定したり、精度の低い検出結果を除外したり、複数列レイアウトで自然な読み順を再構築したりするには、WORDごとの座標、ページ番号、領域インデックス、および信頼度スコアが必要です。
このデータを公開する`AdvancedOcrResultBase`にあります。 レイアウト認識ドキュメントのための[`ReadDocumentAdvanced()`](https://ironsoftware.com/csharp/ocr/how-to/read-table-in-document/)と、カメラインプットのための<a href="https://ironsoftware.com/csharp/ocr/how-to/read-photo/">`OcrResult.Words`コレクションと同じ粒度を返します。</a>
このガイドでは、WORDデータの反復処理、読み順の再構築、信頼度によるフィルタリング、文字レベルでの処理、バウンディングボックスからのソース画像の切り抜きという、5つの一般的なパターンについて解説します。
[30日間トライアルを開始して](#trial-license)、これらのコレクションをパイプラインで試してみてください。
!!!--LIBRARY_NUGET_INSTALL_BLOCK--!!!
*as-heading:2(クイックスタート: OCR結果からWORDおよび文字データを読み取る)*
数行で、認識されたすべての単語をその座標、ページ番号、信頼スコアとともに取得するには、`result.Words`を反復します。
```cs
:title=Iterate words from an advanced OCR result
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}");
```
<div class="hsg-featured-snippet">
<h3>最小限のワークフロー(3ステップ)</h3>
<ol>
<li><a class="js-modal-open" data-modal-id="trial-license-after-download" href="https://www.nuget.org/packages/IronOcr/">NuGetからC# OCRライブラリをダウンロード</a></li>
<li>入力データに対して<code>、ReadDocumentAdvanced</code> または <code>ReadPhoto</code> を使用して高度な OCR を実行してください</li>
<li>座標、信頼度、バウンディングボックスについては、<code>result.WORD</code> または <code>result.Characters</code> を使用してください。</li>
</ol>
</div>
<br class="clear" />
## 座標と信頼度を含むWORDの反復処理はどのように行いますか?
`Words`コレクションは、すべてのページで検出されたすべての単語を返します。 それぞれのエントリー(`AdvancedOcrElement`から継承)は、テキスト、ピクセル座標、寸法、それが属するページ、それを含む検出テキストブロックを識別する領域インデックス、その領域の信頼スコアを公開します。
```csharp
using IronOcr;
using System;
using System.Linq;
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.RegionConfidence:P1}"
);
}
// ToString() override for diagnostic logging
Console.WriteLine(result.Words.First().ToString());
```
[[t:(`0`ではありません。} これは、0 ベースのインデックスを使用するほとんどの .NET コレクションとは異なります。 `RegionIndex`は標準の0から始まる慣行に従います。)]]
座標を描画または切り取りAPIに渡すには、`BoundingBox`プロパティを使用します。 それは位置とサイズを単一の`IronSoftware.Drawing.Rectangle`にバンドルします。
## 読み順をどのように再構築しますか?
複数列のレイアウトでは、`Words`コレクションの反復順序はページの視覚的な読み取り順序と一致しません。 WORDは検出された領域ごとにグループ化されるため、列や表のセルが順序通りに返されない場合があります。
自然な上から下、左から右の順序を再現するには、まずY座標でコレクションをソートし、各行内でX座標でソートしてください。Y座標にわずかな許容誤差を設けることで、同じベースライン上に位置するWORDをグループ化します。
```csharp
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();
```
ドキュメントに合わせて`lineThreshold`を調整します: 10–15ピクセルは標準の12ptテキストで300 DPIで機能します。 大きな見出しや手書きの入力については、多少の許容範囲を設けてください。 このパターンは、エンジンが各列やセルを個別の領域として認識する、複数列のページや表のセル内において特に有用です。
## 信頼度の低い単語はどのようにフィルタリングしますか?
データベース、検索インデックス、 または下流の抽出に到達する前に低品質の検出を除外するには、`RegionConfidence`でコレクションをフィルタリングします。 スコアは0.0から1.0の範囲で、数値が高いほど検出されたテキストに対する信頼度が高いことを示します。
```csharp
using IronOcr;
using System;
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}"
);
}
```
スキャン品質にばらつきがある場合(一部の領域は鮮明だが、他の部分は画質が劣化しているなど)、これにより信頼性の低い出力が下流のシステムに到達するのを防ぎます。 ソース側の信頼度スコアを高めるため、[画像前処理フィルター](https://ironsoftware.com/csharp/ocr/how-to/image-quality-correction/)(Deskew、DeNoise、Binarize)がしきい値の適用前に画質を向上させます。
## 文字単位での反復処理はどのように行いますか?
[OCR検証オーバーレイ](https://ironsoftware.com/csharp/ocr/examples/highlight-texts-for-debugging/)、グラウンドトゥルースに対する文字レベル差分、またはフォームフィールドでの正確な空間分析のために、`Characters`コレクションを使用します。 それは`Words`を反映していますが、個々の文字にまで解決されます。
```csharp
using IronOcr;
using System;
using System.Linq;
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());
```
[[i:(`Characters`の両方は遅延評価され、キャッシュされます。)]] 最初のアクセスによって計算が開始されます; (以降のアクセスではキャッシュされた結果が返されるため、2回目以降の反復処理にはコストがかかりません。)}]
## バウンディングボックスを使用して元の画像をトリミングするにはどうすればよいですか?
検証、注釈付け、またはラベル付きトレーニングデータの作成のために単語の視覚領域を抽出するには、`AnyBitmap.CropRegion()`に渡します。 バウンディングボックスは、ソース画像内のWORDの位置と直接対応しています。
```csharp
using IronOcr;
using IronSoftware.Drawing;
using System;
using System.Linq;
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})"
);
}
```
このパターンはバッチ処理にも拡張可能です。すべてのWORDを反復処理し、各ボックスを切り出し、[カスタムフォントのトレーニング](https://ironsoftware.com/csharp/ocr/how-to/ocr-custom-font-training/)や下流の機械学習パイプライン用にラベル付きデータセットをエクスポートします。 座標は前処理後の画像を反映しています; フィルターとして`EnhanceResolution`が寸法を変更した場合、バウンディングボックスはディスク上の元のものではなく、処理された画像に一致します。
## 次のステップ
高度なパイプラインは、`IronTesseract.Read()`と同じ空間的な詳細を提供し、それに加えてレイアウトのインテリジェンスを備えています。関連トピック:
- [テーブル抽出ガイド](https://ironsoftware.com/csharp/ocr/how-to/read-table-in-document/):構造化セルデータのための`Tables`プロパティをカバーしています。
- [OCR結果の読み取り](https://ironsoftware.com/csharp/ocr/how-to/read-results/):標準パイプライン用の単語データ。
- [画像品質補正](https://ironsoftware.com/csharp/ocr/how-to/image-quality-correction/):信頼度スコアを向上させる前処理フィルター。
- [OCRチュートリアル](https://ironsoftware.com/csharp/ocr/tutorials/how-to-read-text-from-an-image-in-csharp-net/):新規ユーザー向けのエンドツーエンドの設定手順。
[30日間トライアルを開始](#trial-license)するか、[ライセンスオプションをご覧ください](#licensing)。
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}");
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}");
Dim result = New IronTesseract().ReadDocumentAdvanced(New OcrInput("scan.png"))For Each word In result.WordsConsole.WriteLine($"{word.Text} @ ({word.X},{word.Y}) conf:{word.RegionConfidence:P0}")Next
Dim result = New IronTesseract().ReadDocumentAdvanced(New OcrInput("scan.png"))
For Each word In result.Words
Console.WriteLine($"{word.Text} @ ({word.X},{word.Y}) conf:{word.RegionConfidence:P0}")
Next
using IronOcr;using System;using System.Linq;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.RegionConfidence:P1}" );}// ToString() override for diagnostic loggingConsole.WriteLine(result.Words.First().ToString());
using IronOcr;
using System;
using System.Linq;
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.RegionConfidence:P1}"
);
}
// ToString() override for diagnostic logging
Console.WriteLine(result.Words.First().ToString());
ImportsIronOcrImportsSystemImportsSystem.LinqDim ocr = New IronTesseract()Using input = New OcrInput() input.LoadImage("receipt.png") Dim result = ocr.ReadDocumentAdvanced(input) For Each word In result.WordsConsole.WriteLine( $"Page {word.PageNumber} | " + $"'{word.Text}' | " + $"Position: ({word.X}, {word.Y}) | " + $"Size: {word.Width}x{word.Height} | " + $"Confidence: {word.RegionConfidence:P1}" ) Next ' ToString() override for diagnostic loggingConsole.WriteLine(result.Words.First().ToString())EndUsing
Imports IronOcr
Imports System
Imports System.Linq
Dim ocr = New IronTesseract()
Using input = 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.RegionConfidence:P1}"
)
Next
' ToString() override for diagnostic logging
Console.WriteLine(result.Words.First().ToString())
End Using
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();
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();
ImportsIronOcrImportsSystem.LinqDim ocr As New IronTesseract()Using input As New OcrInput() input.LoadImage("multi-column-doc.png") Dim result = ocr.ReadDocumentAdvanced(input) Dim targetPage AsInteger = 1 Dim lineThreshold AsInteger = 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 pageWordsConsole.Write($"{word.Text} ") NextConsole.WriteLine()EndUsing
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
using IronOcr;using System;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 reviewforeach (var word in lowConfidenceWords){Console.WriteLine( $" LOW CONF: '{word.Text}' at ({word.X},{word.Y}) — {word.RegionConfidence:P1}" );}
using IronOcr;
using System;
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}"
);
}
ImportsIronOcrImportsSystemImportsSystem.LinqDim ocr = New IronTesseract()Using input = New OcrInput() input.LoadImage("noisy-scan.png") Dim result = ocr.ReadDocumentAdvanced(input) Dim threshold AsDouble = 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 lowConfidenceWordsConsole.WriteLine($" LOW CONF: '{word.Text}' at ({word.X},{word.Y}) — {word.RegionConfidence:P1}") NextEndUsing
Imports IronOcr
Imports System
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.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
using IronOcr;using System;using System.Linq;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 outputConsole.WriteLine(result.Characters.First().ToString());
using IronOcr;
using System;
using System.Linq;
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());
ImportsIronOcrImportsSystemImportsSystem.LinqDim ocr = New IronTesseract()Using input = New OcrInput() input.LoadImage("form-field.png") Dim result = ocr.ReadDocumentAdvanced(input) For Each ch In result.CharactersConsole.WriteLine($"'{ch.Text}' | Box: ({ch.X}, {ch.Y}, {ch.Width}, {ch.Height}) | Page {ch.PageNumber}") Next ' ToString() override provides diagnostic-friendly outputConsole.WriteLine(result.Characters.First().ToString())EndUsing
Imports IronOcr
Imports System
Imports System.Linq
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
using IronOcr;using IronSoftware.Drawing;using System;using System.Linq;var ocr = new IronTesseract();using var input = new OcrInput();input.LoadImage("invoice.png");var result = ocr.ReadDocumentAdvanced(input);// Load the original image for croppingvar originalImage = AnyBitmap.FromFile("invoice.png");// Find a specific word and crop its regionvar 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})" );}
using IronOcr;
using IronSoftware.Drawing;
using System;
using System.Linq;
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})"
);
}
ImportsIronOcrImportsIronSoftware.DrawingImportsSystemImportsSystem.LinqDim ocr = 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 AsRectangle = targetWord.BoundingBox Dim croppedRegion AsAnyBitmap = originalImage.Clone(cropRect) croppedRegion.SaveAs("total-region.png")Console.WriteLine($"Cropped '{targetWord.Text}' from " & $"({cropRect.X}, {cropRect.Y}, {cropRect.Width}, {cropRect.Height})") End IfEndUsing
Imports IronOcr
Imports IronSoftware.Drawing
Imports System
Imports System.Linq
Dim ocr = 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
How can OCR results be used for custom font training or machine learning?
OCR results, including cropped image regions and labeled datasets derived from bounding boxes, can be used to train custom fonts or feed machine learning pipelines. IronOCR facilitates these processes with its detailed spatial data extraction capabilities.