检测“位图”中的形状

Posted

技术标签:

【中文标题】检测“位图”中的形状【英文标题】:Detecting shapes in a "bitmap" 【发布时间】:2013-10-22 09:06:49 【问题描述】:

所以,在为下一场 ieextreme 比赛做准备时,我遇到了一些过去的问题。我发现了一个真正困扰我的问题,因为我不知道该怎么做。我可能会使用一些 300 行代码来完成它,但我认为这不是某人在这样的比赛中应该做的,所以我需要你的帮助!!

检测位图中的形状

问题陈述:在图像分析中,通常分析位图并观察其中存在的形状。对于这个问题,设计一种算法来检测给定位图中的形状。地图中出现的形状应来自设置的正方形、矩形、三角形和平行四边形。

在位图中,每个像素都表示为一个位,1 - 表示黑色,0 - 表示白色。参与者应检测黑色轮廓的形状。输入 第一行将包含位图的大小,以像素表示,表示为 (Row,Column)。

例如6,8 这意味着 6 行和 8 列的位图。下一行将包含一系列从 0 到 255 的十进制数字,由空格分隔。每个数字将代表位图中 8 个二进制位的集合。 IE。 55代表二进制模式00110111。

注意:位图中可以有多个形状,并且任何形状都不得相交。然而,可以有相互嵌套的形状而没有任何交集。

输出 位图中的形状按名称升序排列,用逗号和空格分隔。例如。矩形、正方形、三角形

注意:输出末尾没有换行符或空格 如果任何形状重复,则输出应包含与位图中一样多的重复。 IE。如果有 2 个正方形和 1 个三角形,则输出应为 Square, Square, Triangle

示例集 1

输入:

6 8

0 126 66 66 126 0

输出:矩形

示例集 2

输入:

6 16

0 0 120 120 72 144 73 32 123 192 0 0

输出:平行四边形,正方形

我编写了这段代码,以便我可以可视化位图并有 2 个列表(行和列中的位图)...

rows,cols=(int(i) for i in raw_input().split())
nums=[int(n) for n in raw_input().split()]
mr=[]
for i in range(0,len(nums),cols/8):
    row=''
    for j in range(i,i+cols/8):
        b=bin(nums[j])[2:]
        b='0'*(8-len(b))+b
        row+=b
    mr.append(row)
mc=[''.join([mr[i][j] for i in range(rows)]) for j in range(cols)]

感谢您的宝贵时间...如果您可以使用 Python、C++ 或 Ruby,请回答,因为这些是我可以理解甚至算法上可以理解的语言...

【问题讨论】:

【参考方案1】:

我的方法是这样的:

    找到第一个黑色像素(最左上角或最左上角)。 向右和向下跟踪黑色路径(即循环直到碰到白色像素)。

    3 例:

    路径长度相同:正方形或三角形。检查左下角像素右侧的像素来决定(黑色:正方形,白色:三角形)。 路径有不同的长度:矩形或三角形(?还是应该总是 45 度?)。检查左下角像素右侧的像素来决定(黑色:矩形,白色:三角形)。 其中一条路径不存在:三角形或平行四边形。假设向下的路径确实存在:检查左下角像素右侧的像素来决定(黑色:三角形,白色:平行四边形)。

    删除形状并重复。

您只检查每个像素一定的次数(不太确定那个常数),所以这应该在时间上与像素数成线性关系。

【讨论】:

感谢您的回复!对平行四边形有什么想法吗? @PavlosTriantafyllou 对不起,我完全错过了平行四边形!我添加了一项额外的测试。 我认为还缺少其他东西(因为我考虑了很长时间)...假设我们找到第一个黑色像素,我们发现它有一个水平的 4 个黑点路径和一个垂直的 4 个黑点...(您的第 2 步)我们如何通过检查左下角像素的下一个像素来知道路径闭合并形成形状? @PavlosTriantafyllou 在分配描述中说“地图中存在的形状应来自设置的正方形、矩形、三角形和平行四边形。”和“任何形状不得相交”。所以你只需要检查一个简单的形状(没有“平均”输入)。不过,我同意,仅检查第一个像素是不够的(仅在角度至少为 45 度时才有效),但您只需检查几个即可区分正方形和三角形。 我不知道分配描述是否写得不好,但是有死的“平均”输入。我的意思是不是每个黑色像素都是形状的一部分......上面有随机像素可能形成也可能不形成形状的位图...

以上是关于检测“位图”中的形状的主要内容,如果未能解决你的问题,请参考以下文章

如何检测图像中的形状?

使用位图时,Android MLKit 人脸检测未检测到人脸

位图碰撞检测(AS3)

获取检测到的人脸位图

实践指南 | 检测 PyTorch 中的张量形状错误

当形状未闭合时从二进制图像中检测圆形和椭圆