如何检测 90 度或 180 度的倾斜度?

How to detect an inclination of 90 degrees or 180?

在我的项目中,我处理的图像我不知道它们是否倾斜。

我使用 C++ 和 OpenCV。我尝试用霍夫变换来确定倾斜角度:是90度还是180度。但是没有给出结果。

A link 例如 image (full resolution TIFF) here

下图是按比例缩小并转换为 PNG 的全分辨率图像:

这是一个相当简单的方法,可以帮助您入门,或提供您可以采纳的想法。我使用 ImageMagick,但概念和技术应该很容易适用于 OpenCV。

首先,我注意到图像旋转了几度,右上角出现了黑色三角形,所以我首先要考虑的是从图像中间裁剪掉 - 即移除大约 10-15%离开每一边。

接下来我要注意的是,图像扫描效果很差,有很多嘈杂、浑浊的灰色区域。我倾向于将它们模糊在一起,使它们变得更加统一并且可以被阈值化。

所以,如果我想在 ImageMagick 中做这两件事,我会这样做:

convert input.tif                     \
    -gravity center -crop 75x75%+0+0  \
    -blur x10 -threshold 50%          \
    -negate                           \
    stage1.jpg

现在,我可以计算 运行 图像整个宽度的水平黑线的数量(不与任何白色交叉)。我通过 squidging 图像直到它只有一个像素宽(但仍然是完整的原始高度)并计算黑行的数量来做到这一点:

convert stage1.jpg -resize 1x! -threshold 1 txt: | grep -c black
1368

我对垂直黑线执行相同的操作,运行 图像从上到下的整个高度,没有被白色打断。我通过 squidging 图像直到它是一个像素高和完整的原始宽度来做到这一点:

convert stage1.jpg -resize x1! -threshold 1 txt: | grep -c black
0

因此图像上有 1,368 条线,上下有 none 条线,所以我可以说原始图像中的暗线倾向于 运行 左右穿过图像,而不是从上到下上下图像。

如果我想用霍夫线法攻击你的图像,我会先做一个Canny边缘检测,然后找到霍夫线,然后查看生成的线。所以它在 ImageMagick 中看起来像这样 - 你可以转换为 OpenCV:

convert input.jpg \
   \( +clone -canny x10+10%+30%    \
      -background none -fill red   \
      -stroke red -strokewidth 2   \
      -hough-lines 9x9+150         \
      -write lines.mvg             \
   \)                              \
   -composite hough.png

并且在 lines.mvg 文件中,我可以看到检测到的各个行:

# Hough line transform: 9x9+150
viewbox 0 0 349 500
line 0,-3.74454 349,8.44281  # 160
line 0,55.2914 349,67.4788  # 206
line 1,0 1,500  # 193
line 0,71.3012 349,83.4885  # 169
line 0,125.334 349,137.521  # 202
line 0,142.344 349,154.532  # 156
line 0,152.351 349,164.538  # 155
line 0,205.383 349,217.57  # 162
line 0,239.453 349,245.545  # 172
line 0,252.455 349,258.547  # 152
line 0,293.461 349,299.553  # 163
line 0,314.464 349,320.556  # 169
line 0,335.468 349,341.559  # 189
line 0,351.47 349,357.562  # 196
line 0,404.478 349,410.57  # 209
line 349.39,0 340.662,500  # 187
line 0,441.484 349,447.576  # 198
line 0,446.484 349,452.576  # 165
line 0,455.486 349,461.578  # 174
line 0,475.489 349,481.581  # 193
line 0,498.5 349,498.5  # 161

我将您的图像调整为 349 像素宽(以使其适合 Stack Overflow 并加快处理速度),因此您可以看到图像左侧有很多从 0 开始到 349 结束的线条在右边告诉你他们穿过图像,而不是上下移动。此外,您还可以看到线条的右端通常比左端低 16 个像素,因此图像旋转了 tan inverse (16/349) 度。