• BUPT复试专题—图像识别(2014-2)


    题目描述

    在图像识别中,我们经常需要分析特定图像中的一些特征,而其中很重要的一点就是识别出图像的多个区域。在这个问题中,我们将给定一幅N xM的图像,其中毎个1 x 1的点都用一个[0, 255]的值来表示他的RGB颜色。如果两个相邻的像素点颜色差值不超过D,我们就认为这两个像素点属于同一个区域。对于一个像素点(x,y),以下这8个点(如果存在)是与它相邻的:(x-1,y-1),(x-1,y)(x-1,y+1)(x,y-1)(,y+1)(x+1,y-1)(x+1,y)(x+1,y+1)
    你的任务是写一个程序,分辨出给定图像中一共被分为多少个区域。
     

    输入

    输入数据包含多组测试数据。
    输入的第一行是一个整数T (T<=100),表示测试数据的组数。
    每组测试数据的第一行是三个整数N,M,D(1<=N,M<=100, 0<= D<=255),意义如上所述。
    接下来N行,每行M个整数,表示给定图像的每个像素点颜色。

    输出

    对于每组测试数据输出一行,即图像中的区域数量。

    样例输入

    2
    3 3 0
    1 1 1
    0 1 0
    0 1 0
    3 4 1
    10 11 12 13
    9 8 7 6
    2 3 4 5

    样例输出

    3
    1

    来源

    2014机考C题 

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<string>
    using namespace std;
    int donser[101][101];
    bool lable[101][101];
    bool chack(int m,int n)
    {
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                if(lable[i][j]==0)
                    return 0;
        return 1;
    }
    void counts(int x,int y,int m,int n,int d)
    {
        if(lable[x][y]==1)
            return;
        lable[x][y]=1;
        int color=donser[x][y];
        if(x-1>=0&&y-1>=0&&abs(donser[x-1][y-1]-color)<=d)
            counts(x-1,y-1,m,n,d);
        if(x-1>=0&&y>=0&&abs(donser[x-1][y]-color)<=d)
            counts(x-1,y,m,n,d);
        if(x-1>=0&&y+1<n&&abs(donser[x-1][y+1]-color)<=d)
            counts(x-1,y+1,m,n,d);
        if(x>=0&&y-1>=0&&abs(donser[x][y-1]-color)<=d)
            counts(x,y-1,m,n,d);
        if(x>=0&&y+1<n&&abs(donser[x][y+1]-color)<=d)
            counts(x,y+1,m,n,d);
        if(x+1<m&&y-1>=0&&abs(donser[x+1][y-1]-color)<=d)
            counts(x+1,y-1,m,n,d);
        if(x+1<m&&y>=0&&abs(donser[x+1][y]-color)<=d)
            counts(x+1,y,m,n,d);
        if(x+1<m&&y+1<n&&abs(donser[x+1][y+1]-color)<=d)
            counts(x+1,y+1,m,n,d);
        return;
    }
    int main() 
    {
        int T;
        cin>>T;
        while(T--)
        {
            int m,n,d,num=0;
            cin>>m>>n>>d;
            for(int i=0;i<m;i++)
            {
                for(int j=0;j<n;j++)
                {
                    cin>>donser[i][j];
                    lable[i][j]=0;
                }
            }
            while(!chack(m,n))
            {
                for(int i=0;i<m;i++)
                {
                    for(int j=0;j<n;j++)
                    {
                        if(lable[i][j]==0)
                        {
                            num++;
                            counts(i,j,m,n,d);
                        }
                            
                    }
                }
            }
            cout<<num<<endl;
        }
        return 0;
    }
  • 相关阅读:
    一个简单而实用的JQ插件——lazyload.js图片延迟加载插件
    CSS预处理语言——less与sass的使用
    JQuery速成大法
    实现图片的循环滚动——JS的简单应用
    JS基础——循环很重要
    JS基础——入门必备
    做一个常规的banner图——负边距的使用、banner图的拼法
    网页侧边浮动条的实现
    如何做一个导航栏————浮动跟伪类(hover)事件的应用
    基于java代码的springmvc配置
  • 原文地址:https://www.cnblogs.com/dzzy/p/8530809.html
Copyright © 2020-2023  润新知