Visual Basic 中学校 掲示板
投稿内容
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
>
投稿一覧
>
WPFで文字認識
タグの編集...
投稿者
はな
 (社会人)   投稿日時
2022/5/2 10:55:14
Visual Studio 2022 WPF でOCRのプログラムを作成しています。
Windows.Media.Ocr 使用
A4サイズの状態だとほぼ認識している箇所を
切り取って実行させると認識しません。
原因わかりませんか?
投稿者
魔界の仮面弁士
 (社会人)   投稿日時
2022/5/2 14:20:05
第三者が現象を確認できるよう、OCR に用いたプログラムコードと、
OCR に用いた A4 画像および、それを切り取ったものを提示することはできますか?
投稿者
(削除されました)
 ()   投稿日時
2022/5/2 15:01:57
(削除されました)
投稿者
はな
 (社会人)   投稿日時
2022/5/2 16:23:32
ネットで検索したものに手を加えたものになりますが、、、、
不都合があれば削除します。
画像が添付できなかったので、、、
例えばYahoo!のトップニュースのタブを切り取って画像とし、OCRすると解析できます。
その一文を切り取ると解析できません。
TxtPath.Textに画像のパスがあると思ってください。
private async void BtnOcr_Click(object sender, RoutedEventArgs e)
{
//OCRの実行処理
var sbitmap = await JpgToBitmap(TxtPath.Text);
TxtOcrResult.Text = (await RunOcr(sbitmap)).Text;
}
public static async Task<SoftwareBitmap> JpgToBitmap(string JpgPath)
{
SoftwareBitmap sbitmap = null;
var file = await Windows.Storage.StorageFile.GetFileFromPathAsync(JpgPath);
using (Windows.Storage.Streams.IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
Windows.Graphics.Imaging.BitmapDecoder decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(stream);
sbitmap = await decoder.GetSoftwareBitmapAsync();
}
return sbitmap;
}
private async Task<OcrResult> RunOcr(SoftwareBitmap sbitmap)
{
//OCRを実行する
OcrEngine engine = OcrEngine.TryCreateFromLanguage(new Windows.Globalization.Language("ja-JP"));
var result = await engine.RecognizeAsync(sbitmap);
return result;
}
投稿者
魔界の仮面弁士
 (社会人)   投稿日時
