• nyoj--图像有用区域


    描述

    “ACKing”同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以内的图片,现在请你来帮助他完成第一步,把黑色线圏外的区域全部变为黑色。

         

                    图1                                                        图2 

    已知黑线各处不会出现交叉(如图2),并且,除了黑线上的点外,图像中没有纯黑色(即像素为0的点)。

     
    输入
    第一行输入测试数据的组数N(0<N<=6) 每组测试数据的第一行是两个个整数W,H分表表示图片的宽度和高度(3<=W<=1440,3<=H<=960) 随后的H行,每行有W个正整数,表示该点的像素值。(像素值都在0到255之间,0表示黑色,255表示白色)
    输出
    以矩阵形式输出把黑色框之外的区域变黑之后的图像中各点的像素值。
    样例输入
    1
    5 5
    100 253 214 146 120
    123 0 0 0 0
    54 0 33 47 0
    255 0 0 78 0
    14 11 0 0 0
    
    样例输出
    0 0 0 0 0
    0 0 0 0 0
    0 0 33 47 0
    0 0 0 78 0
    0 0 0 0 0
    解题思路:
    这道题是一道广搜的题目,需要注意的一点是,输入的W,H分别表示图片的宽度和高度,其他就可以按广搜来处理。
    要在输入的矩阵外层再加一圈,全部赋值为1,再进行广搜就可以。
     

    具体代码:

     

     1  
     2 #include<iostream>
     3 #include<queue>
     4 #include<cstring>
     5 using namespace std;
     6 int map[965][1445],w,h;
     7 int fangxiang[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
     8 struct Node
     9 {
    10     int x;
    11     int y;
    12     Node (int x1,int y1):x(x1),y(y1){}
    13 };
    14 void bfs(int x,int y)
    15 {
    16     Node node(x,y);
    17     queue<Node> q;
    18     while(!q.empty())q.pop();
    19     q.push(node);
    20     while(!q.empty())
    21     {
    22         node=q.front();
    23         q.pop();
    24         for(int i=0;i<4;i++)
    25         {
    26             int xx=node.x+fangxiang[i][0];
    27             int yy=node.y+fangxiang[i][1];
    28             if(xx>=0&&xx<=h+1&&yy>=0&&yy<=w+1&&map[xx][yy])
    29             {
    30                 map[xx][yy]=0;
    31                 Node next(xx,yy);
    32                 q.push(next);
    33             }
    34         }
    35     }
    36 }
    37 int main()
    38 {
    39     int t;
    40     cin>>t;
    41     while(t--)
    42     {
    43         cin>>w>>h;
    44         memset(map,1,sizeof(map));
    45         for(int i=1;i<=h;i++)
    46             for(int j=1;j<=w;j++)
    47                 cin>>map[i][j];
    48         bfs(0,0);
    49         for(int i=1;i<=h;i++)
    50         {
    51             for(int j=1;j<=w;j++)
    52             {
    53                 cout<<map[i][j]<<" "; 
    54             }
    55             cout<<endl;
    56         }
    57         cout<<endl;      
    58     }
    59     //system("pause");
    60     return 0;
    61 }
    62         
    View Code

     

     

  • 相关阅读:
    mysql-5.7 show engine innodb status 详解
    mysql-5.7 saving and restore buffer pool state 详解
    mysql-5.7 监控innodb buffer pool load 的进度 详解
    python3 functools partial 用于函数的包装器详解
    mysql-5.7 innodb change buffer 详解
    mysqlbackup 重建带有gtid特性的slave
    将python图片转为二进制文本的实例
    nginx: [error] invalid PID number "" in "/run/nginx.pid"
    ubuntu中执行定时任务crontab
    Matplotlib:mpl_toolkits.mplot3d工具包
  • 原文地址:https://www.cnblogs.com/baoluqi/p/3707909.html
Copyright © 2020-2023  润新知