13F:图像分割

总时间限制: 
1000ms
 
内存限制: 
65536kB
描述
图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。
图像用一个二维的数组来保存,数组的每一个元素表示空间的一个像素。数组的元素是0-255的整数,表示该像素的灰度。例如0表示该像素是黑色的,255表示该像素是白色的。
图像由若干个区域组成,每个区域内部的灰度变化相对连续,而不同区域之间的交界处灰度往往有突变。

具体而言,我们对区域做如下的规定:
1. 如果两个相邻像素灰度的差值不超过M,这两个像素就算同一个区域。
2.如果像素a和像素b是一个区域,像素b和像素c是一个区域,那么a和c也是一个区域
3. 请注意,若两个相邻像素灰度的差值大于M,也未必不是一个区域
例如,假设M=1,下面四个点灰度值分别是1,2,0,3:

1 2

0 3

这四个点属于同一个区域。因为0 1,1 2,2 3都是同一区域,所以0 3也是同一区域

显然,M决定了区分区域的灵敏度。
请你编一个程序,判断给定的图像可以分为几个区域。
 

 

输入
输入包含多组。
每组第一行是三个正整数H,W,M(W,H≤50,0≤M≤255),表示物体的高、宽和灵敏度。
接下来是H行W列的0~255的非负整数,按照空间坐标顺序依次给出每个像素的灰度。
以0 0 0作为输入的结束
输出
对每组样例,输出一个整数N,表示图像分为几个区域。
样例输入
3 4 1
2 0 0 0
0 0 2 2
0 0 2 2
0 0 0
样例输出
3
 1 #include<iostream>
 2 #include<queue>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 int H, W, M;
 7 int a[60][60];
 8 bool vis[60][60];
 9 int dirx[4] = {0,0,1,-1};
10 int diry[4] = {1,-1,0,0};
11 void dfs(int x, int y){
12     for(int i = 0; i < 4; i++){
13         int nx = x+dirx[i], ny = y+diry[i];
14         if(a[nx][ny]!=-1&&!vis[nx][ny]&&abs(a[nx][ny]-a[x][y])<=M){
15             vis[nx][ny] = true;
16             dfs(nx, ny);
17         }
18     }
19 }
20 int main(){
21     while(1){
22         cin>>H>>W>>M;
23         memset(a,-1,sizeof(a));
24         memset(vis,0,sizeof(vis));
25         if(H == 0) return 0;
26         int i, j;
27         for(i = 1; i <= H; i++)
28             for(j = 1; j <= W; j++)
29                 cin>>a[i][j];
30         int ans = 0;
31         for(i = 1; i <= H; i++)
32             for(j = 1; j <= W; j++){
33                 if(!vis[i][j]){ 
34                     dfs(i, j);
35                     ans++;
36                 } 
37             }
38         cout<<ans<<endl;
39      }
40     return 0;
41 }

备注:希望考试也都是这种水题。。 最开始犯了个愚蠢错误是第33行的大括号忘了加了orz

posted @ 2020-06-19 11:22  timeaftertime  阅读(236)  评论(0编辑  收藏  举报