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
提示していただいた画像なら読めました。
やはり解像度でしょうか、、、試してみます。

ありがとうございました。