对于学校项目,我使用具有一些高级功能的轮廓查找器。目标是让它快速疯狂,这使得事情有时像现在一样复杂。 正如我读过一次"数周的编程可以节省数小时的思考和#34;这就是主题。
目标是找到哪个blob被另一个blob完全包围。
边缘像素是一个像素是黑色而下一个像素是白色的。
带有红线的形状是可能的父级blob。条件是它的形状完全由围绕它的红线包围。因此,对于图像0 ,它不是父blob,因为它在顶部打开,因此不包围另一个blob。
blobfinder从左到右或从上到下扫描。角点像素被保存。如果你从与blob中存储的第一个像素相反的方向移动,你确定你再也不会碰到同一个blob。这个细节非常重要。
当从黑色像素变为白色像素时,也会检测到轮廓。因此对于图像1 ,在绿色椭圆处检测到内部正方形,而不是在红色处检测到。换句话说,在绿色椭圆处是像素0的位置,第一个像素位于斑点中的像素阵列中。
为了实现我们的目标,我们将以相反的方向扫描我们如何找到轮廓。因此,对于图像1,我们通过从左到右创建轮廓,发现它是从右到左的封闭斑点。 此细节也很重要。
对于我们检查的每个像素,我们还将检查坐标是否在可能的父blob之外。如果这个条件为真,那么它不是一个封闭的blob。例如,在图片1 。
中如果找到一个边缘像素并且该坐标属于我们测试的blob,那么我们知道它属于可能的父blob,请参阅 image 2 。
如果发现某个blob在测试范围内,那么可以忽略该blob,请参阅 image 3 。
如果发现blob超出可能的父blob的边界,那么我们知道测试未被可能的父blob包围的blob,请参阅 image 4 。
如果从可能的父blob中找到一个像素,那么我们现在它不是一个封闭的blob,请参阅 image 5 。
如果我们知道测试是封闭blob的blob,那么我们测试的blob中的所有blob也被可能的父blob包围,请参阅 image 6 。 (因此,在较小的斑点之前测试更大的斑点是好的)
我的问题是,有没有我没想过的案例?或者在案件失败的情况下我错了吗? 如果你能想到什么,那么请提供一个图像来解释更直观的事物。 如果您有任何问题,请询问他们,我将编辑此帖子,以便在可能的情况下更清楚地描述。我已经尽了最大的努力。