【ITニュース解説】I tried 13 OCR preprocessing tricks on screenshots. None helped
2026年10月10日に「Dev.to」が公開したITニュース「I tried 13 OCR preprocessing tricks on screenshots. None helped」について初心者にもわかりやすく解説しています。
ITニュース概要
OCRでスクリーンショットの文字を認識する際、グレースケール化や二値化などの画像前処理は、きれいな画像では認識精度を上げず、むしろ悪化させる場合が多いことが実験で分かった。加工せずそのまま使うのが最良だ。垂直テキストは事前に回転させると認識精度が向上する。
ITニュース解説
OCR(光学文字認識)の精度を高めるために、画像を事前に加工する「前処理」が一般的に推奨されているが、この実験ではスクリーンショット画像に対する13種類の前処理手法を試し、それらが実際にOCRの精度向上に役立つのかを検証した。結論として、ほとんどの前処理は精度を向上させず、むしろ多くの場合でOCRの性能を大きく低下させることが明らかになった。
実験では、意図的にシンプルなウェブページを作成し、その一部をスクリーンショットとして取得した。具体的には、通常の本文テキスト、サイドバーテキスト、フッターの薄いグレーテキスト、料金表のテキストなど、異なるフォントサイズや色の組み合わせを含む10種類の画像をサンプルとして使用した。さらに、白文字に赤い背景といった特殊な条件の画像も加えている。これらの画像に対して、あらかじめ正しいテキスト(正解データ)を用意し、OCRエンジンによる認識結果と比較することで、どれだけ正確に文字を読み取れたかを評価した。
OCRエンジンにはImgIngのProfessional、Fast、Ultimateの各ティアに加え、オープンソースのtesseract.js 5を使用した。評価指標は文字エラー率(Character Error Rate - CER)で、これは認識されたテキストと正解テキストの編集距離(文字の追加、削除、置換の回数)を正解テキストの長さで割った値であり、この値が小さいほどOCRの精度が高いことを意味する。
実験の結果、何もしない「元の画像」が最も優れたOCR精度を示した。ImgIngのProfessionalティアでは、元の画像のエラー率はわずか0.1%だった。これに匹敵する、あるいはほぼ同等の結果を出したのは、グレースケール化(エラー率0.1%)と、ImgIngに組み込まれている「スキャン補正」機能(エラー率0.2%)のみだった。スキャン補正は、グレースケール化、コントラスト調整、シャープ化を行うが、画像を強制的に白黒に二値化する処理は行わないため、比較的良い結果が得られたと考えられる。
一方で、多くの前処理手法は、元の画像よりもエラー率を増加させた。例えば、画像を2倍に拡大するアップスケール処理は0.6%のエラー率に、JPEG形式で再保存(品質60または30)はそれぞれ0.8%と1.1%のエラー率になった。画像を白黒の2値に変換する「二値化」処理は、特に深刻な影響を及ぼした。Otsu(大津)の方法による二値化では1.1%のエラー率、固定されたしきい値での二値化では、しきい値200で1.2%、しきい値160で9.4%、しきい値128で25.8%、しきい値100で32.2%と、しきい値が低くなるほどエラー率が急激に悪化した。また、適応的しきい値処理でも1.4%、画像を滑らかにするためのノイズ除去フィルターである非局所平均ノイズ除去では2.7%のエラー率が記録された。さらに、画像をぼかしてノイズを減らす目的で使われる3x3メディアンフィルターは、9.7%という高いエラー率を引き起こした。
特に二値化処理の失敗は顕著だった。たとえば、しきい値128で二値化した場合、フッター部分の薄いグレーのテキスト(最も暗いピクセルの明るさが153)は、しきい値128よりも明るいため、すべて背景色と判断されて白く消えてしまった。結果として、OCRエンジンはそこから文字を全く認識できず、エラー率を大きく押し上げる要因となった。メディアンフィルターもまた、12ピクセル程度の小さな文字に対して適用すると、文字の線が周囲のピクセルと混ざり合い、文字が塊のように変形してしまうことで、エラー率が大きく跳ね上がった。
OCRエンジンのティア(性能段階)の違いについても検証されたが、元の画像に対するFast、Professional、Ultimateの各ティアのエラー率は0.8%、0.1%、0.7%と、その差は非常に小さかった。このことから、OCRエンジンの性能差よりも、不適切な前処理を選択することの方が、OCRの精度に与える悪影響がはるかに大きいことが示唆された。例えば、しきい値128による二値化は、すべてのティアのエラー率を約25ポイントも悪化させた。オープンソースのtesseract.jsでも同様で、元の画像のエラー率が6.2%だったのに対し、最良の前処理である2倍拡大でも5.8%と、明確な改善は見られなかった。
さらに、縦書きテキストの認識については、特別な問題が発見された。実験で用意された4列の縦書きサンプルに対し、ImgIngのすべてのティアは92.3%という非常に高いエラー率を記録した。これは文字自体の認識ミスではなく、OCRエンジンが横書きのように左から右へ読み取ろうとしたため、本来右から左へ読むべき縦書きテキストの順序が間違って認識されたことが原因だった。二値化やノイズ除去、拡大といった前処理ではこの問題は解決せず、エラー率は89.7%から94.9%の範囲にとどまった。この問題は、画像をOCRにかける前に「左に90度回転させる」という簡単な操作によって解決された。回転後、高解像度のスクリーンショットではすべてのティアで0エラーを達成し、低解像度のスクリーンショットでもわずかな句読点の欠落があったものの、エラー率は5.1%に大幅に改善した。
この実験は「クリーンなスクリーンショット」に限定されたものであり、スマートフォンの写真など、より複雑なノイズを含む実際の画像では結果が異なる可能性もある。しかし、この結果から得られた教訓は非常に実用的である。OCRを利用する際は、まず何も前処理をしない元の画像で試してみて、その結果を基準とすることが重要である。もし二値化などの前処理が必要だと考える場合は、テキスト内の最も暗いグレーの色を測定して適切な閾値を設定し、前処理後の結果が基準よりも改善されているかを必ず確認するべきだ。また、縦書きテキストを扱う場合は、他のどのような処理を行うよりも先に、画像を正しい向きに回転させることが必須である。