Bootstrap

CSP22-2 邻域均值

题目背景

顿顿在学习了数字图像处理后,想要对手上的一副灰度图像进行降噪处理。不过该图像仅在较暗区域有很多噪点,如果贸然对全图进行降噪,会在抹去噪点的同时也模糊了原有图像。因此顿顿打算先使用邻域均值来判断一个像素是否处于较暗区域,然后仅对处于较暗区域的像素进行降噪处理。

题目描述

输入格式

输出格式

输入输出样例

思路及代码

可以用二维前缀和的形式求出领域和

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll N=605;
int n,l,r,t,ans;
double a[N][N];
double sum[N][N];
int main()
{
    cin>>n>>l>>r>>t;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            double num;
            cin>>num;
            a[i][j]=num;
        }
    }
     for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            //遍历每一个元素(i,j)的领域并进行判断
            double nnum=0;
            double nvalue=0;
            int x1=max(1,i-r);
            int x2=min(n,i+r);
            int y1=max(1,j-r);
            int y2=min(n,j+r);
            nnum=(x2-x1+1)*(y2-y1+1);
            nvalue=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
            nvalue=nvalue/nnum;
            if(nvalue<=t){
                ans++;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

;