今更ですが,画像のヒストグラムを出力できるようにしておきます.グレースケールにおいて濃度の階調は0から255までであらわされますので, 256個の要素を持つ配列を使うことで簡単にそれぞれの濃度をカウントすることができます.そして結果を横幅256ピクセル,縦幅256ピクセルの画像として出力したいと思います.
ヒストグラムを作成するとその画像においてどういう濃度が多いのかということを視覚的に知ることができます.例えば濃度が偏っていれば,分布を均等にすることで補正をしようということがわかります.
for(i=0; i<256; i++){ hist[i] = 0; } for(i=0; i<img->width*img->height; i++){ hist[img->data[i].r]++; }
まず256個の要素を持つ配列histを0で初期化します.ピクセル値が取る値は0から255までしか無いので,例えば0の値の個数はhist[0]というようにピクセル値をインデックスにしてインクリメントすることで,カウントしています.
for(i=0; i<256; i++){ for(j=0; j<(int)(256*hist[i]/(double)max); j++){ temp->data[(256-j)*256 + i].r = temp->data[(256-j)*256 + i].g = temp->data[(256-j)*256 + i].b = 255; } }
事前に配列histの最大値をmaxに入れておきます.その後ヒストグラムの画像を作成するのですが,ここで注意することは配列のデータは画面上では左から右へ,上から下へ並びます.そのため256-jとすることで下から順に処理しています.また,内側のfor文では最大値が256になるように処理しています.