- ベストアンサー
画像の2値化について
グレー画像を微分ヒストグラムを用いて2値化する方法を教えてください。 プログラムが書ける程度の詳しさでアルゴリズムの説明をお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
・2値化関数(グレー画像と閾値を引数に与えると2値画像を返す) ・閾値決定関数(グレー画像を引数に与えるとヒストグラムの微分値の 極大値を返す) というのがあれば実現できるのでは? 2値化関数は簡単ですよね。グレー画像における画素(i,j)における 2値化作業は、輝度値の閾値Θに対して、Ib[j][i] = Ig[j][i] > Θ を実行すれば良いですよね。ただし、Ib[j][i]は2値画像の画素(i,j)の 値、Ig[j][i]はグレー画像の画素(i,j)の値。不等号演算子は真なら1、 偽なら0を返す。 さて、閾値決定関数ですが、まず、輝度値ごとのヒストグラムを 作ります。 int hist[256]; // グレー画像が256階調であるとする。 for(i = 0 ; i < x_size ; i++) for(j = 0 ; j < y_size ; j++) hist[Ig[j][i]]++; 次に、ヒストグラムを使って、微分ヒストグラムを作ります。 int dhist[256]; for(i = 0; i < 256 ; i++) dhist[i] = hist[i+1] - hist[i]; こんな感じです。後は微分ヒストグラムdhistを最大にする 輝度値を求めればOKです。 離散値の微分は他の方法もあります。例えば、 dhist[i] = (hist[i+1] - hist[i-1]) / 2.0f; なんかも。 あと、画像のサイズが十分に大きくないときには、 工夫(画素ヒストグラムが極端に低い・高い画素が 存在し得るので)が必要かも知れません。