问题描述
试题编号: | 202104-2 |
试题名称: | 邻域均值 |
时间限制: | 1.0s |
内存限制: | 512.0MB |
问题描述: | 试题背景顿顿在学习了数字图像处理后,想要对手上的一副灰度图像进行降噪处理。不过该图像仅在较暗区域有很多噪点,如果贸然对全图进行降噪,会在抹去噪点的同时也模糊了原有图像。因此顿顿打算先使用邻域均值来判断一个像素是否处于较暗区域,然后仅对处于较暗区域的像素进行降噪处理。 问题描述待处理的灰度图像长宽皆为 n 个像素,可以表示为一个 n×n 大小的矩阵 A,其中每个元素是一个 [0,L) 范围内的整数,表示对应位置像素的灰度值。 Neighbor(i,j,r)={Axy|0≤x,y<n and |x−i|≤r and |y−j|≤r} 这里使用了一个额外的参数 r 来指明 Aij 附近元素的具体范围。根据定义,易知 Neighbor(i,j,r) 最多有 (2r+1)2 个元素。 如果元素 Aij 邻域中所有元素的平均值小于或等于一个给定的阈值 t,我们就认为该元素对应位置的像素处于较暗区域。 现给定邻域参数 r 和阈值 t,试统计输入灰度图像中有多少像素处于较暗区域。 输入格式输入共 n+1 行。 输入的第一行包含四个用空格分隔的正整数 n、L、r 和 t,含义如前文所述。 第二到第 n+1 行输入矩阵 A。 输出格式输出一个整数,表示输入灰度图像中处于较暗区域的像素总数。 样例输入 Data 样例输出 Data 样例输入 Data 样例输出 Data 评测用例规模与约定70% 的测试数据满足 n≤100、r≤10。 全部的测试数据满足 0<n≤600、0<r≤100 且 2≤t<L≤256。
|
//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r)/2
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int MAXN = 305;
const int INF = 0x3f3f3f3f;
const int N=5e4+7;
const int maxn=1e5+5;
const double EPS=1e-10;
const double Pi=3.1415926535897;
//inline double max(double a,double b){
// return a>b?a:b;
//}
//inline double min(double a,double b){
// return a<b?a:b;
//}
int xd[8] = {0, 1, 0, -1, 1, 1, -1, -1};
int yd[8] = {1, 0, -1, 0, -1, 1, -1, 1};
//void Fire(){
// queue<node> p;
// p.push({fx,fy,0});
// memset(fire, -1, sizeof(fire));
// fire[fx][fy]=0;
// while(!p.empty()){
// node temp=p.front();
// p.pop();
// for(int i=0;i<8;i++){
// int x=temp.x+xd[i];
// int y=temp.y+yd[i];
// if(x<0||x>=n||y<0||y>=m||fire[x][y]!=-1){
// continue;
// }
// fire[x][y]=temp.val+1;
// p.push({x,y,temp.val+1});
// }
// }
//}
//int bfs(){
// queue<node> p;
// memset(vis, 0, sizeof(vis));
// p.push({sx,sy,0});
// while (!p.empty()) {
// node temp=p.front();
// vis[temp.x][temp.y]=1;
// p.pop();
// for(int i=0;i<4;i++){
// int x=temp.x+xd[i];
// int y=temp.y+yd[i];
// if(x<0||x>=n||y<0||y>=m) continue;
// if(x==ex&&y==ey&&temp.val+1<=fire[x][y]) return temp.val+1;
// if(vis[x][y]||temp.val+1>=fire[x][y]||a[x][y]=='#') continue;
// p.push({x,y,temp.val+1});
// }
// }
// return -1;
//}
int n,l,r,t;
ll a[610][610];
ll b[610][610];
//前缀和计算模版
ll first(int i,int j){
int sum=0;
sum+=a[i][j];
sum+=b[i][j-1];
sum+=b[i-1][j];
sum-=b[i-1][j-1];
return sum;
}
ll tosum(int x1,int y1,int x2,int y2){
ll sum=0;
sum+=b[x2][y2];
sum-=b[x2][y1-1];
sum-=b[x1-1][y2];
sum+=b[x1-1][y1-1];
return sum;
}
double avg(int x,int y){
int x1=max(1,x-r);
int y1=max(1,y-r);
int x2=min(x+r,n);
int y2=min(y+r,n);
int num=(x2-x1+1)*(y2-y1+1);
return tosum(x1, y1, x2, y2)*1.0/num;
}
int main(){
cin>>n>>l>>r>>t;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
b[i][j]=first(i,j);
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(avg(i, j)<=t){
ans++;
}
}
}
cout<<ans;
}