『OpenCVによる画像処理入門』練習問題6.2 途中まで


『OpenCVによる画像処理入門』の練習問題6.1 1と2のみ。
3の疑似カラー処理が分からない。。

練習問題6.2

  1. 適当なグレースケール画像を用意し、式6.2,6.3,6.4にしたがって、度数分布と累積度数を求めよ
  2. 6.2節を参考に累積度数のグラフを描画せよ

グレースケール画像から、手計算で度数分布を求める方法がわからなかったので、全てプログラムを使用した。
度数分布を求める=度数分布表を描画せよ、と解釈。

プログラム(共通処理(p.51)は省略)


Mat img_hst = Mat::zeros(100, 256, CV_8UC1);
Mat img_sum = Mat::zeros(100, 256, CV_8UC1);

const int hdims[] = { 256 };
const float hranges[] = { 0, 256 };
const float* ranges[] = { hranges };
int channels[] = { 0 };
int sum = 0;

// 度数分布を求める
Mat hist;
calcHist(&img_src, 1,channels, Mat(), hist, 1, hdims, ranges);

// 度数の最大・最小値を取得
double hist_min, hist_max;
minMaxLoc(hist, &hist_min, &hist_max);



for (int i = 0; i <= 255;i++)
{
    // 累積度数の計算
    int v = saturate_cast<int>(hist.at<float>(i));
    sum = sum + v;

    // 度数分布の表示
    line(img_sum, Point(i, img_hst.rows), Point(i, img_hst.rows - img_hst.rows * (sum * 0.0000005)), Scalar(255, 255, 255));

    // 累積度数グラフの表示
    line(img_hst, Point(i, img_hst.rows), Point(i, img_hst.rows - img_hst.rows * (v / hist_max)), Scalar(255, 255, 255));
}

// 累積度数の表示
cout << sum << endl;

入力画像

度数分布

calcHist()を使用して度数分布を求める。

累積度数
1920000
各画素ごとの度数をsumに格納して累積。

累積度数のグラフ

度数分布の表示で使用した描画関数line()を使用。分解能として*0.0000005しているが、表示を繰り返してちょうど良いのにした。