LoginSignup
0
0

More than 3 years have passed since last update.

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

Posted at

『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;

入力画像
image.png
度数分布
image.png
calcHist()を使用して度数分布を求める。

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0