使用霍夫变换或其他图像处理算法检测不是直线

时间:2017-04-25 16:26:03

标签: python algorithm opencv numpy hough-transform

有没有办法检测不完全笔直的线?

由于使用了广角相机失真和质量差的预处理,我有一些表示矩形但略微不均匀的物体。此外,我必须预先进行透视变换,这是导致线条质量差的另一个因素。

使用canny过滤器检测到边缘后,我得到以下图像: Object with not straight edges hough transform

我试图用霍夫线算法找到边缘线。但是由于形状质量差而且凹凸不平,所以不可能找到倾斜的边缘。

我尝试了正常的hough line变换(红线)和Probabilistic Hough Line变换(绿线),但结果非常糟糕。

还有其他选择来检测类似的东西吗?或者有没有办法改善我的形象,所以我得到直线?线条的扭曲是可变的,因此很难修复。

这是另一个例子:

example 2 - edges example 2 - hough results

我使用python 3.4和opencv 3.2,numpy 1.12。 任何可能的解决方法的输入或提示都会很棒。

1 个答案:

答案 0 :(得分:3)

你的边缘非常清晰 - 绝对足够概率的Hough线变换。我想你只需要更多地使用免费参数。

import numpy as np
import matplotlib.pyplot as plt
from skimage.transform import probabilistic_hough_line
from skimage import draw

def restore_lines(distorted):
    lines = probabilistic_hough_line(distorted,
                                     threshold=2,
                                     line_length=20,
                                     line_gap=15)

    restored = np.zeros_like(distorted, dtype=np.uint8)
    for line in lines:
        p0, p1 = line
        rr, cc = draw.line(p0[1], p0[0], p1[1], p1[0])
        restored[rr, cc] += 1
    return restored


# distorted = plt.imread('backslash.png')
distorted = plt.imread('tick.png')

# imread returns non-grayscale image in this case
distorted = distorted[:,:,0]

# restore
restored = restore_lines(distorted)

fig, axes = plt.subplots(1,2)
axes[0].imshow(distorted, cmap='gray', interpolation='none')
axes[1].imshow(restored, cmap='gray', interpolation='none')
axes[0].set_title('Original')
axes[1].set_title('Restored')
for ax in axes:
    ax.set_xticks([])
    ax.set_yticks([])

enter image description here

enter image description here