Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获得轮廓内的最大矩形?_Python_Python 3.x_Opencv - Fatal编程技术网

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

Python 如何获得轮廓内的最大矩形?,python,python-3.x,opencv,Python,Python 3.x,Opencv,我想问一下,是否有更好或更快的替代方法来获得近似矩形轮廓内的最大矩形 矩形应与x轴和y轴对齐,并应完全位于矩形轮廓内。这意味着它将不包含任何外部白色像素,但占据轮廓中最大的区域 测试图像如下: 我已经试过了,但我正在寻找是否有一种更快更整洁的方法来解决这个问题 我还试着通过轮廓的点,得到最小和最大点,如中所示,但当然,它只是显示了与cv2类似的结果。boundingRect已经做到了。也许这是一种横向思考,但在不使用外部边界框填充白色pikels contiguoys时,请查看示例和规范。(就

我想问一下,是否有更好或更快的替代方法来获得近似矩形轮廓内的最大矩形

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

测试图像如下:

我已经试过了,但我正在寻找是否有一种更快更整洁的方法来解决这个问题


我还试着通过轮廓的点,得到最小和最大点,如中所示,但当然,它只是显示了与cv2类似的结果。boundingRect已经做到了。

也许这是一种横向思考,但在不使用外部边界框填充白色pikels contiguoys时,请查看示例和规范。(就像油漆类型应用中的“油漆罐”笔刷)

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

您甚至可以将处理限制为外部N个像素

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

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

您可以查看该算法,但是如果您现在推送无法遵循的每个点,特别是从形状的整个边界开始,那么“纯”版本的堆栈将非常沉重

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

在进行操作时,您需要检查是否存在任何“搁浅”区域,在这些区域中,您需要反向工作以填充未直接连接到外部的白色区域:

从边缘开始填充。。。

小心搁浅区域-如果您发现了搁浅区域,请在前往之前的位置之前向后扫描以填充,以便携带一个搁浅区域(如果搁浅区域再次自行打开,则可能需要重复出现,但在您的特定应用程序中,这不应该是一个大问题,与某些图形应用程序不同)

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

对于一个实际的实现,有一些想法需要做。你的例子会在边缘有很多填充,但没有太多复杂的内部形状可以遵循,这使事情简单。但是你需要从所有四个方面来有效地做这件事-可能作为一系列同心矩形,而不是一次一个侧面.整个设计更加复杂,但在本例中效率更高


无论如何都值得思考。

希望这会有所帮助:一种简单的方法是,一旦你从cv2.boundingRect()中得到矩形,只需使用固定偏移量将矩形向内强制。这将确保您没有外部白色像素。它可能不是最大的矩形,但会非常接近。看看这是一种有趣的方法!您是如何做到的?我没有按照描述实现这一点,但为计算机gra做了类似的操作phics应用可以追溯到很久以前。当你在那里协调递归时,如果孔重新打开,它不会经常发生,因此一个简单的点列表/堆栈可以覆盖它。可以看到许多实现每行填充的方法,但这似乎并不密集,所以你不必非常复杂。它是“不确定”给了我洞察力。最终目标是在忽略噪音的情况下可靠地阅读字符。我用一种类似但非常简单的方法完成了程序:我只“淹没”了图像两次(一次用于盒子外部,另一次用于盒子内部),剩下的一定是里面的数字。但这并不完美,与方框相交的字符被淹没,导致它被忽略或被视为两个独立的字符。无论如何,谢谢!