画像処理OCRアルゴリズムをExcelで考察してみた話|0〜255グレースケールとベクトル比較で学ぶ

電気・制御
電気・制御
記事内に広告が含まれています。
この記事でわかること
  • OCR(光学文字認識)がざっくりどういう考え方で動いていそうか
  • メーカが絶対に開示してくれない「相関値」「マッチング率」のイメージ
  • Excelで0〜255グレースケールを使って、簡易OCR的なアルゴリズムを再現する方法
  • 現場で「なんでこの相関値になるの?」と聞かれたときに、説明のタネになる考え方

“頭の中のモヤモヤを形にしてみたメモ” という感覚で読んでもらえればうれしいです。

  1. はじめに
  2. なぜOCRのアルゴリズムは教えてもらえないのか
  3. そもそも何が疑問だったのか:相関値って何者?
  4. 今回作ったExcel簡易OCRのコンセプト
  5. Excelでの具体的な手順
    1. ①Excelで0〜255を色として表示する設定
    2. ②文字「A」をセル塗りつぶしで描く
    3. ③画像を16ブロック(4×4)に分割する
  6. ベクトル差分で「それっぽい相関値」を出してみる
    1. ①ベクトルの準備
    2. ②差分ベクトルと距離
    3. ③相関値っぽいスコアに変換し比較!
  7. 実際のOCRアルゴリズムとの違いと限界
  8. それでもこのExcel実験が役に立つ場面
  9. OCRの種類と、今回のExcel実験の“立ち位置”
    1. OCRのざっくり3カテゴリ
    2. ① テンプレートマッチング型OCR
    3. ② ルールベース/特徴量ベース型
    4. ③ 機械学習・ディープラーニング型OCR
    5. 今回のExcel実験はどこに位置するのか?
  10. よくある質問(FAQ)──Excelモデルと実機OCRの付き合い方
    1. Q1. Excelの簡易モデルでも、現場検討に使えますか?
    2. Q2. 相関値は何%以上ならOKと決めればいいですか?
    3. Q3. メーカがアルゴリズムを開示してくれないのに、どうやって改善すればいい?
    4. Q4. テンプレマッチング型とディープラーニング型って、何が一番違う?
    5. Q5. 自前でOCRを作ったほうがいい場面ってありますか?
  11. まとめ:ブラックボックスを100%開けなくても、イメージは持てる

はじめに

こんにちは、末端技術者ニコラです。

今日は、画像処理でいつもモヤモヤしているのに、
メーカは絶対に教えてくれないテーマ…

「OCR(光学文字認識)のアルゴリズムってどうなってるの?」

について、Excelを使って自分なりに考えてみた話を書いていきます。

なぜOCRのアルゴリズムは教えてもらえないのか

画像処理をやっていると、こんな質問がよく飛んできます。

  • 「この正解画像に対して、なんで相関値が82%なんですか?」
  • 「この2枚、見た目ほぼ同じなのに、なんでこっちはマッチング率が下がるんですか?」

正直なところ、
現場で聞かれても、ほとんどの人はちゃんと説明できないと思います。

理由はシンプルで、

  • OCRのアルゴリズムは各社のノウハウの塊
  • つまり、ビジネス的な生命線そのもの

だからです。

過去、自分もメーカーさんに対して何度もこう聞きました。

  • 「この値の計算式、開示してもらえませんか?」
  • 「変動要因だけでもいいので教えてもらえませんか?」

でも、返ってくる答えはだいたいこんな感じ。

  • 「社外秘なのでお伝えできません」
  • 「内部アルゴリズムの詳細は非公開です」

頭では分かってるんですが、報告会とかがあると
やっぱり「なんとか説明のタネが欲しい」と思っちゃうんですよね。

そもそも何が疑問だったのか:相関値って何者?

OCRに限らず、画像処理ではよく

  • マッチング率
  • 相関値
  • 類似度

みたいな数字が出てきます。

ここでの素朴な疑問はこれです。

  • 「正解画像と見本画像を比べてるのは分かる」
  • 「でも、その“数字の出方”がイメージしづらい」

報告会では、知らない人からこんな質問が飛びます。

  • 「90%と80%の差って、画像的に何が違うの?」
  • 「なんでこのパターンだけ60%台なんですか?」

本音を言うと、

  • 「いや、そこまでメーカーは教えてくれないんですよ…」

で終わらせたいところですが、
説明責任がある立場だとそれでは済まないんですよね。

そこで、

