我有一个由二进制掩码定义的任意形状(灰色=形状,黑色=背景)。

我想找到一个仅包含灰色像素的最大可能矩形(此类矩形以黄色显示):



形状始终是“一件”,但不一定是凸形的(形状边界上的所有点对都不可以通过穿过形状)。

有时存在许多这样的“最大矩形”,然后可以引入进一步的约束,例如:


以矩形为中心的矩形塑造形状的质心(或图像的中心)
以长宽比最接近预定义比例(即4:3)的矩形进行拾取



我的第一个关于算法的想法如下:


计算形状的距离变换并找到其质心
在仅包含形状像素的情况下增大正方形面积
增长矩形(原为正方形)的宽度或高度,而只包含形状的像素。

但是,我认为这种算法会很慢,并且不会导致最优解。

有什么建议吗?

评论

这有帮助吗? mathworks.com/matlabcentral/fileexchange / ...

@AtulIngle就是这样!谢谢。您能否添加答案,以便我接受?然后,我将尝试编辑答案以详细说明算法-但我不想仅使用您提供的链接来回答自己的问题...

大!我希望阅读您的详尽回答,因为我还没有阅读代码。

@AtulIngle好吧,我在答案中添加了一些讨论,并链接到我的完整文章。

#1 楼

Matlab Fileexchange上有一个与您的问题相关的代码:
http://www.mathworks.com/matlabcentral/fileexchange/28155-inscribedrectangle/content/html/Inscribed_Rectangle_demo.html

Update

我基于Atul Ingle的上述链接编写了有关计算最大内切矩形的本教程文章。

该算法首先在二进制掩码中搜索最大的正方形。使用简单的动态编程算法即可完成。每个新像素使用已知的三个邻居进行更新:

squares[x,y] = min(squares[x+1,y], squares[x,y+1], squares[x+1,y+1]) + 1




示例二进制掩码和计算图如下: br />


在地图中取最大位置会显示出最大的内切正方形:



矩形搜索算法比再次扫描遮罩两次以查找两类矩形:


宽度大于正方形的大小(并且高度可能更小)
高度大于正方形的大小(并且宽度可能更小) )

这两个类均受最大正方形的限制,因为在给定点上没有矩形的两个尺寸都可以大于内切正方形(尽管一个尺寸可以更大)。

必须为矩形尺寸选择一些度量标准,例如面积,周长或尺寸的加权和。

这是矩形的结果图:



召开可以将到目前为止找到的最佳矩形的位置和大小存储在变量中,而不是构建地图,然后寻找最大值。



该算法的实际应用是裁剪非矩形图像。我在图像拼接库SharpStitch中使用了此算法: