画素数の中央値、最頻値など…

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

画素数の中央値、最頻値など…

#1

投稿記事 by hnkto » 1年前

C++の課題です。
白黒濃淡画像を入力とし,その画像の平均値,中央値,最頻値,標準偏差を出力するプログラムを
作成せよ.3 種類の画像に適用し,求めた量で各画像のどのような性質を知ることができているのか 考察せよ.
というものなのですが、中央値、最頻値を求め方がわかりません。下記のコードは教授の書いたものなのですが、ヒストグラムを作っているのはなぜでしょうか、お願いします。

コード:

#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("%lf, %lf,  ¥n", average, sd);
	//↑これのコメントを外せばファイルに出力されます.

	fprintf(stderr, "%lf, %lf,  ¥n", average, sd);
	fprintf(stderr, "%lf, %lf,  ¥n", average2, sd2);

	//以降では,最頻値と中央値を求めるためにヒストグラムを作成している

	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)++;
			}
		}
	}

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

アバター
usao
記事: 1546
登録日時: 6年前

Re: 画素数の中央値、最頻値など…

#2

投稿記事 by usao » 1年前

>ヒストグラムを作っているのはなぜでしょうか

少なくとも「最頻値」という言葉の意味がわかっているなら必要性は自明では?

アバター
usao
記事: 1546
登録日時: 6年前

Re: 画素数の中央値、最頻値など…

#3

投稿記事 by usao » 1年前

「中央値」「最頻値」の言葉の意味をわざわざ説明するまでもない(ググれば一発)とは思うけども,
仮に,
{ 1, 2, 3, 2, 3, 1, 1, 4, 1 }
という9個のデータがあった時…

最頻値ってのは,最もたくさんあるやつだから,ここでは1.
このことは,データ値の全種類に関して
・データの中に,1が何個あるか→4個ある
・データの中に,2が何個あるか→2個ある
・データの中に,3が何個あるか→2個ある
・データの中に,4が何個あるか→4個ある
っていう個数を数えて,一番個数が多いデータ値はどれだろう?ってことを調べたらわかる.
で,「このデータ値毎に個数を数えた結果」って「ヒストグラム」だよね.

じゃあ,中央値はいくつかっていうと…
9個のデータ値を小さい順に並べたときにど真ん中にくるやつ(=5番目にくるやつ)だから,このデータだと2.
でも,わざわざデータの並び替えを行わなくても,既に上記のヒストグラムが得られているならば,「小さい側から数えて5番目にくるデータの値ってのはいくつなのか」を求めることができそうだよね.

アバター
usao
記事: 1546
登録日時: 6年前

Re: 画素数の中央値、最頻値など…

#4

投稿記事 by usao » 1年前

usao さんが書きました:
1年前
・データの中に,4が何個あるか→4個ある
typo.4個じゃなくて1個.

返信

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