「だったら、自分で“それっぽいアルゴリズム”をExcelで作ってみよう」

と思ったのが今回のネタです。

今回作ったExcel簡易OCRのコンセプト

やったことをざっくり書くと、こうです。

  1. Excelで 0〜255 の数値をセルに入れ、それを色として表示
  2. 1セル=1画素として、文字「A」の画像を作る
  3. その画像を 4×4 の 16ブロックに分割
  4. 各ブロックの「明るさの合計(または平均)」を計算
  5. その16個の値を「1本のベクトル」と見なす
  6. 正解パターンと入力パターンのベクトル差分から「相関値っぽいもの」を計算

イメージとしては、

  • 正解画像:ベクトル V
  • 検査画像:ベクトル W
  • V と W が近い(=0)ほど「相関が高い」
  • V と W が離れていると「相関が低い」

という感じです。

Excelでの具体的な手順

ここは、実際にブログに図を入れると映えるところです。
ユーザーさんが画像作る前提で、「ここに図を入れると良さげ」というコメントも付けておきます。

①Excelで0〜255を色として表示する設定

やりたいことは、

  • セルに 0〜255 の値を入れる
  • 条件付き書式などで、
    値に応じてグレーの濃淡に変える(0=黒、255=白)

これで「簡易グレースケール画像」ができます。


②文字「A」をセル塗りつぶしで描く

次に、Excel上でドット絵を描く感覚で文字「A」を作ります。

  • たとえば 20×20 マスを用意
  • 文字の輪郭部分を 0(黒)に近い値
  • 背景部分を 255(白)に近い値

にして、「A」の形をセルの塗りつぶしで作るイメージです。

  • 「Excelで描いたグレースケールの“A”」

③画像を16ブロック(4×4)に分割する

作った「A」画像を、4×4の16ブロックに分けます。

  • 全体:16×16セルとした場合
  • 1ブロック:4×4セル
  • それが 4×4 並んで、合計16ブロック

各ブロックごとに、

  • 明るさの合計 or 平均
    を計算して、1エリア = 1つの数値に縮約します。

結果的に、

  • エリア1:S1
  • エリア2:S2
  • エリア16:S16

という 16次元の数値セットができます。

これが、その画像を表現する特徴ベクトル になります。


ベクトル差分で「それっぽい相関値」を出してみる

次に、この特徴ベクトルを使って
「正解画像」と「入力画像」の類似度を計算していきます。

①ベクトルの準備

  • 登録画像のベクトル:V = (V1, V2, …, V16)
  • 撮像画像のベクトル:W = (W1, W2, …, W16)

例えば、

  • V:きれいなフォントの「A」 ※下記画像の左
  • W:少し太った「A」、傾いた「A」など ※下記画像の真ん中

を用意して、どのくらい値が変わるかを見ます。


②差分ベクトルと距離

まずは素朴な差分を考えます。

  • 差分ベクトル D = V − W = (V1−W1, V2−W2, …, V16−W16)

この差分が小さいほど、画像として似ていると考えられます。

距離としては、例えば

  • 絶対値の合計:Σ |Vi − Wi|
  • 二乗和:Σ (Vi − Wi)²

などを使うことができます。

ここから、

  • 距離が 0 に近い → そっくり
  • 距離が大きい → 似ていない

と解釈します。

③相関値っぽいスコアに変換し比較!

距離だけだと「小さいほど良い」なので、
人間が見慣れている「0〜1の相関値っぽいもの」に変換してみます。

イメージとしては、

  • 距離 = 0 のとき → 相関値 = 1.0
  • 距離 = 大きいほど → 相関値 → 0に近づく

みたいな単調減少の関数を用意すればOKです。

今回は、「すべて0の画像」と「255の画像」を用意し、その差分を最大=相関値0と仮定しました。


そして実際に比較してみた。

比較① : 似ているAを作って相関値を出す

95% ・・・まぁ比較するものが少ないのでこのくらいの数値かなという印象。

比較② : 崩れた「A」と比較

83% ・・・この場合は閾値95%くらいにしておかないとまずいね という印象。

実際のOCRアルゴリズムとの違いと限界

もちろん、ここまでやっておいてなんですが…

実際のOCRはこんな単純なものではありません。

現実のOCRは、

  • 前処理(ノイズ除去、二値化、正規化、回転補正)
  • 特徴量抽出(エッジ、局所特徴、ヒストグラムなど)
  • 機械学習

