检测网格上的方形大小

时间:2015-05-01 11:17:20

标签: image-processing

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

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

如果它是相关的,我打算使用MatLab或OpenCV。

谢谢

2 个答案:

答案 0 :(得分:5)

我认为你想在Matlab中做到这一点,但是你可能会从使用ImageMagick攻击它获得一些灵感,ImageMagick安装在大多数Linux发行版上,并且可以从here免费获得OS X和Windows。

这是我如何进行的骨头 - 它只是终端中的一个命令 - 没有编译器,没有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%
  • 颠倒它
  • 将它变成骨架

  • 复制整批并在副本上执行Hough Line检测,将线条涂成红色

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

输出图像如下:

enter image description here

文件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

enter image description here

现在,关于那些数学......在扭曲的图像上很难正确测量,因为它是......好吧,扭曲了。我会想到两个策略。取最上面的线并求解其与最左边的线的交点,并在其他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 ... ish: - )

答案 1 :(得分:1)

我想尝试的是:

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