「OpenCV에 의한 화상 처리 입문」연습 문제 6.2 도중까지

「OpenCV에 의한 화상 처리 입문」 연습 문제 6.1 1 및 2 전용.
3의 의사 컬러 처리를 모른다. .

연습 문제 6.2


  • 적절한 그레이 스케일 이미지를 준비하고 식 6.2, 6.3, 6.4에 따라 도수 분포와 누적 도수를 구한다
  • 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 하고 있지만, 표시를 반복해 딱 좋은 것으로 했다.

    좋은 웹페이지 즐겨찾기