画素の最頻値、中央値の求め方について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
hnkto
記事: 10
登録日時: 6年前

画素の最頻値、中央値の求め方について

#1

投稿記事 by hnkto » 5年前

画像を読み取り、その情報から各画素の中での最頻値や中央値を取りたいのですが、わからないなりに中央値のところは書いて見ました。
最頻値はやはり何かに値を入れておいてfor分で回して入れ替えていくしかないのでしょうか?解説お願いいたします。

コード:

#include "common.h"

void average_sd(const cv::Mat_<uchar> image, double &average, double &sd)
{
    average = .0;
    sd = .0;
    for (int y = 0; y < image.rows; ++y)
    {
        for (int x = 0; x < image.cols; ++x)
        {
            average += image(y,x);    //ここで各画素の値を足す
        }
    }
    average /= image.total();    //足された値を画素数(=image.total())で割って平均にしてある
    
    for (int y = 0; y < image.rows; ++y)
    {
        for (int x = 0; x < image.cols; ++x)
        {
            sd += ((average-image(y,x))*(average - image(y,x))); //ここで分散の定義に従って適切な処理をする
        }
    }
    sd /= image.total();    //画素数で割って
    sd = sqrt(sd);            //平方根を取る
}

int main(void)
{
    cv::Mat_<uchar> image = cv::imread("flower.JPG", 0);
    cv::Mat_<uchar> image2 = image.clone();
    
    
    image2 /= 2;    //各画素の画素値を半分にした画像を作成(結果的に,平均値は半分になる.標準偏差は??)
    
    cv::imshow("input", image);
    cv::imshow("input2", image2);
    
    double average, sd;
    double average2, sd2;
    
    average_sd(image, average, sd);
    average_sd(image2, average2, sd2);
    
    fprintf(stderr, "%lf, %lf,  ¥n", average, sd);
    fprintf(stderr, "%lf, %lf,  ¥n", average2, sd2);
    
    //以降では,最頻値と中央値を求めるためにヒストグラムを作成している
    int chuo;
    cv::Mat_<int> hist = cv::Mat::zeros(256, 1, CV_32SC1);
    for (int y = 0; y < image.rows; ++y)
    {
        for (int x = 0; x < image.cols; ++x)
        {
            int tmp = image(y, x);
            if (tmp >= 0 && tmp < 256)
            {
                hist(tmp, 0)++;
                if(tmp>128){
                  //  chuo = (image(128,0)+image(129,0))/2; */こんな感じでいいのでしょうか?
                }
            }
        }
    }
    
    printf("中央値:%d",chuo);
    
    for (int y = 0; y < hist.rows; ++y)
    {
        //濃度値と頻度を画面に表示.2行で同じことをやっているが,
        //一つはエラーコンソール,一つは標準出力であり,標準出力は実行時オプションで指定してあるファイルに出力される.
        fprintf(stderr, "%d, %d,  ¥n", y, hist(y, 0));
        printf("%d, %d ¥n", y, hist(y, 0));
    }
    
    cv::waitKey();
    
    
    return 0;
}


よもやま
記事: 68
登録日時: 8年前
連絡を取る:

Re: 画素の最頻値、中央値の求め方について

#2

投稿記事 by よもやま » 5年前

トピックを乱立しないでください。
下記トピックに対して返信する形での投稿をお願いします。
画素数の中央値、最頻値など…

返信

“C言語何でも質問掲示板” へ戻る