一幅长宽分别为 nn 个像素和 mm 个像素的灰度图像可以表示为一个 n×mn×m 大小的矩阵 AA。
其中每个元素 AijAij(0≤i<n0≤i<n、0≤j<m0≤j<m)是一个 [0,L)[0,L) 范围内的整数,表示对应位置像素的灰度值。
具体来说,一个 88 比特的灰度图像中每个像素的灰度范围是 [0,256)[0,256)。
一副灰度图像的灰度统计直方图(以下简称“直方图”)可以表示为一个长度为 LL 的数组 hh,其中 h[x]h[x](0≤x<L0≤x<L)表示该图像中灰度值为 xx 的像素个数。
显然,h[0]h[0] 到 h[L−1]h[L−1] 的总和应等于图像中的像素总数 n⋅mn⋅m。
已知一副图像的灰度矩阵 AA,试计算其灰度直方图 h[0],h[1],⋯,h[L−1]h[0],h[1],⋯,h[L−1]。
输入格式
输入共 n+1n+1 行。
输入的第一行包含三个用空格分隔的正整数 nn、mm 和 LL,含义如前文所述。
第二到第 n+1n+1 行输入矩阵 AA。第 i+2i+2(0≤i<n0≤i<n)行包含用空格分隔的 mm 个整数,依次为 Ai0,Ai1,⋯,Ai(m−1)Ai0,Ai1,⋯,Ai(m−1)。
输出格式
输出仅一行,包含用空格分隔的 LL 个整数 h[0],h[1],⋯,h[L−1]h[0],h[1],⋯,h[L−1],表示输入图像的灰度直方图。
数据范围
0<n,m≤5000<n,m≤500,
4≤L≤2564≤L≤256
输入样例1:
4 4 16
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
输出样例1:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
输入样例2:
7 11 8
0 7 0 0 0 7 0 0 7 7 0
7 0 7 0 7 0 7 0 7 0 7
7 0 0 0 7 0 0 0 7 0 7
7 0 0 0 0 7 0 0 7 7 0
7 0 0 0 0 0 7 0 7 0 0
7 0 7 0 7 0 7 0 7 0 0
0 7 0 0 0 7 0 0 7 0 0
输出样例2:
48 0 0 0 0 0 0 29
#include <bits/stdc++.h>
using namespace std;
const int N = 505;
int n, m, l;
int g[N][N];
int main()
{cin >> n >> m >> l;map<int, int> mp;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){int x;cin >> x;mp[x] += 1;}}for(int i = 0; i < l; i++){cout << mp[i] << " ";}
}
邻域均值
- 题目
- 提交记录
- 讨论
- 题解
- 视频讲解
顿顿在学习了数字图像处理后,想要对手上的一副灰度图像进行降噪处理。
不过该图像仅在较暗区域有很多噪点,如果贸然对全图进行降噪,会在抹去噪点的同时也模糊了原有图像。
因此顿顿打算先使用邻域均值来判断一个像素是否处于较暗区域,然后仅对处于较暗区域的像素进行降噪处理。
待处理的灰度图像长宽皆为 nn 个像素,可以表示为一个 n×nn×n 大小的矩阵 AA,其中每个元素是一个 [0,L)[0,L) 范围内的整数,表示对应位置像素的灰度值。
对于矩阵中任意一个元素 AijAij(0≤i,j<n0≤i,j<n),其邻域定义为附近若干元素的集和:
Neighbor(i,j,r)={Axy|0≤x,y<n and |x−i|≤r and |y−j|≤r}Neighbor(i,j,r)={Axy|0≤x,y<n and |x−i|≤r and |y−j|≤r}
这里使用了一个额外的参数 rr 来指明 AijAij 附近元素的具体范围。
根据定义,易知 Neighbor(i,j,r)Neighbor(i,j,r) 最多有 (2r+1)2(2r+1)2 个元素。
如果元素 AijAij 邻域中所有元素的平均值小于或等于一个给定的阈值 tt,我们就认为该元素对应位置的像素处于较暗区域。
下图给出了两个例子,左侧图像的较暗区域在右侧图像中展示为黑色,其余区域展示为白色。
现给定邻域参数 rr 和阈值 tt,试统计输入灰度图像中有多少像素处于较暗区域。
输入格式
输入共 n+1n+1 行。
输入的第一行包含四个用空格分隔的正整数 nn、LL、rr 和 tt,含义如前文所述。
第二到第 n+1n+1 行输入矩阵 AA。第 i+2i+2(0≤i<n0≤i<n)行包含用空格分隔的 nn 个整数,依次为 Ai0,Ai1,⋯,Ai(n−1)Ai0,Ai1,⋯,Ai(n−1)。
输出格式
输出一个整数,表示输入灰度图像中处于较暗区域的像素总数。
数据范围
70%70% 的测试数据满足 n≤100n≤100、r≤10r≤10。
全部的测试数据满足 0<n≤6000<n≤600、0<r≤1000<r≤100 且 2≤t<L≤2562≤t<L≤256。
输入样例1:
4 16 1 6
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
输出样例1:
7
输入样例2:
11 8 2 2
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 7 0 0 0 7 0 0 7 7 0
7 0 7 0 7 0 7 0 7 0 7
7 0 0 0 7 0 0 0 7 0 7
7 0 0 0 0 7 0 0 7 7 0
7 0 0 0 0 0 7 0 7 0 0
7 0 7 0 7 0 7 0 7 0 0
0 7 0 0 0 7 0 0 7 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
输出样例2:
83
#include <bits/stdc++.h>
using namespace std;
const int N = 605;
int a[N][N];
int n, l, r, t;
int solve(int x1, int y1, int x2, int y2)
{
// cout << a[x2][y2] - a[x2][y1 - 1] - a[x1 - 1][y2] + a[x1][y1] << endl;return a[x2][y2] - a[x2][y1 - 1] - a[x1 - 1][y2] + a[x1-1][y1-1];}
int main()
{int res = 0;cin >> n >> l >> r >> t;for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){cin >> a[i][j];a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];}}// for(int i = 1; i <= n; i++)// {// for(int j = 1; j <= n; j++)// {// cout << a[i][j] << " ";// }// cout << endl;// }for(int x = 1; x <= n; x++){for(int y = 1; y <= n; y ++){int cnt = 0;int min_x = max(1, x - r), max_x = min(n, x + r);int min_y = max(1, y - r), max_y = min(n, y + r);// cout << min_x << " " << min_y <<" " << max_x << " " << max_y <<endl;cnt = (max_y - min_y + 1) * (max_x - min_x + 1);if(solve(min_x, min_y, max_x, max_y) <= t * cnt) res++;}}cout << res << endl;
}