首页 CCF CSP-灰度直方图 & 邻域均值
文章
取消

CCF CSP-灰度直方图 & 邻域均值

    听说山大夏令营要机试,内容是csp类型的题,暂时就先停停PAT吧,等8月份再开刷,到时候也没项目做了,可以专心准备机试了,估计还有大概一周左右山大就要开营了,先刷一周CSP好了,熟悉下题型。 争取每天两三道吧。

202104-1. 灰度直方图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
#include<vector>
using namespace std;
int main()
{

    int n, m, L;//n行m列,灰度级L
    cin>>n>>m>>L;
    vector<int>  diagram(L, 0);
    for(int i = 0; i < n*m; i++)
    {
        int tmp;//储存灰度 
        cin>>tmp;
        diagram[tmp]++;
    }
    for(int i = 0; i < L; i++)
    {
        if(i == 0) cout<<diagram[i];
        else cout<<" "<<diagram[i];
    }

} 

    这道题不难,就是鼓捣了半天DevC++这个编译器,不得不说,有点点难用,不过捣鼓好了,接下来就是刷题了。

202104-2. 邻域均值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<iostream>
#include<vector>
using namespace std;
int main()
{
    //n图像宽高,L灰度级,r邻域半径,t阈值(L好像是用不到的) 
    int n,L,r,t;
    cin>>n>>L>>r>>t;//读取数据
    vector< vector<int> > bmp(n, vector<int>(n, 0)) ;
    //将像素数据储存到二维数组中 
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cin>>bmp[i][j];
        }
    }
    //统计每个像素 每一行的前缀和
    vector< vector<int> > prefixBmp(n, vector<int>(n, 0));
    for(int i = 0; i < n; i++)
    {
        int sum = 0;//每行都归0
        for(int j = 0; j < n; j++)
        {
            //等于这像素之前的灰度和 + 本像素的灰度 
            prefixBmp[i][j] = sum + bmp[i][j];
            sum = prefixBmp[i][j];
        } 

    }
    //开始统计较暗处的个数
    int ans = 0;
    //判断每个像素是不是暗处 
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            //统计该位置的邻域大小
            int a,b,c,d;//分别代表邻域的 起始终止 列序号 和 行序号 
            a = (j - r >= 0 ) ? (j - r) : 0;//如果起始列越界那就0
            b = (j + r < n) ? (j + r) : (n - 1);//如果终止列号越界那就n-1
            c = (i - r >= 0) ? (i - r) : 0;//如果起始行越界,那就0
            d = (i + r < n) ? (i + r) : (n - 1);//如果中止行越界,那就n - 1;
            //统计这片区域的大小,即像素个数
            int areaCnt = (b - a + 1) * (d - c + 1);
            //统计这片区域的灰度和
            int greySum = 0;
            //算每一行即可 
            for(int p = c; p <= d; p++)
            {
                //利用前缀和数组 
                greySum += prefixBmp[p][b] - prefixBmp[p][a] + bmp[p][a];
            } 
            //判断是否小于等于阈值 
            if(greySum <= t * areaCnt) ans++;
        }
    } 
    cout<<ans;

}

    一遍AC,不愧是数字图像处理拿优秀的我哈哈哈哈。使用前缀和数组节省开销,别的就没什么需要注意的了。

本文由作者按照 CC BY 4.0 进行授权