如何检测 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) 度。
在我的项目中,我处理的图像我不知道它们是否倾斜。
我使用 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) 度。