![]() |
1
9
通过一次扫描一幅图像可以找到多个矩形的算法不必复杂。与您现在所做的主要区别是,当您找到一个矩形的上角时,不应该立即找到宽度和高度并存储该矩形,而是暂时将其保存在一个未完成的矩形列表中,直到您遇到其下角。然后可以使用此列表有效地检查每个红色像素是新矩形的一部分,还是您已经找到的矩形的一部分。考虑这个例子:
我们开始从上到下、从左到右扫描。在第1行中,我们在位置10处发现一个红色像素;我们继续扫描,直到找到下一个黑色像素(或到达行尾);现在我们可以将其存储在未完成的矩形列表中,如{left,right,top}:
扫描第3行到第5行后,我们得到以下列表:
请注意,我们在遍历列表时插入了新找到的矩形(例如使用链表),以便它们从左到右排列。这样,在扫描图像时,我们每次只需要看一个未完成的矩形。
当我们到达第9行的末尾时,我们已经完成了第5行之后所有未完成的矩形,但我们在第7行发现了一个新的矩形:
如果我们继续到最后,结果是:
如果此时还有任何未完成的矩形,它们将包围图像的底边,并且可以在底部=高度-1的情况下完成。 请注意,跳过未完成的矩形意味着您只需扫描黑色像素和红色矩形的顶部和左侧边缘;在这个例子中,我们跳过了384个像素中的78个。
(Rextester现在似乎被黑客攻击了,所以我删除了链接并将C++代码粘贴在这里。)
如果发现C的链表实现不够快,可以使用两个长度数组 图像宽度 ,当您在第y行的位置x1和x2之间找到矩形的顶部时,将不完整的矩形存储为宽度[x1]=x2-x1和顶部[x1]=y,并在存储完整的矩形时将其重置为零。 这种方法可以找到小到1像素的矩形。如果有最小尺寸,可以使用更大的步长扫描图像;最小尺寸为10x10,只需扫描大约1%的像素。 |
![]() |
2
4
使用以下简单算法的最简单方法:
两个矩形的合并应该相当简单——它们应该有共享的边界。但给定的方法只适用于图像包含矩形且仅包含矩形的情况。对于更复杂的几何图形,最好使用逐行扫描算法进行区域检测,并在下一阶段进行形状类型识别。 |
![]() |
3
4
根据您的需求:
Id引入额外的类型参数
假设我们使用
查找相邻矩形
可能存在多个具有相同形状的矩形
根据元素的数量,在以下情况下,您也可以使用字典(用于更快的查找)
|
![]() |
4
4
遵循不更改Locate()函数而只是扩展现有逻辑的标准,我们需要在扫描后加入任何矩形。试试这个:
最后,启动扫描的主要功能
|
![]() |
5
3
|
![]() |
6
3
https://en.wikipedia.org/wiki/Connected-component_labeling 有多种方法可以解决这个问题。一种是对图像行进行游程编码,并查找行与行之间的重叠。 另一种方法是扫描图像,并在每次遇到红色像素时执行整体填充(擦除整个矩形)。 另一种方法是扫描图像并在遇到红色像素时执行轮廓跟踪(标记每个轮廓像素,以便对斑点进行更多处理)。 所有这些方法都适用于任意形状,您可以根据矩形的特定形状对其进行调整。 |
![]() |
7
2
看看 this post flood fill algorithm 检测矩形。 |
![]() |
8
2
根据澄清意见,您现有的方法是一个完美的起点,我认为它应该使用一个辅助位图来操作,其中包含不应检查的像素(根本不检查,或者再次检查)。 假设大部分图像不是红色:
如果大部分图像被红色矩形覆盖,我会交换检入3(首先检查辅助位图,然后查看像素是否为红色),并扩展填充步骤(6),在左、右和底部方向各有一个像素(已经检查了顶部的像素) 就我个人而言,我更相信按内存顺序读取相邻像素的缓存效率,而不是跳转(由于分区的思想),但仍然要访问大多数像素,最后还要加入大量潜在的片段矩形。 |
![]() |
9
1
很抱歉,我没有阅读你的解决方案,因为我不确定你是想要一个好的解决方案,还是用这个解决方案来解决问题。
解决方案将根据输入图像的不同而变化。 我希望我能帮助你。如果没有,请告诉我你需要什么样的帮助。 |
![]() |
10
1
你在图像上做每像素的线扫描。 如果像素up为黑色,像素left为黑色,但像素本身为红色 向右走,直到它再次变黑(即右上方y2+1) 转到底部,找到黑色,即x2+1,这样就可以导出右,底部(x2,y2) 将x1、y1、x2、y2存储在列表结构或类中 将刚找到的矩形涂成黑色,然后继续进行线扫描 |
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |