四川动物

一种简单的图像识别技术

 

Now the general image recognition algorithms are k-means algorithm and word bag model. But the algorithm is very complex, and it is very difficult for ordinary people to learn. I have invented a very simple image recognition algorithm, ordinary people can understand it at a glance.

0 引言

图像识别,是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对象的技术。图像的传统识别流程分为四个步骤:图像采集→图像预处理→特征提取→图像识别。

现在通用的图像识别算法是k-means 算法以及词袋模型。但是该算法非常复杂,对于普通人学习起来难度极大。本人发明了一种非常简单的图像识别算法,普通人一看就懂,下面举出一个例子进行说明。

识别3000 年前的6 种动物。如图1 所示。

图1 不同的动物符号Fig.1 Different animal symbols

每组数据包含一个 H 行 W 列的字符矩阵(H<=200, W<=50),每个字符为4 个相邻像素点的十六进制(例如 对应的字符是9c)。转化为二进制后1 表示黑点,0 表示白点。

输入满足:

不会出现上述6 种符号之外的其它符号。

输入至少包含一个动物,且每个黑像素都属于一个动物。

每个动物都是一个四连块,并且不同动物不会相互接触,也不会相互包含。

如果两个黑像素有公共顶点,则它们一定有一个相同的相邻黑像素(有公共边)。

动物的形状一定和表6-9 中的图形拓扑等价(可以随意拉伸但不能拉断)。

要求按照字典序输出所有动物。例如图6-11 中的输出应为AKW。

1 解题思路

每个动物都是一个四连块,即所有黑点都连在一起,而中间有一些白色的洞。

题目表中的6 个动物从左到右依次有1,3,5,4,0,2 个洞,各不相同。

这样只要数一数输入的动物有几个“白洞”,就能准确知道它是哪个动物。

算法步骤如下:

(1)先确定第一个动物的外框(值都是1),然后填充该外框。

(2)确定该动物的边界(长方形[(minx,miny)- (maxx,maxy)])。

(3)先找动物边界外面(在长方形[(minx,miny)- (maxx, maxy)]内,后面相同)的洞,

然后填充;继续找动物外面的洞,然后填充;直到动物边界外面没有洞为止。

(4)然后找动物内部的洞,找到一个洞,然后填充;继续找动物内部的洞,然后填充;

直到动物内部没有洞为止。

(5)然后继续查找其它动物(值依次递增),重复步骤(1)到步骤(4),直到找不到动物为止。

(6)输出结果。

2 输入数据格式及输出结果

2.1 输入数据

2.2 输出结果

实际行数是82,列数是100

查找动物的外围空气

minx=0, miny=9, maxx=47, maxy=35

未访问的空气白洞位置是x0=0, y0=9

动物体内的一个白洞位置是(4, 21)

查找动物的外围空气

minx=6, miny=63, maxx=67, maxy=88

未访问的空气白洞位置是x0=6, y0=63

查找动物的外围空气

minx=47, miny=24, maxx=81, maxy=67

未访问的空气白洞位置是x0=48, y0=24

动物体内的一个白洞位置是(51, 43)

动物体内的一个白洞位置是(60, 30)

发现了3 个动物

AKW

3 算法设计

3.1 数据类型和初始化

char sign[6]; //代表该动物的字符 set<char> S;

int H, H2, W; //H2 为实际行数

int blocks; //连通块个数

bool types[6]; //该洞数存在,则为真

int dx[4] = {-1, 0, 1, 0}; int dy[4] = { 0, 1, 0, -1};

//6 个动物从左到右依次有1,3,5,4,0,2个洞

void Init() //初始化

{ sign[1] = 'K'; sign[3] = 'J'; sign[5] = 'D';

sign[4] = 'S';sign[0] = 'W'; sign[2] = 'A'; }

3.2 主函数

3.3 查找所有动物

3.4 查找该动物中的洞个数

3.5 查找第一个未访问的空气白洞

上一篇:遐思
下一篇:没有了