読者です 読者をやめる 読者になる 読者になる

てけとーぶろぐ。

ソフトウェアの開発と、お絵かきと、雑記と。

デジタル数字専用OCR

てけとーぶろぐ。 | デジタル数字専用OCRについてご質問をいただいたので、デジタル数字の写った画像から数字を読み取る、デジタル数字専用OCRアルゴリズムを記します。そんな大げさなものではないですがー。

 

元の画像です。

f:id:kurimayoshida:20140510221600p:plain

適当な閾値で2値化します。

f:id:kurimayoshida:20140510221608p:plain

行を走査して行ごとの白いピクセルをカウントします。

f:id:kurimayoshida:20140510221618p:plain

行ごとの白いピクセルの数をグラフにすると緑の線のような感じになります。

グラフで一定以上の値となっている範囲からデジタル数字の縦方向の位置と高さが分かります。(赤い領域)

なお、先に横方向ではなく縦方向の位置と高さを調べるのはデジタル数字は0から9までいずれも縦線を含むためです。

f:id:kurimayoshida:20140510221628p:plain

赤い領域について、列ごとの白いピクセルをカウントします。

f:id:kurimayoshida:20140510221639p:plain

列ごとの白いピクセルの数をグラフにすると緑の線のような感じになります。

グラフで一定以上の値となっている範囲を抽出します。(青い領域)

f:id:kurimayoshida:20140510221656p:plain

青い領域AとBそれぞれが1つずつデジタル数字を含んでいます。それぞれが何の数字かを調べます。

ここで、デジタル数字0の幅(1以外は同じ幅)はおおよそ赤い領域の高さの半分と想定します。

Aの幅は想定したデジタル数字0の幅より大幅に狭いので「1」だと分かります。

Bの幅は想定したデジタル数字0の幅とほぼ同じなのでさらに何であるかを調べます。

f:id:kurimayoshida:20140510221703p:plain

Bの領域を図のように分割して考えます。

各赤い領域内に一定以上白いピクセルがあれば、そこにはデジタル数字を構成する棒があると判定します。そしてどこに棒があるか、から何の数字であるかを判定します。

f:id:kurimayoshida:20140510221713p:plain

以上です。不明点があればご遠慮なくどうぞ。もっといい方法があれば是非教えてくださいー。

 

説明よりもプログラムを再度書いたほうが早かったかも…。