【问题标题】:How to detect an inclination of 90 degrees or 180?如何检测 90 度或 180 度的倾角?
【发布时间】:2015-04-16 18:49:31
【问题描述】:

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

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

示例 image (full resolution TIFF) here 的链接。

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

【问题讨论】:

  • 您的意思是“旋转”吗?我的猜测是您提供的图像上的角度不是 90 度。
  • 这是否提供了任何见解? stackoverflow.com/questions/1141928/…
  • 坚持霍夫变换并尝试修复它。也许这会给你一些想法:stackoverflow.com/questions/28525218/…
  • 您当然可以通过比较宽度和高度来判断您的图像是否旋转 +/-90 - 不是吗?那么你只需要检测它是否旋转了180...请说是否正确,然后我们可以解决这个问题。
  • 比较宽度和高度是一种解决方案,但是有些图像的宽度大于高度但它们不倾斜

标签: c++ opencv image-processing


【解决方案1】:

如果我想用霍夫线方法攻击你的图像,我会先做一个 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) 度。

【讨论】:

【解决方案2】:

这是一个相当简单的方法,可以帮助您入门,或者为您提供可以适应的想法。我使用 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 条线,上下都没有,所以我可以说原始图像中的暗线倾向于从左到右穿过图像,而不是在图像上下上下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2021-07-19
    • 2018-08-13
    • 2016-09-15
    • 2011-07-13
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多