zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Python+SparkStreaming+kafka+写入本地文件案例(可执行)
    Python安装pycurl失败,及解决办法
    Linux screen用法简介
    [算法]数组中求出下标不连续的任意个数,使得和最大
    消息队列小结
    [算法]计算全排列组合数
    [数据结构]A*寻路算法
    [数据结构]最大流之Ford-Fulkerson算法
    [数据结构]最小生成树算法Prim和Kruskal算法
    [数据结构]迪杰斯特拉(Dijkstra)算法
  • 原文地址:https://www.cnblogs.com/fangziyuan/p/13162019.html
Copyright © 2011-2022 走看看