といった、いろんな処理が組み合わさっています。

今回のExcel実験は、

  • グレースケールの合計値をブロックごとにまとめた
  • 16次元のベクトルで「それっぽい距離」を計算した

だけなので、かなりラフなモデルです。

具体的な限界としては、

  • 少し文字が傾くと途端に値が変わる
  • フォント差・線の太さに弱い
  • ノイズや汚れをうまく扱えない
  • 文字位置がずれるとブロック分けの意味が崩れる

などなど。

「現場にそのまま導入しろ」と言われたら、
普通に無理です。笑

それでもこのExcel実験が役に立つ場面

じゃあ、「こんなラフなモデル、やる意味あるの?」というと、
個人的にはかなり意味あると思っています。

理由は:

  1. 報告会での説明がしやすくなる
    • 「内部アルゴリズムは開示されていませんが、ざっくりいうとこんなイメージです」
    • 「ブロックごとに明るさを数値化して、そのベクトルの違いを見ていると思ってください」
      という例え話に使える
  2. 自分の頭の中が整理される
    • 「相関値」とか「マッチング率」という言葉が
      「ベクトルの距離」「特徴量の差分」みたいなイメージで語れるようになる
  3. 現場でのチューニング方針が立てやすくなる
    • 「ここを変えると、相関値が下がる理由」が感覚的に理解できると
      • しきい値
      • 照明条件
      • 画素分解能
        の設計がしやすくなる

OCRの種類と、今回のExcel実験の“立ち位置”

ここまで「Excelで自作したなんちゃってOCR」の話をしてきましたが、
そもそも世の中のOCRって、どんな種類があるのか?
その中で今回やっていることはどこに位置するのか?を、ざっくり整理しておきます。

「アルゴリズムは企業秘密です」とメーカに言われても、
ざっくりとした“地図”を頭に持っておくだけで、
報告会での説明のしやすさがだいぶ変わります。


OCRのざっくり3カテゴリ

世の中のOCR(光学的文字認識)は、ざっくり分けると次の3種類に分類できます。

  1. テンプレートマッチング型
  2. ルールベース/特徴量ベース型
  3. 機械学習・ディープラーニング型

もちろん、実際の製品はこれらを組み合わせていることが多いですが、
頭の中ではこの3つに整理しておくとスッキリします。


① テンプレートマッチング型OCR

今回、Excelでやっているのがほぼこれです。

考え方は超シンプルで、

「正解画像(テンプレート)と、今の画像がどれくらい似ているかを数値化する」

というものです。

  • 入力画像を決まったサイズに切り出す
  • グレースケールや2値画像にする
  • テンプレート画像と、画素ごとに差を取る
  • その差の“小ささ”をスコア(相関値)にする

今回の記事では、

  • 画素をそのまま比べるのではなく、
    16ブロックに分けて「ブロックごとの濃さ」をベクトルにする
  • そのベクトル同士の差(距離)を、
    「どれくらい似ているか?=相関値っぽいもの」に変換する

という形で、テンプレートマッチングの一番原始的なイメージをExcel化しています。

この方式のメリット・デメリットはざっくりこんな感じです。

  • メリット
  • 実装が簡単
  • 計算コストも少なく、組み込みやPCでサクサク動く
  • フォント・位置・明るさがある程度固定なら、十分実用になる
  • デメリット
  • 位置ズレ・回転・拡大縮小に弱い
  • フォントや太さが変わると一気に相関値が落ちる
  • ノイズ・ムラにも影響を受けやすい

工場の決まった印字・固定フォント・固定位置を読むような用途では、
今でもこの系統の手法がベースになっていることが多いです。


② ルールベース/特徴量ベース型

テンプレートマッチングより一歩進んだのがこちら。

発想としては、

「画像1枚1枚の画素全部を見るのはしんどいから、
文字の特徴だけをうまく抜き出して、それを比べよう」

というやり方です。

例えば:

  • 線の本数や向き
  • 交点の数
  • 外形(輪郭)の形状
  • 重心位置や縦横比
  • 端点・角の数 …など

を抽出して、「Aっぽい特徴」「Bっぽい特徴」を判断する、
ルールベース or 特徴量ベースのOCRです。

  • メリット
  • テンプレートマッチングよりも、多少のズレや太さの違いに強くできる
  • 画素数そのものを扱わないので、比較的軽い
  • デメリット
  • 特徴量設計&ルール設計が大変(職人芸になりがち)
  • 異なるフォントや手書き文字への対応は難しい

