抠图 java版(会超时,求更简便方法)

蒜头君在做图像处理的项目时,遇到了一个问题。他需要摘取出图片中,某个黑色线框内的图片,现在请你来帮助他完成这一步,把黑色线框外的区域全部变为黑色,即只保留黑色线框内的颜色。

蒜头君可能同时摘取多个线框,这些线框不会出现相邻,相交,包含关系,因为选择线框太多,所以蒜头君可能把其中一部分的线框少画一条边,所以这种线框是无效的。

已知图中除了黑线上的点外,图像中没有纯黑色(即像素为 00 的点)。

矩形关系说明:

其中下面的数据也属于相邻。

1
0 0 0 1 1 1
2
0 1 0 1 1 1
3
0 0 0 1 1 1
4
1 1 1 0 0 0
5
1 1 1 0 1 0
6
1 1 1 0 0 0
也就是说 00 的周围(八个方向),不会有另外一个矩形的 00。

输入格式
第一行输入测试数据的组数 N(0 < N \le 10)N(0<N≤10)。

每组测试数据的第一行是两个整数 H,WH,W 分别表示图片的高度和宽度 (3 \le H,W \le 500)(3≤H,W≤500)。

随后的 HH 行,每行有 WW 个正整数,表示该点的像素值。(像素值都在 00 到 255255 之间,00 表示黑色,255255 表示白色),每行整数之间使用’\t’隔开。

输出格式
以矩阵形式输出,先把黑色框之外的区域变黑,然后输出图像中各点的像素值。

数据约定
对于 30%30% 的数据,线框是宽度为 11 的矩形,并且线框都是完整的。

对于 60%60% 的数据,线框是宽度不固定的的矩形,并且线框都是完整的。

对于 100%100% 的数据,线框可能有多个(题目保证线框不会出现相邻,相交,包含关系),线框是宽度不固定,有部分线框可能缺失其中的一条边(可以认为这种线框为无效线框)。

样例解释
对于第一组数据:

这是一个完整的矩形,所以会保留线框内的颜色,保留下 (3,2),(3,3)(3,2),(3,3) 的像素值。

对于第二组数据:

只有一个矩形,这个矩形不是完成整的矩形,所有是无效线框,所以没有像素值被保留。

对于第三组数据:

有多个矩形,且矩形都满足不相邻,相交,包含的关系。

样例输入复制
3
4 5
1 0 0 0 1
1 0 1 0 1
1 0 1 0 1
1 0 0 0 1
5 6
1 1 1 1 1 1
1 0 1 0 1 1
1 0 1 0 1 1
1 0 0 0 1 1
1 1 1 1 1 1
10 10
1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 1 0 1 0
1 0 0 0 0 0 1 0 1 0
1 0 0 1 0 0 1 0 0 0
1 0 0 0 0 0 1 1 1 1
1 0 0 0 0 0 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 0 0 0 1 0 0 0
1 1 1 0 1 0 1 0 1 0
1 1 1 0 0 0 1 0 0 0
样例输出复制
0 0 0 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0

import java.util.*;
	
public class Main {

		static int w;
		static int h;
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int num=0;
		int n=cin.nextInt();
		for(int i=0;i<n;i++) {
			h = cin.nextInt();
			w = cin.nextInt();
			int [][]shu = new int[h][w];
			for(int j=0;j<h;j++) {
				for(int k=0;k<w;k++) {
					shu[j][k] = cin.nextInt();
				}
			}
			for(int j=0;j<h;j++) {
				for(int k=0;k<w;k++) {
					if(shu[j][k]>0&&(j==0||k==0||j==h-1||k==w-1))
					bfs(shu,j,k);
				}
			}
			for(int j=0;j<h;j++) {
				for(int k=0;k<w;k++) {
					System.out.print(shu[j][k]);
				}
				System.out.println();
			}
			
		}
	}
	public static void bfs(int [][]shu,int x,int y) {
		int dx,dy;
		int []xx = new int[]{1,-1,0,0,1,1,-1,-1};
		int []yy = new int[]{0,0,1,-1,1,-1,1,-1}; 
				shu[x][y]=0;
		for(int i=0;i<8;i++) {
				dx=x+xx[i];
				dy=y+yy[i];
				if(dx<0||dx>=h||dy<0||dy>=w)
					continue;
				if(shu[dx][dy]>0)
					bfs(shu,dx,dy);
				
		}
		return ;
					
	}
}

发布了4 篇原创文章 · 获赞 1 · 访问量 93

猜你喜欢

转载自blog.csdn.net/weixin_45795519/article/details/104101532