PHP - 检测图像周围空白的真正快速方法?

Posted

技术标签:

【中文标题】PHP - 检测图像周围空白的真正快速方法?【英文标题】:PHP - Really fast way of detecting white space around an image? 【发布时间】:2012-03-26 08:57:51 【问题描述】:

我需要一种真正快速检测图像周围空白区域的方法,特别是我需要每边第一个非白色像素开始的坐标(例如左、上、右、下) .)

ImageMagick 太慢了,所以用 GD 遍历每边的每个像素并查看它是否是白色的。我必须处理大约 500,000,000 张图像,所以每一微秒都会有所作为。

顺便说一句,图像只有黑白。

如果有一个外部应用程序可以做到这一点,我可以使用 php exec,那很好。

【问题讨论】:

白色“边框”是图片周围漂亮的统一边框吗?白色是真的白还是很亮? 不,它根本不统一......可以是任何东西,并且每一边都不同。图像甚至可以是全白的。 所以我认为您需要在每一侧都“最突出”的那个? PS:在 C 或 C++ 中进行实际处理时,您很可能会获得更快的处理速度。 5 亿张图片 - 呸!应该很想知道您的用例! @Gleno,它不是很合适,但它是我正在使用的。 C++ 会好得多,Assemby 会更好,专用的操作系统内核只做我想做的事情会更好,但 PHP 是我为实际目的而使用的。无论如何,PHP 仅将主要由各种其他用 C 或 C++ 编写的应用程序完成的工作整合在一起 - 碰巧 PHP 正在用于这部分。 【参考方案1】:

您是否知道有关图像的任何额外信息可以用来提供帮助?

就像图像开始是白色然后变黑然后保持黑色一样吗?或者任何像素都可以是白色或黑色,而任何一个像素是白色或黑色的这一事实并不能告诉你关于其他像素的任何信息?

如果无论其他像素如何,任何像素都可以是白色或黑色,那么我看不出有什么比在循环中检查每个像素直到找到第一个非白色像素之前做得更好...

如果您知道如果从左边算起的第五个像素是白色的,那么 0-4 也肯定是白色的,那么您可以通过使用某种修改后的二进制类型搜索来检查更少的像素(因为您可以跳过检查在这种情况下为 0-4,只需检查说 5,然后检查 10,如果 5 是白色,10 是黑色,你知道该点在 5-10 之间,所以你可以拆分差异并检查 7 等,直到你找到它们改变的点。)

我认为您最终可能会在这里在速度和准确性之间进行权衡。最准确的方法是切开每一列和每一行,从末端开始,检查每个像素。一旦你在一个列中找到一个命中,你就会在一侧找到边缘。这可以并行完成,因为每个检查都是独立的。正如您所说,您可以通过仅检查每第 n 个像素来加快速度,但这可能偶尔会出现问题,尤其是对于如此大的数据集。这可能会也可能不会被接受。您可以通过检查您找到匹配的区域以检查匹配是否准确来改善这一点。因此,如果您检查每 3 个像素并在第 15 像素处发现命中,则检查 14 以查看是否命中(如果是 14 则检查 13)。使用它,您也许可以减少检查次数。

【讨论】:

黑色像素自然会出现在块中,因此我可以跳过每隔一个像素,甚至只检查 3 个像素中的 1 个。除此之外,它可能是文本、绘图或抖动图片上的照片。【参考方案2】:

如果您的较暗像素的边界大多是连续的,则可以使用一种算法: 左侧:

    取中间像素并开始检查右侧像素,直到找到黑色像素。 然后从那里向上/向下移动,直到碰到黑色像素 当您发现黑色像素时,向左移动直到碰到白色像素 重复 2,3 直到最终到达顶部/底部

如果有间隙,这当然是行不通的,比如在文本中。

【讨论】:

问题是......图像中间可能有一个很大的空白区域,角落只有黑色像素。 从理论上讲,您可以从顶部的 10% 开始,然后一直到宽度的 50%。如果您没有击中任何东西,则向上移动一行,然后向下移动 2 行等...与逐行/逐列扫描相比,您很可能仍然需要覆盖更少的像素。

以上是关于PHP - 检测图像周围空白的真正快速方法?的主要内容,如果未能解决你的问题,请参考以下文章

删除图像视图周围的空白

使用图像魔法转换 PDF,在周围留下额外的空白

裁剪大图像周围的空白区域

R中的方法在svg文件上裁剪空白

CodeIgniter 图像水印在使用动态输出时返回空白图像

去掉img标签周围的空白