Excelの実験はここまではやっていませんが、
「ブロックごとの濃度で文字の形をざっくり表現している」
という意味では、**“超簡略版の特徴量ベース”とも言えます。


③ 機械学習・ディープラーニング型OCR

最近のクラウドOCRや、手書き文字も読める高性能なやつは、だいたいこれです。

  • 大量の文字画像(学習データ)を用意する
  • CNN(畳み込みニューラルネットワーク)などのモデルに食わせて学習
  • 「A」「B」「C」…に分類する識別器として使う

という流れで、“人が特徴量やルールを設計する”のではなく、

「特徴の抽出も、判定ルールも、全部モデルに学習させる」

という思想です。

  • メリット
  • フォント違い・手書き・ノイズ・傾きなどに強い
  • 追加の学習で、まだ見たことのないパターンにも対応しやすい
  • デメリット
  • 学習に大量のデータ・計算資源が必要
  • モデルの中身は基本ブラックボックスになりやすい
  • 「なぜこの相関値になったのか」を説明しづらい

現場からすると、

「なんかよく分からんけど、よく読める黒箱(ブラックボックス)」

という立ち位置になりがちです。


今回のExcel実験はどこに位置するのか?

整理すると、今回の記事でやっていることは、

  • OCR全体の中の
    テンプレートマッチング型
  • その中でも
    → 「ブロックごとの濃度ベクトルを使った、超シンプルな類似度計算」

をExcelで可視化してみた、という位置づけです。

つまり、

「メーカが見せてくれない“相関値計算のイメージ”を、
自分でおもちゃモデルとして再現してみたもの」

だと思ってもらえればOKです。

実機のOCRはここに、

  • 位置補正
  • 傾き補正
  • 二値化・ノイズ除去
  • 特徴量設計
  • 学習・統計的処理

などなど、いろんな“おまじない”を盛り込んでいるイメージです。

全部を自作するのは現実的ではありませんが、
このExcelモデルを通じて、

  • 「相関値って、本質的にはこういう“似てる度”なんだよね」
  • 「だからズレるとスコア落ちるし、ノイズが乗ると悪化する」

という感覚を持っておくだけでも、
メーカとの会話や報告会での説明がかなり楽になります。


よくある質問(FAQ)──Excelモデルと実機OCRの付き合い方

最後に、現場でよく聞かれそうな質問をいくつかピックアップして、
Q&A形式でまとめておきます。


Q1. Excelの簡易モデルでも、現場検討に使えますか?

A. 「実運用に直接使う」のは無理ですが、 “考え方を共有するツール”としてはかなり使えます。

例えば:

  • 報告会で「相関値って何ですか?」と聞かれたとき
  • 「なぜこの画像は80%で、こっちは60%なんですか?」と説明を求められたとき

に、

「こうやってブロックごとに濃さをベクトルにして、差を取ってるイメージです」

とExcel画面を見せながら説明すると、
非エンジニア層にもかなり伝わりやすくなります。

また、

  • 明るさを少し変えてみたとき
  • 文字の太さを少し変えてみたとき
  • 1ブロック分ずらしてみたとき

に、Excel上で相関値がどう変わるかを見ることで、

「アルゴリズムというより、入力側(照明・位置決め)を安定させるのがどれだけ大事か」

を、チーム内で共有する材料にもなります。


Q2. 相関値は何%以上ならOKと決めればいいですか?

**A. 「一律で〇%」という正解はありません。
**現場ごとの許容ミス率と、実データの分布から決める必要があります。

ざっくり手順にするとこんな感じです。

  1. 正解サンプルをそこそこの枚数集める(実ワーク)
  2. そのサンプルで相関値の分布を取る(最低・平均・標準偏差など)
  3. NGサンプルもいくつか用意して、相関値の分布を見る
  4. 「誤読をどこまで許容するか」を現場と相談しつつ、
  • 正解のうち◯%以上は通したい
  • NGは限りなくゼロに近づけたい
    というバランスでしきい値を決める

Excelモデルで遊ぶときも、

  • 正常パターンの相関値がだいたいどの範囲に集まるか
  • わざと崩したパターンがどこまで落ちるか

を確認しておくと、
「80%以上ならOK」といった“なんとなく”ではない説明ができるようになります。


Q3. メーカがアルゴリズムを開示してくれないのに、どうやって改善すればいい?

**A. 「中身を理解して何とかする」のではなく、
**入力(画像)と設定(しきい値・学習)で勝負するのが現実的です。

