プロが教える店舗&オフィスのセキュリティ対策術

このプログラムをさらに改良し、ヒストグラム(グレースケール画像のヒストグラム)から、最小値、最大値、平均値、分散、中央値、最頻値の6つの統計量を計算・表示するプログラムを作成しなさい。
といった問題なのですが、誰か詳しい方教えてくれませんか。

#include <stdio.h>
#include <opencv.hpp>
#pragma warning(disable: 4996)

using namespace cv;

int main(int argc, char** argv)
{
//画像データ用変数の宣言
Mat src_img;

//画像データの読み込み
src_img = imread("C:\\opencv4.3.0\\sources\\samples\\lena.jpg", 0);

int m = src_img.cols; //画像の幅(列)xを取得
int n = src_img.rows; //画像の高さ(行)yを取得
int hist[256]; //ヒストグラム(度数分布表)用の配列

FILE* fp;
fp = fopen("histogram.txt", "w+"); // ファイルを開く

//配列histを初期化
for (int i = 0; i <= 255; i++) {
hist[i] = 0;
}

//ヒストグラム(度数分布表)の作成
for (int y = 0; y < n; y++) {
for (int x = 0; x < m; x++) {

hist[src_img.data[y * src_img.step + x]] ++; //ある画素値の度数を計数

}
}

//度数分布表の書き込み
for (int i = 0; i <= 255; i++) {
printf("%d %d\n", i, hist[i]);
fprintf(fp, "%d %d\n", i, hist[i]);
}
fclose(fp); // ファイルを閉じる


//画像の表示用ウィンドウを生成
namedWindow("TEST_IMAGE", WINDOW_AUTOSIZE);

//画像の表示
imshow("TEST_IMAGE", src_img);

//キー入力待ち
waitKey(0);

return 0;
}

A 回答 (1件)

画像処理はあまり詳しくないので自信はありませんが、


ヒストグラム配列 hist から統計量を計算するならば

画素値の最小値 = hist で最初に 0 でない位置
画素値の最大値 = hist で最後に 0 でない位置
画素値の平均値 = Σ[i=0..255](i * hist[i]) / 画素数
画素値の分散 = Σ[i=0..255]( hist[i]*(i - 平均値)^2 ) / 画素数
画素値の中央値 = Σ[i=0..x]hist[i] が 画素数/2 を超える最小の x
画素値の最頻値 = hist 内で最大数の位置
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!