有没有办法检测不完全笔直的线?
由于使用了广角相机失真和质量差的预处理,我有一些表示矩形但略微不均匀的物体。此外,我必须预先进行透视变换,这是导致线条质量差的另一个因素。
我试图用霍夫线算法找到边缘线。但是由于形状质量差而且凹凸不平,所以不可能找到倾斜的边缘。
我尝试了正常的hough line变换(红线)和Probabilistic Hough Line变换(绿线),但结果非常糟糕。
还有其他选择来检测类似的东西吗?或者有没有办法改善我的形象,所以我得到直线?线条的扭曲是可变的,因此很难修复。
这是另一个例子:
我使用python 3.4和opencv 3.2,numpy 1.12。 任何可能的解决方法的输入或提示都会很棒。
答案 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([])