图像有用区域
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
“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 为避免边界判断,在图的最外围加上一圈全为0的点,然后把原图最外层每个点进行进行一次广搜,搜过的变为0,最后剩下的就是要得到的图了。
#include<iostream>
#include<queue>
#include<fstream>
using namespace std;
int W, H, map[970][1450], dir[4][2] = { 0,1,0,-1,1,0,-1,0 };
void bfs(int i, int j)
{
map[i][j] = 0;
queue<pair<int, int> > q;
q.push(make_pair( i,j ));
while (!q.empty()) {
i = q.front().first;
j = q.front().second;
q.pop();
for (int k = 0;k < 4;k++)
{
int r = i + dir[k][0];
int s = j + dir[k][1];
if (map[r][s])
{
map[r][s] = 0;
q.push(make_pair(r, s));
}
}
}
}
int main()
{
int N;
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
cin >> N;
while (N--)
{
cin >> W >> H;
for (int i = 0;i <= W + 1;i++)
map[0][i] = map[H + 1][i] = 0;
for (int j = 0;j <= H + 1;j++)
map[j][0] = map[j][W + 1] = 0;
for (int i = 1;i <= H;i++)
for (int j = 1;j <= W;j++)
cin >> map[i][j];
for (int i = 1;i <= W;i++)
{
if (map[1][i]) bfs(1, i);
if (map[H][i]) bfs(H, i);
}
for (int j = 2;j <= H - 1;j++)
{
if (map[j][1]) bfs(j, 1);
if (map[j][W]) bfs(j, W);
}
for (int i = 1;i <= H;i++)
{
for (int j = 1;j <= W;j++)
cout << map[i][j] << " ";
cout << endl;
}
}
return 0;
}