てけとーぶろぐ。 | デジタル数字専用OCRについてご質問をいただいたので、デジタル数字の写った画像から数字を読み取る、デジタル数字専用OCRのアルゴリズムを記します。そんな大げさなものではないですがー。
元の画像です。
適当な閾値で2値化します。
行を走査して行ごとの白いピクセルをカウントします。
行ごとの白いピクセルの数をグラフにすると緑の線のような感じになります。
グラフで一定以上の値となっている範囲からデジタル数字の縦方向の位置と高さが分かります。(赤い領域)
なお、先に横方向ではなく縦方向の位置と高さを調べるのはデジタル数字は0から9までいずれも縦線を含むためです。
赤い領域について、列ごとの白いピクセルをカウントします。
列ごとの白いピクセルの数をグラフにすると緑の線のような感じになります。
グラフで一定以上の値となっている範囲を抽出します。(青い領域)
青い領域AとBそれぞれが1つずつデジタル数字を含んでいます。それぞれが何の数字かを調べます。
ここで、デジタル数字0の幅(1以外は同じ幅)はおおよそ赤い領域の高さの半分と想定します。
Aの幅は想定したデジタル数字0の幅より大幅に狭いので「1」だと分かります。
Bの幅は想定したデジタル数字0の幅とほぼ同じなのでさらに何であるかを調べます。
Bの領域を図のように分割して考えます。
各赤い領域内に一定以上白いピクセルがあれば、そこにはデジタル数字を構成する棒があると判定します。そしてどこに棒があるか、から何の数字であるかを判定します。
以上です。不明点があればご遠慮なくどうぞ。もっといい方法があれば是非教えてくださいー。
説明よりもプログラムを再度書いたほうが早かったかも…。