csp22前2题
一幅长宽分别为 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;
}