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