检测网格上的正方形大小

Detecting square size on a grid

我需要像这样检测网格上正方形的大小(所有正方形都应该相等): http://imgur.com/VZAimWS

我可以想出许多不同的策略来找出正方形的边长是多少,但我希望可能有一种特定的技术在提供更准确的方面更稳健或被认为更好回答。有小费吗?我正在探索的其中一件事是识别每条平行线并找到线之间的平均(或中值)距离。

如果相关,我打算为此使用 MatLab 或 OpenCV。

谢谢

那么我会尝试的是:

  1. 通过一个阈值,您将获得更好的方块边缘。
  2. 然后通过HoughLines algorithm
  3. 您会看到台词,请将配置调整到最佳性能,以便看到所有台词。
  4. 计算每条线与另一条线相交的点,您将得到每条线的顶点。
  5. 使用一点数学知识! :)

我看到您想在 Matlab 中执行此操作,但您可能会从我使用 ImageMagick 对其进行攻击中获得一些灵感,ImageMagick 安装在大多数 Linux 发行版上,可用于 OS X 和Windows 免费来自 here.

这是我如何进行的主要内容 - 它只是终端中的一个命令 - 没有编译器,没有 OpenCV,没有 Matlab:

convert grid.jpg                                   \
   -threshold 80% -negate                          \
   -morphology Thinning:-1 Skeleton                \
   \( +clone                                       \
         -background none                          \
         -fill red -stroke red -strokewidth 2      \
         -hough-lines 9x9+150 -write lines.mvg     \
   \)                                              \
   -composite hough.png

那个可爱的命令,执行这些步骤:

  • 将图像阈值设置为黑白 80%
  • 反转它
  • 瘦成骨架

  • 复制整个批次并在副本上执行霍夫线检测,将线条着色为红色

  • 将检测到的线条叠加到原始图像上

输出图像是这样的:

并且文件 lines.mvg 包含需要数学运算的线坐标...

# Hough line transform: 9x9+150
viewbox 0 0 1777 1449
line 177.944,0 102.005,1449  # 191   <-- shown in yellow below
line 171.848,0 121.248,1449  # 332
line 0,118.401 1777,149.419  # 453
line 0,143 1777,143  # 181
line 0,283.426 1777,314.444  # 431
line 504.586,0 479.293,1449  # 252
line 0,454.452 1777,485.47  # 403
line 0,481 1777,481  # 164
line 0,627.479 1777,658.496  # 309
line 0,649 1777,649  # 233
line 842.637,0 817.345,1449  # 299
line 0,801.505 1777,832.523  # 558
line 0,844.525 1777,813.507  # 167
line 0,973.531 1777,1004.55  # 291
line 0,1013.55 1777,982.533  # 158
line 1180.69,0 1155.4,1449  # 495
line 0,1146.56 1777,1177.58  # 396
line 0,1182.58 1777,1151.56  # 350
line 0,1331 1777,1331  # 320
line 1510.74,0 1485.45,1449  # 539
line 0,1352.6 1777,1321.58  # 277
line 1504,0 1504,1449  # 201

我会将上面列表中的第一行画在黄色的图像上,这样您就可以看到坐标是如何工作的。

convert hough.png -stroke yellow -draw "line 177.944,0 102.005,1449" out.jpg

现在,关于数学……很难在扭曲的图像上正确测量,因为它……好吧,扭曲了。我会考虑两种策略。要么取最上面的线并解决它与最左边的线的交点,其他 3 个角也是如此,然后您可以计算图像的两条对角线并估计失真并将其分摊到很多正方形上,这可能很好。或者,您可以求解所有线的交点并应用某种类型的聚类来消除多重定义的角点……或者更简单的方法。

我们只看垂直线...

grep -v "line 0" lines.mvg

line 177.944,0 102.005,1449  # 191
line 171.848,0 121.248,1449  # 332
line 504.586,0 479.293,1449  # 252
line 842.637,0 817.345,1449  # 299
line 1180.69,0 1155.4,1449  # 495
line 1510.74,0 1485.45,1449  # 539
line 1504,0 1504,1449  # 201

前两个是同一行,所以让我们平均 177 和 171 得到 174。最后两个也是同一行,所以如果我们平均 1510 和 1504,我们得到 1507。所以,现在网格间距是

330px = 504-174
338px = 842-504
338px = 1180-842
357px = 1507-1180

所以,我要 338px...大概 :-)