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

Detect not straight lines with hough transform or other image processing algorithm

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

我有代表矩形的对象,但由于使用广角相机失真和质量差的预处理而略微不均匀。另外我必须事先做一个透视变换,这是另一个导致线条质量差的因素。

用canny滤镜检测边缘后,得到如下图:

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

我尝试了普通霍夫线变换(红线)和概率霍夫线变换(绿线),但结果很糟糕。

是否有任何其他选项可以检测类似的东西?或者有没有办法改善我的形象,让我得到直线?线条的变形是可变的,所以很难修复。

再举个例子:

我正在使用 python 3.4 和 opencv 3.2,numpy 1.12。 任何有关解决此问题的可能新方法的输入或提示都很棒。

你的边缘非常清晰——对于概率霍夫线变换来说绝对足够好。我认为你只需要多玩一下自由参数。

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([])