2022/5/7 17:47:54
> 画像が添付できなかったので、、、
いや…実際の画像を挙げてもらわないと、画像の 1 文字あたりの分解能を判断できないです。
Web にある既存の画像で、試せそうなものは無いでしょうか?
OCR 処理は通常、300~600dpi程度の解像度が要求されます。
OCR フォントの読み取りなら、96dpi 程度で読める場合もありますが、
日本語なら 400dpi 程度の画像を用意した方が良いでしょう。
>> A4サイズの状態だとほぼ認識している箇所を
元画像の縦横サイズはいくつですか?
A4 サイズは 210mm × 297mm ですから、画像解像度ごとに表にするとこんな感じになりますね。
72 dpi なら 595 × 842 ピクセル
96 dpi なら 794 × 1,123 ピクセル
120 dpi なら 992 × 1,403 ピクセル
300 dpi なら 2,480 × 3,508 ピクセル
600 dpi なら 4,961 × 7,016 ピクセル
ちなみに論理サイズとしては、「1インチ = 25.4mm = 72ポイント」と定められています。
JIS 規格では 1pt = 0.3514mm と定義されているそうですが、実際の
DTP ソフトは 1pt = 0.35278mm と扱うのが一般的です。(25.4÷72=0.352777777……)
通常の印刷物では 300~400dpi 程度の画像データが入稿されますし、
OCR もこの程度あった方が良いでしょうね。
(低解像度の印刷物では、200dpi 程度の画像データを使うこともありますが)
一方、画面表示では印刷物よりは画像のドットが荒くなりますので、もしも
画面キャプチャーした画像を OCR にかける場合は解像度の調整が必要になるかもしれません。
72 dpi … Mac (非Retina)
96 dpi … Windows (100%)
120 dpi … Windows (125%)
144 dpi … Windows (150%), Mac(Retina)
288 dpi … Windows (200%)
自分の PC だと、サブモニター(4K)が 150% 設定、主モニター(3K)が 175% 設定なので、
アプリをどのモニターに表示させているかによっても、画像サイズが変わってきたりします。
> 例えばYahoo!のトップニュースのタブを切り取って画像とし、OCRすると解析できます。
> TxtPath.Textに画像のパスがあると思ってください。
手元の環境でキャプチャして試してみたところ、ちゃんと日本語として解析されました。
(さすがに AI 系の OCR に比べると認識精度は劣りますが)
実験用に切り出した画像を、dpi を変えて 4 種類用意してみました。
画像サイズはいずれも 495×72ピクセルですが、png ファイルの dpi 設定は
それぞれ変更してあるため、Word に張り付けてみると、初期サイズがそれぞれ変化します。
(画像内の DPI 情報が Windows.Media.Ocr の精度に影響を与えるかどうかは未確認ですが)
https://www.vb-user.net/junk/replySamples/2022.05.07.16.03/Yahoo2_1200dpi.png
https://www.vb-user.net/junk/replySamples/2022.05.07.16.03/Yahoo2_600dpi.png
https://www.vb-user.net/junk/replySamples/2022.05.07.16.03/Yahoo2_300dpi.png
https://www.vb-user.net/junk/replySamples/2022.05.07.16.03/Yahoo2_96dpi.png
一応、Yahoo! サイト全体の画像も置いておきます。
https://www.vb-user.net/junk/replySamples/2022.05.07.16.03/Yahoo1_1200dpi.png
https://www.vb-user.net/junk/replySamples/2022.05.07.16.03/Yahoo1_600dpi.png
https://www.vb-user.net/junk/replySamples/2022.05.07.16.03/Yahoo1_300dpi.png
https://www.vb-user.net/junk/replySamples/2022.05.07.16.03/Yahoo1_96dpi.png
投稿者
魔界の仮面弁士
 (社会人)   投稿日時
2022/5/7 18:36:41
比較用に、100% 設定のモニター + 拡大率 100% の Chrome で撮影した
216 × 27 ピクセル (96dpi) の画像も置いておきます。
https://www.vb-user.net/junk/replySamples/2022.05.07.16.03/Yahoo3.png
この分解能の画像だと、先の OCR 処理では読み取れませんでした。
読み取り精度を上げる方法は分からないです。(グレイスケールにしても駄目でした)
比較のため、Microsoft OneNote に画像を貼って、画像を右クリックして
「画像からテキストをコピー」を行う方法も試してみましたが、
こちらも Yahoo3.png は読み取れませんでした。(Yahoo2_96dpi.png は成功)
https://ezocr.net/ の OCR では解析できたのですけれどね…。
(Google OCR をオフにした場合は、一部誤読されましたが)
> public static async Task<SoftwareBitmap> JpgToBitmap(string JpgPath)
実際に切り出した画像は JPEG 形式なのでしょうか?
投稿者
(削除されました)
 ()   投稿日時
2022/5/7 18:57:02
(削除されました)
投稿者
魔界の仮面弁士
 (社会人)   投稿日時
2022/5/7 18:57:42
訂正:
> 72 dpi … Mac (非Retina)
> 96 dpi … Windows (100%)
> 120 dpi … Windows (125%)
> 144 dpi … Windows (150%), Mac(Retina)
ここまでは良いとして。
> 288 dpi … Windows (200%)
これは 192 dpi の誤りです。失礼しました。
> Windows.Media.Ocr 使用
十分な結果が得られない場合は、そもそも性能限界ということで、
他の OCR エンジンも試してみた方が良いかも知れません。
https://nugetmusthaves.com/tag/ocr
https://qiita.com/nyagato_00/items/4a764260ec76e8504cf4
https://azure.microsoft.com/ja-jp/services/cognitive-services/computer-vision/#overview
https://docs.microsoft.com/ja-jp/azure/cognitive-services/computer-vision/overview-ocr
投稿者
はな
 (社会人)   投稿日時
2022/5/8 22:34:12
提示していただいた画像なら読めました。
やはり解像度でしょうか、、、試してみます。
ありがとうございました。