如何检测图像中的部分垂直/水平线?

时间:2010-11-10 07:51:43

标签: php image image-processing gd

我有一张图片,图片中有一条偏线。它们一直是水平或垂直线。我不知道线的颜色,也不知道线的宽度。

如何使用PHP来检测这样的一行?

正如您在上传的图片中看到的,我需要切片3x3个部分。我需要3个垂直和3个水平部分来切割部件。请注意,内容区域周围有一个带有一些标记的矩形,这是图像的一部分。

我们可以使用这些标记来获取坐标。

alt text alt text

5 个答案:

答案 0 :(得分:1)

如果它们具有相同的颜色/长度,则最好通过比较每条线的第一个和最后一个N个像素来使用这些标记。它比解析每一行上的所有像素更有效。

答案 1 :(得分:0)

您必须按行和列方式检查图像。您很可能会使用imagecolorat()。遍历所有列和行。如果两个(或任意限制)或更多像素具有相同(或非常接近)的颜色,则它们构成一条线。

答案 2 :(得分:0)

绝对使用标记,否则这是一个难题。

要使用标记,您只需找到他们的位置即可。要做到这一点,从边缘开始,采用连续的单像素宽条带并查找周期性偏差。经典且相当简单的方法是使用自相关。由于您的标记非常清晰(即噪声非常小),您可能会找到一种更简单的方法,例如平均整个条带的像素值以及与此相差多少的所有内容都是标记;或者,制作一个像素值的直方图,它应该有两个尖锐的凸起,一个用于背景的大凸起,以及用于标记的小凹凸等。但无论你使用什么方法,找到标记,你就完成了。

答案 3 :(得分:0)

  1. 从角落像素(例如,左上角)
  2. 中查找背景颜色($ cBack)
  3. 从左上方移动循环foreach(范围(1,imagesx($ img_rsrc)),设置$ cCur.color = imagecolorat($ img_asset,$ x,$ y);
  4. $ iMarkWidth + = 1; $ iMarkPosStart = $ cCur.x;直到你点击不同颜色的像素($ cCur.color!= $ cBack.color),然后$ bMarkFound - true:else $ bMarkFound = false;
  5. 如果$ cCur.color == $ cBack.color,$ horizMarkArray [] = array($ iMarkPosStart,$ iMarkPosStart + $ iMarkWidth,$ iMarkWidth);
  6. 继续直到宽度结束
  7. 如果is_empty($ horizMarkArray)重复下一个水平行
  8. ..并通过11.使用$ vertMarkArray []
  9. 重复高度/垂直

    在步骤4& 8你可以做任何平均,噪音检测等。 在步骤7& 11您可以重复前面的步骤并平均$ iMarkWidth,以避免在行顶部出现锯齿错误。在这种情况下,你要停止:

    • 在N行之后,或
    • 在$ iMarkWidth>之后{显然比任何一条线宽的东西}

答案 4 :(得分:0)

您可以尝试进行边缘检测,然后使用Hough transform检测线条。在你的情况下的问题是与线对应的边缘非常微弱。另一方面,您只需要查找垂直和水平线,这样就可以对问题进行大量限制。