我想找到一个仅包含灰色像素的最大可能矩形(此类矩形以黄色显示):
形状始终是“一件”,但不一定是凸形的(形状边界上的所有点对都不可以通过穿过形状)。
有时存在许多这样的“最大矩形”,然后可以引入进一步的约束,例如:
以矩形为中心的矩形塑造形状的质心(或图像的中心)
以长宽比最接近预定义比例(即4:3)的矩形进行拾取
我的第一个关于算法的想法如下:
计算形状的距离变换并找到其质心
在仅包含形状像素的情况下增大正方形面积
增长矩形(原为正方形)的宽度或高度,而只包含形状的像素。
但是,我认为这种算法会很慢,并且不会导致最优解。
有什么建议吗?
#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中使用了此算法:
评论
这有帮助吗? mathworks.com/matlabcentral/fileexchange / ...@AtulIngle就是这样!谢谢。您能否添加答案,以便我接受?然后,我将尝试编辑答案以详细说明算法-但我不想仅使用您提供的链接来回答自己的问题...
大!我希望阅读您的详尽回答,因为我还没有阅读代码。
@AtulIngle好吧,我在答案中添加了一些讨论,并链接到我的完整文章。