使用霍夫变换或其他图像处理算法检测不直线
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([])
有没有办法检测不完全笔直的线条?
我有代表矩形的对象,但由于使用广角相机失真和质量差的预处理而略微不均匀。另外我必须事先做一个透视变换,这是另一个导致线条质量差的因素。
用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([])