メーカがアルゴリズムを開示しないのは、

  • 特許・ノウハウの塊だから
  • そこを開示するとビジネスにならないから
  • 悪用されたり、無茶な改造をされると保証しきれないから

という事情があります。

ユーザー側でやるべきことは、むしろ

  • 照明条件を安定させる
  • カメラ・レンズ・距離・トリガを安定させる
  • ワーク位置・姿勢のバラつきを減らす
  • 正しいサンプルで“学習”や“ティーチング”をやり直す
  • しきい値・相関値の閾値を現場とすり合わせる

といった入力側とパラメータ側のチューニングです。

今回のExcelモデルのように、

「似てる度を数値にしているだけなんだよね」

という理解を持っていると、

  • メーカ:「もう少し学習枚数を増やしてください」
  • メーカ:「このしきい値を少し下げてみてください」

と言われたときも、

「あぁ、あのベクトルの分布を増やして、境界を動かしてるイメージね」

と腹落ちした状態で対応できるので、ムダにイライラしなくて済みます。


Q4. テンプレマッチング型とディープラーニング型って、何が一番違う?

A. 一言でいうと、 テンプレマッチングは“ルールが見える”、 ディープラーニングは“ルールを学習させる黒箱”です。

  • テンプレートマッチング
  • テンプレ画像と画素ごとの差や相関を直接見て判断
  • 挙動がイメージしやすい(今回のExcelモデルのように)
  • フォント・位置・傾きが安定しているときに強い
  • ディープラーニング
  • 大量のデータから「良い特徴量」と「判定ルール」をモデルが自動で作る
  • 手書き・フォント違い・ノイズなどへの耐性が高い
  • ただし「なぜこの結果なのか」を人間が説明しにくい

現場目線だと、

  • テンプレマッチング:
  • 条件をきちんとコントロールできるラインで“きっちり詰める”用途向け
  • ディープラーニング:
  • 現実的に条件を揃えきれない、印字や手書きがバラバラな現場向け

くらいにイメージしておくと、
「どっちを採用すべきか」を議論するときの整理がしやすくなります。


Q5. 自前でOCRを作ったほうがいい場面ってありますか?

A. よほど用途が限定されているか、研究目的でなければ、 基本は「メーカ製を使い倒す一択」でいいと思います。

Excelモデルで遊んでみると分かりますが、

  • 位置ズレや傾き
  • フォント差・印字ムラ
  • 照明条件の変化
  • 汚れ・かすれ

などを全部自前のアルゴリズムでカバーしようとすると、 あっという間に泥沼になります。

  • テストケースの作成
  • 誤読時の保証
  • バージョン管理
  • 不具合対応

まで含めて考えると、

「画像処理まるごと自社開発」のメリットは、実はほとんどない

というのが正直なところです。

今回のExcelモデルは、

  • メーカに頼り切りではなく、「原理のイメージは自分の頭に持っておく」
  • 報告会や仕様検討のときに、自分の言葉で説明できるようにする

ための“理解装置”として使う、
くらいの距離感が一番おいしいと思っています。


こういった全体マップとFAQを頭の片隅に置きつつ、
Excelモデルで遊んでみると、

「メーカはアルゴリズム教えてくれないけど、
なんとなく中でやっていることはイメージできている」

という、“ちょうどいい理解レベル”に持っていけるはずです。

まとめ:ブラックボックスを100%開けなくても、イメージは持てる

最後に、今回のポイントをざっくりまとめます。

  • OCRのアルゴリズムは各社の生命線なので、基本的には開示されない
  • でも、現場では「なんでこの相関値になるの?」という質問が必ず飛んでくる
  • そこでExcelで
    • 0〜255のグレースケール画像を作り
    • 文字「A」をセルで描き
    • 16ブロックに分けて合計値を取り
    • ベクトル差分から“それっぽい”相関値を作ってみた
  • 実際のOCRとは全然違うけれど、
    • 「ベクトルで似ているかどうかを見ている」
      というイメージを掴むにはちょうどいい
  • ブラックボックスを完全に開けることはできないけど、
    概念レベルで説明できるだけでも現場での説得力はかなり変わる

もしこの記事を読んで

  • 「自社のフォントパターンでもやってみようかな」
  • 「ノイズをわざと足して相関値の変化を見てみようかな」

と思ってもらえたら、このExcel遊びは成功かなと思います。

この記事へのコメント