灰度直方图

扫描所有像素并累加对应灰度值的频次数组。

OJ: shumeng

题目 ID: CSP202104A

难度:入门

标签:模拟计数

日期: 2026-07-31 16:21

形式化题目

给出一幅 n×mn\times m 的灰度图像,每个像素的灰度值为 [0,L)[0,L) 内的整数。统计每个灰度值 xx 出现的像素数量,输出长度为 LL 的直方图 h0,h1,,hL1h_0,h_1,\dots,h_{L-1}

思路

直方图就是按灰度值分桶的频次数组。

统计步骤

  1. 开一个长度为 LL 的计数数组;
  2. 读到灰度值 xx 时执行 count[x]++
  3. 最后按灰度从小到大输出每个桶的计数。

图像的二维结构不影响统计过程,逐像素读入并累加即可。

代码

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-07-31 16:21
 * update_at: 2026-08-17 22:39
 */
#include <bits/stdc++.h>
using namespace std;

const int MAXL = 260;

int n, m, levels;
int count_value[MAXL];   // count_value[x] 记录灰度值为 x 的像素个数

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> m >> levels;
    // 逐个读入像素,累加对应灰度值的频次
    for (int i = 0; i < n * m; i++) {
        int value;
        cin >> value;
        count_value[value]++;
    }
    // 按灰度值从小到大输出频次
    for (int i = 0; i < levels; i++) {
        if (i) cout << ' ';
        cout << count_value[i];
    }
    cout << '\n';
    return 0;
}

复杂度

扫描全部 n×mn\times m 个像素,时间复杂度为 O(nm)O(nm),空间复杂度为 O(L)O(L)

总结

直方图就是按值分桶的频次数组,图像行列结构不影响统计过程。