自动裁剪任意形状


14

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

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

在此处输入图片说明

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

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

  • 取矩形的中心距形状的质心(或图像中心)最近的矩形
  • 拍摄长宽比最接近预定义比例(即4:3)的矩形

在此处输入图片说明

我对算法的第一个想法是:

  1. 计算形状的距离变换并找到其质心
  2. 在仅包含形状像素的情况下增加正方形区域
  3. 在仅包含形状像素的情况下,使矩形(原为正方形)的宽度或高度增大。

但是,我认为这样的算法会很慢并且不会导致最佳解决方案。

有什么建议么?



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

大!由于我还没有阅读代码,因此我希望阅读您详尽的答案。
Atul Ingle 2013年

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

Answers:


10

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

更新资料

我根据Atul Ingle的上述链接撰写了有关计算最大的内接矩形的本教程文章

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

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

在此处输入图片说明

示例二进制掩码和计算图如下所示:

在此处输入图片说明 在此处输入图片说明

在地图中以最大值显示最大的内接正方形:

在此处输入图片说明

然后,矩形搜索算法会扫描遮罩两次,以查找两类矩形:

  • 宽度大于正方形的尺寸(高度可能较小)
  • 高度大于正方形的大小(宽度可能更小)

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

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

这是矩形的结果图:

在此处输入图片说明 在此处输入图片说明

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

在此处输入图片说明

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

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.