图像识别

三世轮回 提交于 2020-03-11 09:43:07

题目描述:

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

输入格式: .

输入数据包含多组测试数据。 输入的第一-行是-一个整数T (T s 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
#include<bits/stdc++.h>
using namespace std;
int d;
int T,N,M;
int data[105][105];
int flag[105][105];
void dfs(int x,int y,int value) {
	if(x>0&&y>0&&x<=N&&y<=M) {
		if(flag[x][y]==0&&abs(data[x][y]-value)<=d) {
			flag[x][y]=1;
			dfs(x-1,y-1,data[x][y]);
			dfs(x+1,y-1,data[x][y]);
			dfs(x-1,y+1,data[x][y]);
			dfs(x+1,y+1,data[x][y]);
			dfs(x,y-1,data[x][y]);
			dfs(x,y+1,data[x][y]);
			dfs(x-1,y,data[x][y]);
			dfs(x+1,y,data[x][y]);
		}
	}
}
int main() {
	cin>>T;
	while(T--) {
		cin>>N>>M>>d;
		memset(data,0,sizeof(data));
		memset(flag,0,sizeof(flag));
		for(int i=1; i<=N; i++) {
			for(int j=1; j<=M; j++) {
				cin>>data[i][j];
			}
		}
		int count=0;
		for(int i=1; i<=N; i++) {
			for(int j=1; j<=M; j++) {
				if(flag[i][j]==0) {
					dfs(i,j,data[i][j]);
					count++;
				}
			}
		}
		cout<<count<<endl;
	}
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!