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

时间:2012-03-26 08:57:51

标签: php gd

我需要一种真正快速检测图像周围空白区域的方法,具体来说我需要第一个非白色像素开始每一侧的坐标(例如左侧,顶部,右侧,底部) 。)

ImageMagick太慢了,因此沿着每一侧的每个像素循环使用GD并查看它是否为白色。我必须做大约500,000,000张图像,所以每微秒都有所作为。

BTW,图像为黑色&只有白色。

如果有一个可以执行此操作的外部应用程序,我可以使用PHP exec,那就没问题了。

2 个答案:

答案 0 :(得分:3)

您是否知道有关可用于帮助的图像的其他信息?

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

如果任何像素可以是白色或黑色而不管其他像素,那么我看不出你怎么做比检查循环中的每个像素要好得多,直到找到第一个非白色像素......

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

我认为你最终可能会在速度和准确度之间取得平衡。最准确的方法是从四肢开始切割每个列和行,检查每个像素。一旦您在列中找到了匹配,就会在一侧找到边缘。这可以并行完成,因为每个检查都是独立的。正如你所说,你可以加快速度,只检查每个第n个像素,但偶尔也会出现这种情况,特别是对于这么大的数据集。这可能是也可能是不可接受的。您可以通过检查找到匹配的区域来检查匹配是否准确来改善这一点。因此,如果您检查每个第3个像素并且您在像素15处找到命中,则检查14以查看它是否是命中(如果是14,则检查13)。使用它你可以减少支票的使用。

答案 1 :(得分:1)

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

  1. 取中间像素并开始检查右边的像素,直到找到黑色像素。
  2. 然后从那里向上/向下移动直到你遇到黑色像素
  3. 当您发现黑色像素向左移动直到您击中白色
  4. 重复2,3直到你最终到达顶部/底部
  5. 如果存在空白,那当然不会起作用,例如文字。