1

さまざまな照明条件で C# のテキストを抽出するアプリケーションを開発しています。

私の問題は、次のように、画像にさまざまな明るさのレベルがある場合があることです。

http://i.imgur.com/NJ2XTrn.png?1

そのため、画像全体に対して事前に計算されたしきい値を使用することはできません。そうしないと、いくつかの文字が失われます。

画像に適切なしきい値/二値化を適用できるアルゴリズム/スニペット/関数などを検索しています。

私はこのBradleyLocalThresholdingを AForge で作成しました。これは他の非適応型の方法よりも優れていますが、いくつかの詳細が失われています。(たとえば、画像の G は O になります)

誰でも私にもっと良い方法を提案できますか?

4

3 に答える 3

2

画像の品質が非常に低いため、非常に困難ですが、次のように反復グローバルしきい値アプローチを試すことができます。

  1. 初期推定しきい値 T をランダムに選択します (通常は平均値として)。
  2. T を使用して信号をセグメント化すると、2 つのグループが生成されます。G1 は値 <=T のすべてのポイントで構成され、G2 は値>T のポイントで構成されます。
  3. G1 と T の点と G2 と T の点の間の平均距離を計算します。
  4. 新しいしきい値 T=(M1+M2)/2 を計算します。
  5. T の変化が十分に小さくなるまで、手順 2 ~ 4 を繰り返します。

トリックは、画像全体に適用するのではなく、画像を(たとえば)5x5のブロックに分割し、ブロックに個別に適用することです。これにより、次のようになります。

ここに画像の説明を入力

以下は、再現できると確信しているRでの実装です

getT = 関数(y){
  t = 平均 (y)

  mu1 = 平均 (y[y>=t])
  mu2 = 平均 (y[y 1){
      cmu1 = 平均(y[y>=t])
      cmu2 = mean(y[y 1 & cmu1 == mu1 & cmu2 == mu2){
      print(paste('done t=', t))
      リターン(t)
      壊す;
    }そうしないと{
      mu1 = cmu1
      mu2 = cmu2
      t = (ミュー1 + ミュー2)/2
      print(貼り付け('new t=', t))
    }
    i = i+1
  }
}


r = seq(1, nrow(画像), by=5)
c = seq(1, ncol(画像), by=5)
r[長さ(r)] = nrow(画像)
c[長さ(c)] = ncol(画像)
y = 画像
for(i in 2:length(r) ){
  for(j in 2:length(c) ){
    ブロック = 画像[r[i-1]:r[i]、c[j-1]:c[j]]
    t = getT(ブロック)
    y[r[i-1]:r[i], c[j-1]:c[j]] = (ブロック>t)+0
  }
}

ディスプレイ (y)
于 2013-05-02T23:47:27.490 に答える
2

はい、niblack を使用します (opencv には関数としてあります)。基本的には、局所平均を使用して変数の閾値を構築します。OCR に最適です。画像の解像度によっては、しきい値処理の前に 2 倍または 3 倍のバイキュービック アップサンプリングを行うこともできます。

于 2013-04-30T20:44:12.290 に答える