如何得到轮廓内最大的矩形?

2024-05-16 18:06:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想问一下,有没有更好或更快的方法来获得一个几乎矩形轮廓内最大的矩形。你知道吗

矩形应与x和y轴对齐,并且应完全位于矩形轮廓内。这意味着它将不包含任何外部白色像素,但占据了轮廓中最大的区域。你知道吗

测试图像如下: img

我试过thesetwo但是我在寻找是否有一种更快更整洁的方法来解决这个问题。你知道吗

我也试着穿过一个轮廓的点,得到最小点和最大点,就像在here中一样,但是当然,它显示的结果与cv2.boundingRect已经显示的结果相似。你知道吗


Tags: 方法图像区域here像素cv2轮廓矩形
1条回答
网友
1楼 · 发布于 2024-05-16 18:06:37

也许这是一个横向的想法,但看看你的例子和规格时,没有填写白色派克毗连与外部边界框代替。(就像油漆类型应用中的“油漆罐”刷)。你知道吗

例如(红色像素是指从白色变为黑色的像素):

您甚至可以将进程限制为外部N个像素。你知道吗

Image filled out to outside bounding box

=================================

那么如何实现这一点呢?它本质上是像素图形程序中使用的“泛光填充”算法的一个版本,只是您不是从单个种子像素开始,而是检查外边界矩形边缘上的每个点。你开始填写并建立一堆你需要返回的点,因为你不一定能一次跟踪每一个区域,可能需要回到你自己。你知道吗

你可以查一下这个算法,但是如果你现在推送你不能跟随的每一个点,特别是从形状的整个边界开始,“纯”版本会非常繁重。你知道吗

我没有这样实现它,但我的第一个想法是从一个边界向内扫描,一次取一整行像素,用新的第三种颜色标记所有的“白色”像素,然后在下一行填充所有的白色像素,触摸之前标记的像素,以此类推。(不管您是否将更改后的像素标记为第三种颜色、遮罩或alpha通道或其他什么,但您必须能够区分新填充的像素和旧的黑色像素。你知道吗

当你走的时候,你需要检查是否有任何“搁浅”的区域,在那里你需要反向工作来填充没有直接连接到外部的白色区域:

从边缘开始填充。。。 Start filling from the edge

小心搁浅区域-如果你找到了一个,在去你以前去过的地方之前向后扫描填充,然后带上一个(如果搁浅区域再次打开,你可能需要递归,尽管在你的特定应用程序中这应该不是一个大问题,不像一些图形应用程序)

Watch out from stranded areas

然后继续,如果需要,不要忘记从其他边填充(请参见下面的注释),直到您到达一行,没有更多的像素要填充,也没有更多的填充要做。然后在图像的远侧重新开始,因为您需要从远侧开始向后传球,以捕捉该侧的其他内容。你知道吗

enter image description here

enter image description here

对于一个实际的实现有一些想法要做。你的例子会在边缘有很多填充,但不会有太多复杂的内部形状来遵循,这使事情简单。但是你需要从四个方面来有效地工作——也许是作为一系列同心矩形工作,而不是一次只工作一个方面。更复杂的工作,通过设计,但在这个例子中大量更有效。你知道吗

总之,值得深思。你知道吗

相关问题 更多 >